From e183793a242a2e234c4a2d4783d3b2829a28d9e8 Mon Sep 17 00:00:00 2001 From: Adam Liwo Date: Thu, 10 Apr 2014 07:57:44 -0400 Subject: [PATCH] Added src_MD-M-newcorr (Adasko's source) and src-NEWSC of WHAM (with Momo's SCSC potentials) --- bin/unres/MD/unres_mchain-ifort_MPICH_GAB-NEWC.exe | Bin 6852147 -> 6852852 bytes .../MD/unres_mchain_ifort_MPICH_E0LL2Y-NEWC.exe | Bin 0 -> 6891893 bytes source/unres/src_MD-M-newcorr/BUGS | 6 + source/unres/src_MD-M-newcorr/CMakeLists.txt | 361 + source/unres/src_MD-M-newcorr/COMMON.BANK | 29 + source/unres/src_MD-M-newcorr/COMMON.BOUNDS | 2 + source/unres/src_MD-M-newcorr/COMMON.CACHE | 6 + source/unres/src_MD-M-newcorr/COMMON.CALC | 15 + source/unres/src_MD-M-newcorr/COMMON.CHAIN | 16 + source/unres/src_MD-M-newcorr/COMMON.CONTACTS | 84 + .../unres/src_MD-M-newcorr/COMMON.CONTACTS.moment | 68 + .../unres/src_MD-M-newcorr/COMMON.CONTACTS_safe1 | 82 + source/unres/src_MD-M-newcorr/COMMON.CONTROL | 13 + source/unres/src_MD-M-newcorr/COMMON.CSA | 11 + source/unres/src_MD-M-newcorr/COMMON.DBASE | 3 + source/unres/src_MD-M-newcorr/COMMON.DERIV | 35 + source/unres/src_MD-M-newcorr/COMMON.DERIV_safe | 35 + source/unres/src_MD-M-newcorr/COMMON.DISTFIT | 14 + source/unres/src_MD-M-newcorr/COMMON.FFIELD | 25 + source/unres/src_MD-M-newcorr/COMMON.GEO | 2 + source/unres/src_MD-M-newcorr/COMMON.HAIRPIN | 5 + source/unres/src_MD-M-newcorr/COMMON.HEADER | 2 + source/unres/src_MD-M-newcorr/COMMON.INFO | 21 + source/unres/src_MD-M-newcorr/COMMON.INTERACT | 31 + source/unres/src_MD-M-newcorr/COMMON.IOUNITS | 69 + source/unres/src_MD-M-newcorr/COMMON.LANGEVIN | 21 + .../unres/src_MD-M-newcorr/COMMON.LANGEVIN.lang0 | 11 + .../unres/src_MD-M-newcorr/COMMON.LANGEVIN.lang0_ | 11 + source/unres/src_MD-M-newcorr/COMMON.LOCAL | 61 + source/unres/src_MD-M-newcorr/COMMON.LOCMOVE | 19 + source/unres/src_MD-M-newcorr/COMMON.MAP | 4 + source/unres/src_MD-M-newcorr/COMMON.MAXGRAD | 12 + source/unres/src_MD-M-newcorr/COMMON.MCE | 13 + source/unres/src_MD-M-newcorr/COMMON.MCM | 70 + source/unres/src_MD-M-newcorr/COMMON.MD | 65 + source/unres/src_MD-M-newcorr/COMMON.MINIM | 5 + source/unres/src_MD-M-newcorr/COMMON.MUCA | 10 + source/unres/src_MD-M-newcorr/COMMON.NAMES | 8 + source/unres/src_MD-M-newcorr/COMMON.REMD | 33 + source/unres/src_MD-M-newcorr/COMMON.SBRIDGE | 12 + source/unres/src_MD-M-newcorr/COMMON.SCCOR | 18 + source/unres/src_MD-M-newcorr/COMMON.SCROT | 3 + source/unres/src_MD-M-newcorr/COMMON.SETUP | 21 + source/unres/src_MD-M-newcorr/COMMON.SPLITELE | 2 + source/unres/src_MD-M-newcorr/COMMON.THREAD | 7 + source/unres/src_MD-M-newcorr/COMMON.TIME1 | 28 + source/unres/src_MD-M-newcorr/COMMON.TORCNSTR | 6 + source/unres/src_MD-M-newcorr/COMMON.TORSION | 41 + source/unres/src_MD-M-newcorr/COMMON.VAR | 22 + source/unres/src_MD-M-newcorr/COMMON.VECTORS | 3 + source/unres/src_MD-M-newcorr/DIMENSIONS | 141 + source/unres/src_MD-M-newcorr/DIMENSIONS.2100 | 80 + source/unres/src_MD-M-newcorr/DIMENSIONS.4100 | 80 + source/unres/src_MD-M-newcorr/DIMENSIONS_safe1 | 135 + source/unres/src_MD-M-newcorr/MD.F | 2565 ++++++ source/unres/src_MD-M-newcorr/MD_A-MTS.F | 2446 ++++++ source/unres/src_MD-M-newcorr/MD_A-MTS.F_safe | 2327 +++++ source/unres/src_MD-M-newcorr/MD_A-MTS.F_safe1 | 2356 +++++ source/unres/src_MD-M-newcorr/MP.F | 518 ++ source/unres/src_MD-M-newcorr/MREMD.F | 1864 ++++ source/unres/src_MD-M-newcorr/MREMD.F.drabinka | 1199 +++ source/unres/src_MD-M-newcorr/MREMD.F.safe | 1756 ++++ source/unres/src_MD-M-newcorr/MREMD_nosy1traj.F | 910 ++ source/unres/src_MD-M-newcorr/Makefile | 1 + source/unres/src_MD-M-newcorr/Makefile-biosim | 127 + .../src_MD-M-newcorr/Makefile-intrepid-with-tau | 154 + .../unres/src_MD-M-newcorr/Makefile-matrix-intel | 124 + source/unres/src_MD-M-newcorr/Makefile-matrix3 | 141 + .../src_MD-M-newcorr/Makefile-matrix3-oldparm | 127 + source/unres/src_MD-M-newcorr/Makefile-oldparm | 130 + source/unres/src_MD-M-newcorr/Makefile-rstconv | 40 + source/unres/src_MD-M-newcorr/Makefile-tau-temp | 148 + .../src_MD-M-newcorr/Makefile.tau-mpi-f77-pdt | 860 ++ .../src_MD-M-newcorr/Makefile.tau-mpi-pdt-pgi.org | 836 ++ source/unres/src_MD-M-newcorr/Makefile_MPICH_ifort | 143 + source/unres/src_MD-M-newcorr/Makefile_aix_xlf | 112 + source/unres/src_MD-M-newcorr/Makefile_bigben | 138 + .../unres/src_MD-M-newcorr/Makefile_bigben-oldparm | 136 + source/unres/src_MD-M-newcorr/Makefile_bigben-tau | 137 + source/unres/src_MD-M-newcorr/Makefile_intrepid | 151 + source/unres/src_MD-M-newcorr/Makefile_jubl | 132 + source/unres/src_MD-M-newcorr/Makefile_jubl-debug | 141 + source/unres/src_MD-M-newcorr/Makefile_jubl-opt | 117 + .../src_MD-M-newcorr/Makefile_jubl-opt-oldparm | 116 + source/unres/src_MD-M-newcorr/Makefile_lnx_ifc | 104 + .../unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64 | 128 + .../Makefile_lnx_ifc10_em64_galera | 130 + .../Makefile_lnx_ifc10_em64_galera-oldparm | 131 + .../src_MD-M-newcorr/Makefile_lnx_ifc10_em64_mpi2 | 146 + source/unres/src_MD-M-newcorr/Makefile_lnx_ifc8 | 127 + source/unres/src_MD-M-newcorr/Makefile_lnx_pgf90 | 120 + source/unres/src_MD-M-newcorr/Makefile_osf_f90 | 79 + source/unres/src_MD-M-newcorr/Makefile_win_ifl | 53 + source/unres/src_MD-M-newcorr/Makefile_win_pgf90 | 43 + source/unres/src_MD-M-newcorr/README | 2 + source/unres/src_MD-M-newcorr/TAU | 6 + source/unres/src_MD-M-newcorr/TAU_setup.sh | 15 + source/unres/src_MD-M-newcorr/WVRND | 32 + source/unres/src_MD-M-newcorr/add.f | 28 + source/unres/src_MD-M-newcorr/arcos.f | 9 + source/unres/src_MD-M-newcorr/banach.f | 99 + source/unres/src_MD-M-newcorr/bank.F | 1084 +++ source/unres/src_MD-M-newcorr/big-sizes | 9 + source/unres/src_MD-M-newcorr/bigsymbols-lang0.txt | 7 + source/unres/src_MD-M-newcorr/blas.f | 575 ++ source/unres/src_MD-M-newcorr/bond_move.f | 124 + source/unres/src_MD-M-newcorr/brown_step.F | 395 + source/unres/src_MD-M-newcorr/cartder.F | 314 + source/unres/src_MD-M-newcorr/cartprint.f | 19 + source/unres/src_MD-M-newcorr/chainbuild.F | 274 + source/unres/src_MD-M-newcorr/change.awk | 11 + source/unres/src_MD-M-newcorr/check_bond.f | 20 + source/unres/src_MD-M-newcorr/check_sc_distr.f | 43 + source/unres/src_MD-M-newcorr/check_sc_map.f | 49 + source/unres/src_MD-M-newcorr/checkder_p.F | 700 ++ source/unres/src_MD-M-newcorr/common.size | 130 + source/unres/src_MD-M-newcorr/common.size.orig | 130 + source/unres/src_MD-M-newcorr/compare_s1.F | 188 + source/unres/src_MD-M-newcorr/compinfo.c | 82 + source/unres/src_MD-M-newcorr/contact.f | 195 + source/unres/src_MD-M-newcorr/convert.f | 196 + source/unres/src_MD-M-newcorr/cored.f | 3151 +++++++ source/unres/src_MD-M-newcorr/csa.f | 364 + source/unres/src_MD-M-newcorr/diff12.f | 27 + source/unres/src_MD-M-newcorr/dihed_cons.F | 185 + source/unres/src_MD-M-newcorr/distfit.f | 207 + source/unres/src_MD-M-newcorr/djacob.f | 107 + source/unres/src_MD-M-newcorr/econstr_local.F | 91 + source/unres/src_MD-M-newcorr/ecorr_num.f | 593 ++ source/unres/src_MD-M-newcorr/eelec.F | 278 + source/unres/src_MD-M-newcorr/eigen.f | 2351 +++++ source/unres/src_MD-M-newcorr/elecont.f | 511 ++ source/unres/src_MD-M-newcorr/energy_p_new-sep.F | 2505 ++++++ .../src_MD-M-newcorr/energy_p_new-sep_barrier.F | 2268 +++++ source/unres/src_MD-M-newcorr/energy_p_new.F | 8381 ++++++++++++++++++ .../unres/src_MD-M-newcorr/energy_p_new_barrier.F | 9245 ++++++++++++++++++++ .../src_MD-M-newcorr/energy_p_new_barrier.F.safe | 8916 +++++++++++++++++++ source/unres/src_MD-M-newcorr/energy_split-sep.F | 472 + source/unres/src_MD-M-newcorr/energy_split.F | 417 + source/unres/src_MD-M-newcorr/entmcm.F | 688 ++ source/unres/src_MD-M-newcorr/env.log | 97 + source/unres/src_MD-M-newcorr/fitsq.f | 364 + source/unres/src_MD-M-newcorr/gauss.f | 69 + source/unres/src_MD-M-newcorr/gen_rand_conf.F | 911 ++ source/unres/src_MD-M-newcorr/geomout.F | 488 ++ source/unres/src_MD-M-newcorr/gnmr1.f | 43 + source/unres/src_MD-M-newcorr/gradient_p.F | 418 + source/unres/src_MD-M-newcorr/indexx.f | 81 + source/unres/src_MD-M-newcorr/initialize_p.F | 1423 +++ source/unres/src_MD-M-newcorr/int_to_cart.f | 273 + source/unres/src_MD-M-newcorr/intcartderiv.F | 754 ++ source/unres/src_MD-M-newcorr/intcor.f | 91 + source/unres/src_MD-M-newcorr/intlocal.f | 517 ++ source/unres/src_MD-M-newcorr/kinetic_lesyng.f | 104 + source/unres/src_MD-M-newcorr/lagrangian_lesyng.F | 703 ++ source/unres/src_MD-M-newcorr/local_move.f | 972 ++ source/unres/src_MD-M-newcorr/make-tau.log | 1960 +++++ source/unres/src_MD-M-newcorr/map.f | 89 + source/unres/src_MD-M-newcorr/matmult.f | 18 + source/unres/src_MD-M-newcorr/mc.F | 819 ++ source/unres/src_MD-M-newcorr/mcm.F | 1481 ++++ source/unres/src_MD-M-newcorr/minim_jlee.F | 435 + source/unres/src_MD-M-newcorr/minim_mcmf.F | 119 + source/unres/src_MD-M-newcorr/minimize_p.F | 641 ++ source/unres/src_MD-M-newcorr/misc.f | 203 + source/unres/src_MD-M-newcorr/module.log | 11 + source/unres/src_MD-M-newcorr/moments.f | 328 + source/unres/src_MD-M-newcorr/muca_md.f | 334 + source/unres/src_MD-M-newcorr/newconf.f | 2454 ++++++ source/unres/src_MD-M-newcorr/objects.sizes | 168 + source/unres/src_MD-M-newcorr/parmread.F | 1373 +++ source/unres/src_MD-M-newcorr/pdtf5579.pdb | 1195 +++ source/unres/src_MD-M-newcorr/permut.F | 66 + source/unres/src_MD-M-newcorr/pinorm.f | 17 + source/unres/src_MD-M-newcorr/printmat.f | 16 + source/unres/src_MD-M-newcorr/prng.f | 525 ++ source/unres/src_MD-M-newcorr/prng_32.F | 1070 +++ source/unres/src_MD-M-newcorr/proc_proc.c | 140 + source/unres/src_MD-M-newcorr/q_measure.F | 491 ++ source/unres/src_MD-M-newcorr/q_measure1.F | 470 + source/unres/src_MD-M-newcorr/q_measure3.F | 529 ++ source/unres/src_MD-M-newcorr/ran.f | 128 + source/unres/src_MD-M-newcorr/randgens.f | 99 + .../src_MD-M-newcorr/random_multi_chain/cont.unr | 2 + .../random_multi_chain/ext_mono.pdb | 42 + .../random_multi_chain/ext_sing.pdb | 42 + .../src_MD-M-newcorr/random_multi_chain/fort.4 | 43 + .../src_MD-M-newcorr/random_multi_chain/output.pdb | 43 + .../src_MD-M-newcorr/random_multi_chain/random.f | 61 + .../src_MD-M-newcorr/random_multi_chain/toggle | Bin 0 -> 15794 bytes source/unres/src_MD-M-newcorr/rattle.F | 724 ++ source/unres/src_MD-M-newcorr/readpdb.F | 557 ++ source/unres/src_MD-M-newcorr/readpdb.f | Bin 0 -> 43512 bytes source/unres/src_MD-M-newcorr/readrtns_CSA.F | 2446 ++++++ source/unres/src_MD-M-newcorr/refsys.f | 68 + source/unres/src_MD-M-newcorr/regularize.F | 76 + source/unres/src_MD-M-newcorr/rescode.f | 32 + source/unres/src_MD-M-newcorr/restbin2asc.F | 482 + source/unres/src_MD-M-newcorr/rmdd.f | 159 + source/unres/src_MD-M-newcorr/rmsd.F | 172 + source/unres/src_MD-M-newcorr/sc_move.F | 821 ++ source/unres/src_MD-M-newcorr/select.tau | 81 + source/unres/src_MD-M-newcorr/shift.F | 105 + source/unres/src_MD-M-newcorr/sizes.i | 83 + source/unres/src_MD-M-newcorr/sort.f | 589 ++ source/unres/src_MD-M-newcorr/stochfric.F | 627 ++ source/unres/src_MD-M-newcorr/sumsld.f | 1446 +++ source/unres/src_MD-M-newcorr/surfatom.f | 494 ++ source/unres/src_MD-M-newcorr/symbols-lang0.txt | 257 + source/unres/src_MD-M-newcorr/symbolsizes.txt | 257 + source/unres/src_MD-M-newcorr/tau.options | 41 + source/unres/src_MD-M-newcorr/test.F | 2707 ++++++ source/unres/src_MD-M-newcorr/thread.F | 549 ++ source/unres/src_MD-M-newcorr/timing.F | 337 + source/unres/src_MD-M-newcorr/together.F | 1222 +++ source/unres/src_MD-M-newcorr/unres.F | 771 ++ source/unres/src_MD-M-newcorr/xdrf/CMakeLists.txt | 19 + source/unres/src_MD-M-newcorr/xdrf/Makefile | 27 + source/unres/src_MD-M-newcorr/xdrf/Makefile_jubl | 31 + source/unres/src_MD-M-newcorr/xdrf/Makefile_linux | 27 + source/unres/src_MD-M-newcorr/xdrf/RS6K.m4 | 20 + source/unres/src_MD-M-newcorr/xdrf/ftocstr.c | 35 + source/unres/src_MD-M-newcorr/xdrf/libxdrf.m4 | 1237 +++ source/unres/src_MD-M-newcorr/xdrf/underscore.m4 | 19 + source/unres/src_MD-M-newcorr/xdrf/xdrf.h | 10 + source/wham/src-NEWSC/CMakeLists.txt | 298 + source/wham/src-NEWSC/COMMON.ALLPARM | 99 + source/wham/src-NEWSC/COMMON.CHAIN | 8 + source/wham/src-NEWSC/COMMON.COMPAR | 39 + source/wham/src-NEWSC/COMMON.CONTACTS1 | 5 + source/wham/src-NEWSC/COMMON.CONTROL | 10 + source/wham/src-NEWSC/COMMON.CONTROL.org | 9 + source/wham/src-NEWSC/COMMON.EMP | 126 + source/wham/src-NEWSC/COMMON.ENEPS | 3 + source/wham/src-NEWSC/COMMON.ENERGIES | 4 + source/wham/src-NEWSC/COMMON.FREE | 15 + source/wham/src-NEWSC/COMMON.IOUNITS | 51 + source/wham/src-NEWSC/COMMON.MPI | 8 + source/wham/src-NEWSC/COMMON.OBCINKA | 3 + source/wham/src-NEWSC/COMMON.PEPTCONT | 7 + source/wham/src-NEWSC/COMMON.PROT | 2 + source/wham/src-NEWSC/COMMON.PROTFILES | 10 + source/wham/src-NEWSC/COMMON.VAR | 17 + source/wham/src-NEWSC/DIMENSIONS | 142 + source/wham/src-NEWSC/DIMENSIONS.COMPAR | 25 + source/wham/src-NEWSC/DIMENSIONS.FREE | 14 + source/wham/src-NEWSC/DIMENSIONS.FREE.old | 12 + source/wham/src-NEWSC/DIMENSIONS.ZSCOPT | 40 + source/wham/src-NEWSC/Makefile | 89 + source/wham/src-NEWSC/Makefile-pgi | 74 + source/wham/src-NEWSC/Makefile1_jump | 60 + source/wham/src-NEWSC/Makefile_MPICH_ifort | 89 + source/wham/src-NEWSC/Makefile_jubl | 95 + source/wham/src-NEWSC/Makefile_jump | 69 + source/wham/src-NEWSC/Makefile_matrix | 67 + source/wham/src-NEWSC/Makefile_matrix_PGI | 76 + .../wham/src-NEWSC/Makefile_matrix_PGI-SCT-oldparm | 76 + .../src-NEWSC/Makefile_matrix_PGI-SCTF-oldparm | 76 + source/wham/src-NEWSC/Makefile_matrix_PGI-oldparm | 76 + source/wham/src-NEWSC/a.sh | 9 + source/wham/src-NEWSC/angnorm.f | 439 + source/wham/src-NEWSC/arcos.f | 9 + source/wham/src-NEWSC/bxread.F | 89 + source/wham/src-NEWSC/cartder.f | 306 + source/wham/src-NEWSC/cartprint.f | 20 + source/wham/src-NEWSC/chainbuild.F | 281 + source/wham/src-NEWSC/chainbuild.f | 258 + source/wham/src-NEWSC/compinfo.c | 82 + source/wham/src-NEWSC/conf_compar.F | 374 + source/wham/src-NEWSC/cont_frag.f | 99 + source/wham/src-NEWSC/contact.f | 171 + source/wham/src-NEWSC/contfunc.f | 96 + source/wham/src-NEWSC/cxread.F | 336 + source/wham/src-NEWSC/cxread.F.org | 248 + source/wham/src-NEWSC/define_pairs.f | 120 + source/wham/src-NEWSC/elecont.f | 207 + source/wham/src-NEWSC/enecalc1.F | 780 ++ source/wham/src-NEWSC/energy_p_new.F | 9193 +++++++++++++++++++ source/wham/src-NEWSC/energy_p_new.F.org | 6452 ++++++++++++++ source/wham/src-NEWSC/fitsq.f | 352 + source/wham/src-NEWSC/geomout.F | 167 + source/wham/src-NEWSC/gnmr1.f | 43 + source/wham/src-NEWSC/icant.f | 9 + source/wham/src-NEWSC/include_unres/COMMON.CALC | 15 + .../wham/src-NEWSC/include_unres/COMMON.CONTACTS | 68 + source/wham/src-NEWSC/include_unres/COMMON.CONTPAR | 3 + source/wham/src-NEWSC/include_unres/COMMON.DERIV | 30 + source/wham/src-NEWSC/include_unres/COMMON.FFIELD | 29 + source/wham/src-NEWSC/include_unres/COMMON.FRAG | 5 + source/wham/src-NEWSC/include_unres/COMMON.GEO | 2 + source/wham/src-NEWSC/include_unres/COMMON.HEADER | 2 + .../wham/src-NEWSC/include_unres/COMMON.INTERACT | 38 + source/wham/src-NEWSC/include_unres/COMMON.LOCAL | 36 + source/wham/src-NEWSC/include_unres/COMMON.MINIM | 3 + source/wham/src-NEWSC/include_unres/COMMON.NAMES | 7 + source/wham/src-NEWSC/include_unres/COMMON.SBRIDGE | 10 + source/wham/src-NEWSC/include_unres/COMMON.SCCOR | 18 + source/wham/src-NEWSC/include_unres/COMMON.SCROT | 3 + source/wham/src-NEWSC/include_unres/COMMON.TIME1 | 13 + .../wham/src-NEWSC/include_unres/COMMON.TORCNSTR | 5 + source/wham/src-NEWSC/include_unres/COMMON.TORSION | 25 + source/wham/src-NEWSC/include_unres/COMMON.VAR | 21 + source/wham/src-NEWSC/include_unres/COMMON.VECTORS | 3 + source/wham/src-NEWSC/include_unres/COMMON.WEIGHTS | 22 + source/wham/src-NEWSC/initialize_p.F | 577 ++ source/wham/src-NEWSC/initialize_p.F.org | 571 ++ source/wham/src-NEWSC/int_from_cart.f | 66 + source/wham/src-NEWSC/intcor.f | 94 + source/wham/src-NEWSC/make_ensemble1.F | 375 + source/wham/src-NEWSC/match_contact.f | 339 + source/wham/src-NEWSC/matmult.f | 18 + source/wham/src-NEWSC/misc.f | 203 + source/wham/src-NEWSC/molread_zs.F | 378 + source/wham/src-NEWSC/mygetenv.F | 55 + source/wham/src-NEWSC/mysort.f | 52 + source/wham/src-NEWSC/odlodc.f | 55 + source/wham/src-NEWSC/openunits.F | 105 + source/wham/src-NEWSC/parmread.F | 1108 +++ source/wham/src-NEWSC/pinorm.f | 17 + source/wham/src-NEWSC/printmat.f | 16 + source/wham/src-NEWSC/proc_cont.f | 156 + source/wham/src-NEWSC/proc_proc.c | 124 + source/wham/src-NEWSC/promienie.f | 46 + source/wham/src-NEWSC/qwolynes.f | 186 + source/wham/src-NEWSC/read_ref_str.F | 165 + source/wham/src-NEWSC/readpdb.f | 219 + source/wham/src-NEWSC/readrtns.F | 779 ++ source/wham/src-NEWSC/readrtns.F.org | 691 ++ source/wham/src-NEWSC/readrtns_compar.F | 160 + source/wham/src-NEWSC/rescode.f | 32 + source/wham/src-NEWSC/rmscalc.f | 156 + source/wham/src-NEWSC/secondary.f | 713 ++ source/wham/src-NEWSC/setup_var.f | 31 + source/wham/src-NEWSC/slices.F | 80 + source/wham/src-NEWSC/store_parm.F | 547 ++ source/wham/src-NEWSC/timing.F | 163 + source/wham/src-NEWSC/wham_calc1.F | 1454 +++ source/wham/src-NEWSC/wham_calc1.F.safe | 1195 +++ source/wham/src-NEWSC/wham_multparm.F | 277 + source/wham/src-NEWSC/xdrf/Makefile | 27 + source/wham/src-NEWSC/xdrf/ftocstr.c | 35 + source/wham/src-NEWSC/xdrf/libxdrf.m4 | 1233 +++ source/wham/src-NEWSC/xdrf/libxdrf.m4.org | 1230 +++ source/wham/src-NEWSC/xdrf/underscore.m4 | 19 + source/wham/src-NEWSC/xdrf/xdrf.h | 10 + source/wham/src-NEWSC/xread.F | 187 + 346 files changed, 143867 insertions(+) create mode 100755 bin/unres/MD/unres_mchain_ifort_MPICH_E0LL2Y-NEWC.exe create mode 100644 source/unres/src_MD-M-newcorr/BUGS create mode 100644 source/unres/src_MD-M-newcorr/CMakeLists.txt create mode 100644 source/unres/src_MD-M-newcorr/COMMON.BANK create mode 100644 source/unres/src_MD-M-newcorr/COMMON.BOUNDS create mode 100644 source/unres/src_MD-M-newcorr/COMMON.CACHE create mode 100644 source/unres/src_MD-M-newcorr/COMMON.CALC create mode 100644 source/unres/src_MD-M-newcorr/COMMON.CHAIN create mode 100644 source/unres/src_MD-M-newcorr/COMMON.CONTACTS create mode 100644 source/unres/src_MD-M-newcorr/COMMON.CONTACTS.moment create mode 100644 source/unres/src_MD-M-newcorr/COMMON.CONTACTS_safe1 create mode 100644 source/unres/src_MD-M-newcorr/COMMON.CONTROL create mode 100644 source/unres/src_MD-M-newcorr/COMMON.CSA create mode 100644 source/unres/src_MD-M-newcorr/COMMON.DBASE create mode 100644 source/unres/src_MD-M-newcorr/COMMON.DERIV create mode 100644 source/unres/src_MD-M-newcorr/COMMON.DERIV_safe create mode 100644 source/unres/src_MD-M-newcorr/COMMON.DISTFIT create mode 100644 source/unres/src_MD-M-newcorr/COMMON.FFIELD create mode 100644 source/unres/src_MD-M-newcorr/COMMON.GEO create mode 100644 source/unres/src_MD-M-newcorr/COMMON.HAIRPIN create mode 100644 source/unres/src_MD-M-newcorr/COMMON.HEADER create mode 100644 source/unres/src_MD-M-newcorr/COMMON.INFO create mode 100644 source/unres/src_MD-M-newcorr/COMMON.INTERACT create mode 100644 source/unres/src_MD-M-newcorr/COMMON.IOUNITS create mode 100644 source/unres/src_MD-M-newcorr/COMMON.LANGEVIN create mode 100644 source/unres/src_MD-M-newcorr/COMMON.LANGEVIN.lang0 create mode 100644 source/unres/src_MD-M-newcorr/COMMON.LANGEVIN.lang0_ create mode 100644 source/unres/src_MD-M-newcorr/COMMON.LOCAL create mode 100644 source/unres/src_MD-M-newcorr/COMMON.LOCMOVE create mode 100644 source/unres/src_MD-M-newcorr/COMMON.MAP create mode 100644 source/unres/src_MD-M-newcorr/COMMON.MAXGRAD create mode 100644 source/unres/src_MD-M-newcorr/COMMON.MCE create mode 100644 source/unres/src_MD-M-newcorr/COMMON.MCM create mode 100644 source/unres/src_MD-M-newcorr/COMMON.MD create mode 100644 source/unres/src_MD-M-newcorr/COMMON.MINIM create mode 100644 source/unres/src_MD-M-newcorr/COMMON.MUCA create mode 100644 source/unres/src_MD-M-newcorr/COMMON.NAMES create mode 100644 source/unres/src_MD-M-newcorr/COMMON.REMD create mode 100644 source/unres/src_MD-M-newcorr/COMMON.SBRIDGE create mode 100644 source/unres/src_MD-M-newcorr/COMMON.SCCOR create mode 100644 source/unres/src_MD-M-newcorr/COMMON.SCROT create mode 100644 source/unres/src_MD-M-newcorr/COMMON.SETUP create mode 100644 source/unres/src_MD-M-newcorr/COMMON.SPLITELE create mode 100644 source/unres/src_MD-M-newcorr/COMMON.THREAD create mode 100644 source/unres/src_MD-M-newcorr/COMMON.TIME1 create mode 100644 source/unres/src_MD-M-newcorr/COMMON.TORCNSTR create mode 100644 source/unres/src_MD-M-newcorr/COMMON.TORSION create mode 100644 source/unres/src_MD-M-newcorr/COMMON.VAR create mode 100644 source/unres/src_MD-M-newcorr/COMMON.VECTORS create mode 100644 source/unres/src_MD-M-newcorr/DIMENSIONS create mode 100644 source/unres/src_MD-M-newcorr/DIMENSIONS.2100 create mode 100644 source/unres/src_MD-M-newcorr/DIMENSIONS.4100 create mode 100644 source/unres/src_MD-M-newcorr/DIMENSIONS_safe1 create mode 100644 source/unres/src_MD-M-newcorr/MD.F create mode 100644 source/unres/src_MD-M-newcorr/MD_A-MTS.F create mode 100644 source/unres/src_MD-M-newcorr/MD_A-MTS.F_safe create mode 100644 source/unres/src_MD-M-newcorr/MD_A-MTS.F_safe1 create mode 100644 source/unres/src_MD-M-newcorr/MP.F create mode 100644 source/unres/src_MD-M-newcorr/MREMD.F create mode 100644 source/unres/src_MD-M-newcorr/MREMD.F.drabinka create mode 100644 source/unres/src_MD-M-newcorr/MREMD.F.safe create mode 100644 source/unres/src_MD-M-newcorr/MREMD_nosy1traj.F create mode 120000 source/unres/src_MD-M-newcorr/Makefile create mode 100644 source/unres/src_MD-M-newcorr/Makefile-biosim create mode 100644 source/unres/src_MD-M-newcorr/Makefile-intrepid-with-tau create mode 100644 source/unres/src_MD-M-newcorr/Makefile-matrix-intel create mode 100644 source/unres/src_MD-M-newcorr/Makefile-matrix3 create mode 100644 source/unres/src_MD-M-newcorr/Makefile-matrix3-oldparm create mode 100644 source/unres/src_MD-M-newcorr/Makefile-oldparm create mode 100644 source/unres/src_MD-M-newcorr/Makefile-rstconv create mode 100644 source/unres/src_MD-M-newcorr/Makefile-tau-temp create mode 100644 source/unres/src_MD-M-newcorr/Makefile.tau-mpi-f77-pdt create mode 100755 source/unres/src_MD-M-newcorr/Makefile.tau-mpi-pdt-pgi.org create mode 100644 source/unres/src_MD-M-newcorr/Makefile_MPICH_ifort create mode 100644 source/unres/src_MD-M-newcorr/Makefile_aix_xlf create mode 100644 source/unres/src_MD-M-newcorr/Makefile_bigben create mode 100644 source/unres/src_MD-M-newcorr/Makefile_bigben-oldparm create mode 100644 source/unres/src_MD-M-newcorr/Makefile_bigben-tau create mode 100644 source/unres/src_MD-M-newcorr/Makefile_intrepid create mode 100644 source/unres/src_MD-M-newcorr/Makefile_jubl create mode 100644 source/unres/src_MD-M-newcorr/Makefile_jubl-debug create mode 100644 source/unres/src_MD-M-newcorr/Makefile_jubl-opt create mode 100644 source/unres/src_MD-M-newcorr/Makefile_jubl-opt-oldparm create mode 100644 source/unres/src_MD-M-newcorr/Makefile_lnx_ifc create mode 100644 source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64 create mode 100644 source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_galera create mode 100644 source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_galera-oldparm create mode 100644 source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_mpi2 create mode 100644 source/unres/src_MD-M-newcorr/Makefile_lnx_ifc8 create mode 100644 source/unres/src_MD-M-newcorr/Makefile_lnx_pgf90 create mode 100644 source/unres/src_MD-M-newcorr/Makefile_osf_f90 create mode 100644 source/unres/src_MD-M-newcorr/Makefile_win_ifl create mode 100644 source/unres/src_MD-M-newcorr/Makefile_win_pgf90 create mode 100644 source/unres/src_MD-M-newcorr/README create mode 100644 source/unres/src_MD-M-newcorr/TAU create mode 100755 source/unres/src_MD-M-newcorr/TAU_setup.sh create mode 100644 source/unres/src_MD-M-newcorr/WVRND create mode 100644 source/unres/src_MD-M-newcorr/add.f create mode 100644 source/unres/src_MD-M-newcorr/arcos.f create mode 100644 source/unres/src_MD-M-newcorr/banach.f create mode 100644 source/unres/src_MD-M-newcorr/bank.F create mode 100644 source/unres/src_MD-M-newcorr/big-sizes create mode 100644 source/unres/src_MD-M-newcorr/bigsymbols-lang0.txt create mode 100644 source/unres/src_MD-M-newcorr/blas.f create mode 100644 source/unres/src_MD-M-newcorr/bond_move.f create mode 100644 source/unres/src_MD-M-newcorr/brown_step.F create mode 100644 source/unres/src_MD-M-newcorr/cartder.F create mode 100644 source/unres/src_MD-M-newcorr/cartprint.f create mode 100644 source/unres/src_MD-M-newcorr/chainbuild.F create mode 100644 source/unres/src_MD-M-newcorr/change.awk create mode 100644 source/unres/src_MD-M-newcorr/check_bond.f create mode 100644 source/unres/src_MD-M-newcorr/check_sc_distr.f create mode 100644 source/unres/src_MD-M-newcorr/check_sc_map.f create mode 100644 source/unres/src_MD-M-newcorr/checkder_p.F create mode 100644 source/unres/src_MD-M-newcorr/common.size create mode 100644 source/unres/src_MD-M-newcorr/common.size.orig create mode 100644 source/unres/src_MD-M-newcorr/compare_s1.F create mode 100644 source/unres/src_MD-M-newcorr/compinfo.c create mode 100644 source/unres/src_MD-M-newcorr/contact.f create mode 100644 source/unres/src_MD-M-newcorr/convert.f create mode 100644 source/unres/src_MD-M-newcorr/cored.f create mode 100644 source/unres/src_MD-M-newcorr/csa.f create mode 100644 source/unres/src_MD-M-newcorr/diff12.f create mode 100644 source/unres/src_MD-M-newcorr/dihed_cons.F create mode 100644 source/unres/src_MD-M-newcorr/distfit.f create mode 100644 source/unres/src_MD-M-newcorr/djacob.f create mode 100644 source/unres/src_MD-M-newcorr/econstr_local.F create mode 100644 source/unres/src_MD-M-newcorr/ecorr_num.f create mode 100644 source/unres/src_MD-M-newcorr/eelec.F create mode 100644 source/unres/src_MD-M-newcorr/eigen.f create mode 100644 source/unres/src_MD-M-newcorr/elecont.f create mode 100644 source/unres/src_MD-M-newcorr/energy_p_new-sep.F create mode 100644 source/unres/src_MD-M-newcorr/energy_p_new-sep_barrier.F create mode 100644 source/unres/src_MD-M-newcorr/energy_p_new.F create mode 100644 source/unres/src_MD-M-newcorr/energy_p_new_barrier.F create mode 100644 source/unres/src_MD-M-newcorr/energy_p_new_barrier.F.safe create mode 100644 source/unres/src_MD-M-newcorr/energy_split-sep.F create mode 100644 source/unres/src_MD-M-newcorr/energy_split.F create mode 100644 source/unres/src_MD-M-newcorr/entmcm.F create mode 100644 source/unres/src_MD-M-newcorr/env.log create mode 100644 source/unres/src_MD-M-newcorr/fitsq.f create mode 100644 source/unres/src_MD-M-newcorr/gauss.f create mode 100644 source/unres/src_MD-M-newcorr/gen_rand_conf.F create mode 100644 source/unres/src_MD-M-newcorr/geomout.F create mode 100644 source/unres/src_MD-M-newcorr/gnmr1.f create mode 100644 source/unres/src_MD-M-newcorr/gradient_p.F create mode 100644 source/unres/src_MD-M-newcorr/indexx.f create mode 100644 source/unres/src_MD-M-newcorr/initialize_p.F create mode 100644 source/unres/src_MD-M-newcorr/int_to_cart.f create mode 100644 source/unres/src_MD-M-newcorr/intcartderiv.F create mode 100644 source/unres/src_MD-M-newcorr/intcor.f create mode 100644 source/unres/src_MD-M-newcorr/intlocal.f create mode 100644 source/unres/src_MD-M-newcorr/kinetic_lesyng.f create mode 100644 source/unres/src_MD-M-newcorr/lagrangian_lesyng.F create mode 100644 source/unres/src_MD-M-newcorr/local_move.f create mode 100644 source/unres/src_MD-M-newcorr/make-tau.log create mode 100644 source/unres/src_MD-M-newcorr/map.f create mode 100644 source/unres/src_MD-M-newcorr/matmult.f create mode 100644 source/unres/src_MD-M-newcorr/mc.F create mode 100644 source/unres/src_MD-M-newcorr/mcm.F create mode 100644 source/unres/src_MD-M-newcorr/minim_jlee.F create mode 100644 source/unres/src_MD-M-newcorr/minim_mcmf.F create mode 100644 source/unres/src_MD-M-newcorr/minimize_p.F create mode 100644 source/unres/src_MD-M-newcorr/misc.f create mode 100644 source/unres/src_MD-M-newcorr/module.log create mode 100644 source/unres/src_MD-M-newcorr/moments.f create mode 100644 source/unres/src_MD-M-newcorr/muca_md.f create mode 100644 source/unres/src_MD-M-newcorr/newconf.f create mode 100644 source/unres/src_MD-M-newcorr/objects.sizes create mode 100644 source/unres/src_MD-M-newcorr/parmread.F create mode 100644 source/unres/src_MD-M-newcorr/pdtf5579.pdb create mode 100644 source/unres/src_MD-M-newcorr/permut.F create mode 100644 source/unres/src_MD-M-newcorr/pinorm.f create mode 100644 source/unres/src_MD-M-newcorr/printmat.f create mode 100644 source/unres/src_MD-M-newcorr/prng.f create mode 100644 source/unres/src_MD-M-newcorr/prng_32.F create mode 100644 source/unres/src_MD-M-newcorr/proc_proc.c create mode 100644 source/unres/src_MD-M-newcorr/q_measure.F create mode 100644 source/unres/src_MD-M-newcorr/q_measure1.F create mode 100644 source/unres/src_MD-M-newcorr/q_measure3.F create mode 100644 source/unres/src_MD-M-newcorr/ran.f create mode 100644 source/unres/src_MD-M-newcorr/randgens.f create mode 100644 source/unres/src_MD-M-newcorr/random_multi_chain/cont.unr create mode 100644 source/unres/src_MD-M-newcorr/random_multi_chain/ext_mono.pdb create mode 100644 source/unres/src_MD-M-newcorr/random_multi_chain/ext_sing.pdb create mode 100644 source/unres/src_MD-M-newcorr/random_multi_chain/fort.4 create mode 100644 source/unres/src_MD-M-newcorr/random_multi_chain/output.pdb create mode 100644 source/unres/src_MD-M-newcorr/random_multi_chain/random.f create mode 100755 source/unres/src_MD-M-newcorr/random_multi_chain/toggle create mode 100644 source/unres/src_MD-M-newcorr/rattle.F create mode 100644 source/unres/src_MD-M-newcorr/readpdb.F create mode 100644 source/unres/src_MD-M-newcorr/readpdb.f create mode 100644 source/unres/src_MD-M-newcorr/readrtns_CSA.F create mode 100644 source/unres/src_MD-M-newcorr/refsys.f create mode 100644 source/unres/src_MD-M-newcorr/regularize.F create mode 100644 source/unres/src_MD-M-newcorr/rescode.f create mode 100644 source/unres/src_MD-M-newcorr/restbin2asc.F create mode 100644 source/unres/src_MD-M-newcorr/rmdd.f create mode 100644 source/unres/src_MD-M-newcorr/rmsd.F create mode 100644 source/unres/src_MD-M-newcorr/sc_move.F create mode 100644 source/unres/src_MD-M-newcorr/select.tau create mode 100644 source/unres/src_MD-M-newcorr/shift.F create mode 100644 source/unres/src_MD-M-newcorr/sizes.i create mode 100644 source/unres/src_MD-M-newcorr/sort.f create mode 100644 source/unres/src_MD-M-newcorr/stochfric.F create mode 100644 source/unres/src_MD-M-newcorr/sumsld.f create mode 100644 source/unres/src_MD-M-newcorr/surfatom.f create mode 100644 source/unres/src_MD-M-newcorr/symbols-lang0.txt create mode 100644 source/unres/src_MD-M-newcorr/symbolsizes.txt create mode 100644 source/unres/src_MD-M-newcorr/tau.options create mode 100644 source/unres/src_MD-M-newcorr/test.F create mode 100644 source/unres/src_MD-M-newcorr/thread.F create mode 100644 source/unres/src_MD-M-newcorr/timing.F create mode 100644 source/unres/src_MD-M-newcorr/together.F create mode 100644 source/unres/src_MD-M-newcorr/unres.F create mode 100644 source/unres/src_MD-M-newcorr/xdrf/CMakeLists.txt create mode 100644 source/unres/src_MD-M-newcorr/xdrf/Makefile create mode 100644 source/unres/src_MD-M-newcorr/xdrf/Makefile_jubl create mode 100644 source/unres/src_MD-M-newcorr/xdrf/Makefile_linux create mode 100644 source/unres/src_MD-M-newcorr/xdrf/RS6K.m4 create mode 100644 source/unres/src_MD-M-newcorr/xdrf/ftocstr.c create mode 100644 source/unres/src_MD-M-newcorr/xdrf/libxdrf.m4 create mode 100644 source/unres/src_MD-M-newcorr/xdrf/underscore.m4 create mode 100644 source/unres/src_MD-M-newcorr/xdrf/xdrf.h create mode 100755 source/wham/src-NEWSC/CMakeLists.txt create mode 100755 source/wham/src-NEWSC/COMMON.ALLPARM create mode 100755 source/wham/src-NEWSC/COMMON.CHAIN create mode 100755 source/wham/src-NEWSC/COMMON.COMPAR create mode 100755 source/wham/src-NEWSC/COMMON.CONTACTS1 create mode 100755 source/wham/src-NEWSC/COMMON.CONTROL create mode 100755 source/wham/src-NEWSC/COMMON.CONTROL.org create mode 100755 source/wham/src-NEWSC/COMMON.EMP create mode 100755 source/wham/src-NEWSC/COMMON.ENEPS create mode 100755 source/wham/src-NEWSC/COMMON.ENERGIES create mode 100755 source/wham/src-NEWSC/COMMON.FREE create mode 100755 source/wham/src-NEWSC/COMMON.IOUNITS create mode 100755 source/wham/src-NEWSC/COMMON.MPI create mode 100755 source/wham/src-NEWSC/COMMON.OBCINKA create mode 100755 source/wham/src-NEWSC/COMMON.PEPTCONT create mode 100755 source/wham/src-NEWSC/COMMON.PROT create mode 100755 source/wham/src-NEWSC/COMMON.PROTFILES create mode 100755 source/wham/src-NEWSC/COMMON.VAR create mode 100755 source/wham/src-NEWSC/DIMENSIONS create mode 100755 source/wham/src-NEWSC/DIMENSIONS.COMPAR create mode 100755 source/wham/src-NEWSC/DIMENSIONS.FREE create mode 100755 source/wham/src-NEWSC/DIMENSIONS.FREE.old create mode 100755 source/wham/src-NEWSC/DIMENSIONS.ZSCOPT create mode 100755 source/wham/src-NEWSC/Makefile create mode 100755 source/wham/src-NEWSC/Makefile-pgi create mode 100755 source/wham/src-NEWSC/Makefile1_jump create mode 100755 source/wham/src-NEWSC/Makefile_MPICH_ifort create mode 100755 source/wham/src-NEWSC/Makefile_jubl create mode 100755 source/wham/src-NEWSC/Makefile_jump create mode 100755 source/wham/src-NEWSC/Makefile_matrix create mode 100755 source/wham/src-NEWSC/Makefile_matrix_PGI create mode 100755 source/wham/src-NEWSC/Makefile_matrix_PGI-SCT-oldparm create mode 100755 source/wham/src-NEWSC/Makefile_matrix_PGI-SCTF-oldparm create mode 100755 source/wham/src-NEWSC/Makefile_matrix_PGI-oldparm create mode 100755 source/wham/src-NEWSC/a.sh create mode 100755 source/wham/src-NEWSC/angnorm.f create mode 100755 source/wham/src-NEWSC/arcos.f create mode 100755 source/wham/src-NEWSC/bxread.F create mode 100755 source/wham/src-NEWSC/cartder.f create mode 100755 source/wham/src-NEWSC/cartprint.f create mode 100755 source/wham/src-NEWSC/chainbuild.F create mode 100755 source/wham/src-NEWSC/chainbuild.f create mode 100755 source/wham/src-NEWSC/compinfo.c create mode 100755 source/wham/src-NEWSC/conf_compar.F create mode 100755 source/wham/src-NEWSC/cont_frag.f create mode 100755 source/wham/src-NEWSC/contact.f create mode 100755 source/wham/src-NEWSC/contfunc.f create mode 100755 source/wham/src-NEWSC/cxread.F create mode 100755 source/wham/src-NEWSC/cxread.F.org create mode 100755 source/wham/src-NEWSC/define_pairs.f create mode 100755 source/wham/src-NEWSC/elecont.f create mode 100755 source/wham/src-NEWSC/enecalc1.F create mode 100755 source/wham/src-NEWSC/energy_p_new.F create mode 100755 source/wham/src-NEWSC/energy_p_new.F.org create mode 100755 source/wham/src-NEWSC/fitsq.f create mode 100755 source/wham/src-NEWSC/geomout.F create mode 100755 source/wham/src-NEWSC/gnmr1.f create mode 100755 source/wham/src-NEWSC/icant.f create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.CALC create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.CONTACTS create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.CONTPAR create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.DERIV create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.FFIELD create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.FRAG create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.GEO create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.HEADER create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.INTERACT create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.LOCAL create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.MINIM create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.NAMES create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.SBRIDGE create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.SCCOR create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.SCROT create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.TIME1 create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.TORCNSTR create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.TORSION create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.VAR create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.VECTORS create mode 100755 source/wham/src-NEWSC/include_unres/COMMON.WEIGHTS create mode 100755 source/wham/src-NEWSC/initialize_p.F create mode 100755 source/wham/src-NEWSC/initialize_p.F.org create mode 100755 source/wham/src-NEWSC/int_from_cart.f create mode 100755 source/wham/src-NEWSC/intcor.f create mode 100755 source/wham/src-NEWSC/make_ensemble1.F create mode 100755 source/wham/src-NEWSC/match_contact.f create mode 100755 source/wham/src-NEWSC/matmult.f create mode 100755 source/wham/src-NEWSC/misc.f create mode 100755 source/wham/src-NEWSC/molread_zs.F create mode 100755 source/wham/src-NEWSC/mygetenv.F create mode 100755 source/wham/src-NEWSC/mysort.f create mode 100755 source/wham/src-NEWSC/odlodc.f create mode 100755 source/wham/src-NEWSC/openunits.F create mode 100755 source/wham/src-NEWSC/parmread.F create mode 100755 source/wham/src-NEWSC/pinorm.f create mode 100755 source/wham/src-NEWSC/printmat.f create mode 100755 source/wham/src-NEWSC/proc_cont.f create mode 100755 source/wham/src-NEWSC/proc_proc.c create mode 100755 source/wham/src-NEWSC/promienie.f create mode 100755 source/wham/src-NEWSC/qwolynes.f create mode 100755 source/wham/src-NEWSC/read_ref_str.F create mode 100755 source/wham/src-NEWSC/readpdb.f create mode 100755 source/wham/src-NEWSC/readrtns.F create mode 100755 source/wham/src-NEWSC/readrtns.F.org create mode 100755 source/wham/src-NEWSC/readrtns_compar.F create mode 100755 source/wham/src-NEWSC/rescode.f create mode 100755 source/wham/src-NEWSC/rmscalc.f create mode 100755 source/wham/src-NEWSC/secondary.f create mode 100755 source/wham/src-NEWSC/setup_var.f create mode 100755 source/wham/src-NEWSC/slices.F create mode 100755 source/wham/src-NEWSC/store_parm.F create mode 100755 source/wham/src-NEWSC/timing.F create mode 100755 source/wham/src-NEWSC/wham_calc1.F create mode 100755 source/wham/src-NEWSC/wham_calc1.F.safe create mode 100755 source/wham/src-NEWSC/wham_multparm.F create mode 100644 source/wham/src-NEWSC/xdrf/Makefile create mode 100644 source/wham/src-NEWSC/xdrf/ftocstr.c create mode 100644 source/wham/src-NEWSC/xdrf/libxdrf.m4 create mode 100644 source/wham/src-NEWSC/xdrf/libxdrf.m4.org create mode 100644 source/wham/src-NEWSC/xdrf/underscore.m4 create mode 100644 source/wham/src-NEWSC/xdrf/xdrf.h create mode 100755 source/wham/src-NEWSC/xread.F diff --git a/bin/unres/MD/unres_mchain-ifort_MPICH_GAB-NEWC.exe b/bin/unres/MD/unres_mchain-ifort_MPICH_GAB-NEWC.exe index 18c2578d5213604a12c6ebd21ad6b09e552ce70a..62c918e785508e2042440276bb2388efb6f16ece 100755 GIT binary patch delta 742615 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 Cjti&& delta 742957 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 z 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

?+699}(D{Jc_}|_X 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

1?{K>RQV-pV!Yo+z{@vjkmD>b?<<>4a3}wt z3DtJ`4Y(Y$ zd==UW=i2xa$YZ#Hd@Rbe74jbVEJ`Efzd@eGiJCFUcd^`z*Lb*~@yriI4>As=gU52L zbmJc;Q73hNe<+8jd@NUCpr+-M?A5z>1COC9#wDi-HnDOM)k*p*kiPKbaFf#CPZbtW zli)jnt8w!Ea+u3fU>xHYfsgfR)Z1RtK&6b!wp#5{9kdeYdpjUcVX8>OYWssVa_UPo z^d5kGKdP17dNY=|cAq)$_hJMe5ADnYDWhj^!ykF>c)c9yPO|Y#VaR;#+nx)bvNl zt7qta&(whm{(^jTcXhNKA^4v11kS!!A9bAH`ILJ_>%%_ld>!d56{rA=~eFb^L*y2g{Psj_-*r{>Q1DamhN-mbgoP3_BO% zemmxA?@P!p9;+kb1LzgsL4Fwyj5rjATlLcnL)(hil>8+*DNls4+|BNTJ<8*tb{qvx zWIP$T@RcqEth;AWso+`0IDhH%Y@G+Mh4y@^5WK|TuAcYbRR-iS(B46{f*&=Qm%FVu zn-x?H+D}lU;5U(X%()o+aOMFh4DWLid@S(Wk7|FmUl^D`^^8l-6>P=}zF{Tlmm+=k<)krGt$)0G zD10*Ghk$RtS4aKZkQ*No#klN4!Mrajzgp{1-CFsVP@DCD2ABQJLNnx5_|}Zpkaeg| za`X4sx-G{|{^`iA8#M{;3H;4})aoa|Q3{;GcmnVwJT|);_zWr)JOg+NUaC6+crH~4 zz8*N9I_8z0xa^}5mXR#T(k7l0GXw2^Z#{vP=zvY);LPB|g+E#!+% z*3rhg_ji^{?^}Th8*cU5Qj*ODd;Uvt=G)@F@-M0pd>muxE7Rs^qYXt>PNjOmmjmZs z&=9dV5O`n^Tm$USpRJYXqJM6u@TrU+vDn!l_5_s+ejWJBYcy{k7DDe*72~okz=eKe zjn!(u8vmZ2n8lF9ts?KLL2Q( z;IULHcp78LbdxjnUQ88&=RrGllg>ZcfU4g_wSpf7ZtpDQ`SpFl8-Z`^t$Ck`@$Ww`w|4xl8P3l3x~Rmo$Uwp~S(QH|i! zfpZwa^4Dusl2k8vwixGb+~CuNyIolG&S=KIn<;!6r>cdK%win|pTh|;4^g?`oEYJ# z+l6nQU@_!*=aphEGD4g79mqRVljIgQxUJW1 zL<~Ux987`J86OGl&{SO@#^J^>R4Vv1;Pk#4hW6#Yv#3gp&jrpq>+xHtR^v#$ta73$yz&V14^fWewa^naFOP3ta~XpJ8Jj$#KbSoI z`|1dE6g3Mz1zAj8t#kY1yQ})?6h4D-656p}b?uPF@Ws0v1z!Q}^e7$v6Uh5&s``Jr zy1I}kqA2W+tOb_q?pCBGZMIoa*y{eZ^ND!Tkto`+Lm+Gjkh9Mz8CbC_&darll> zCe}1loq|9%Fr5Ik8n#enry}-OOj_jHUyNCT&IIy&f3Do*x5ou z=#G*F52M`NKP|KXNnNt)a8if642DWXTInFxwNfqiCTJx#Cz$F;u;a5@%ft_AeS|Uz#8@P9-^5pH4*dV2jc$Jx?+G{1sY&JHJBZ zm@^TwfYNjhNhZX2n%?fh$WuBexm_aojB+KUGPDty2rU(38S1m+{5Y8~#=R)6jnk*& z;%rPdOBjf-^|~e(O1>)G)a11o)#OqbTi86Q$)?i`Vp0ornex0m_H?KCsT-aA<)K$jH w3P*(-?}#S+7z4mnW-p93Z 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
s2s6gB% z*_MxsXj4LBy>a{Z=Dz_4ji9@Ev!Yn7DT#jkbH-F>NzWP51(`%Za0(o&&?ua#h`R&10>yrV*A z(UB)5NHK-Iiv(AIKxWZ-j*RWs4QtXu{rmgFV;d(zJ^Nq6%CxOeQ^O{RRr_(nTR4go zSQbQX!X*WFCmP{Cst>ZkVJmVxxmBTa)gUBLif?@^SQ0Jz>S=O#-^=@PJYl2;FAPoh z0fOOjN{MwO?r93={0^~rFCD-!dSUkn+97tahT&ebmk^yLJfa^H*YpT9eXkIQxN}KA z=b+2Oy!JD!7kx%PHymnh1Ks`?BhztG?tu=5IKDyvW>WR6mnpc_+LYfK=_J%GX5F7QUGl17l)_FuD%BHI7(m|(-uf!ogyw~Nb}e?ZUi+P^bcz4J<~ zr{YiaqCu=6(jBfy*^AFLNZF4amX)7xkOr^~fJlO&#d;-SrZ_M`@J~pPyhxoOmb+C% z`d69FT0BzrVq{H`QY6S0`PD>Pm4FoHf`{;0b!R-o^rG;z4{KWY%Z2p8NS=%^qS_h% zB;0hv#i0$k`?Lznpnz^=8VZpHx}9_dbOQc$&poI)7s(%m0rI2F;sqDh*8i3hY=Q&UE=q!0rPG7O$))l{*_TK1 z#?6Y1m6?Viw2?%SXt8EN3EdSy!GyoO#+1`9HXWpr@5VQte5$01NnCQVCzZ@$>?;vF zp|to>NewXq!ZA%dlq#7^f>$mwOygAY{a^T1NiD(da==EYq{dYxy)l*aA=teTC{T&K zhDyfvB&r0hv7fyaD>BPl@sMeeS<3XjHrKXgDh@G*1mJ#FY!qJm{nn-Y=Wg4fS zHH&n>z(I#99$g6e8;c2y9jot0plg+yn|jQB#<7sDXn0_7c$e4 zvGu`CuV?RnF6>_`Kash#g2%x2k{AY)MpjaFZF-cO`D2PtDa-$kS|U6H)o z`2by86_Vf0?WKK8AK7u`=9|SkOmaW~s;Jkm+ z+OyA=Bb%2VA;U_U+WS5x=tv~ULsMvwv3E{A1baU~jC+9L&EAJdaD!zUXYYBp`c**o zr?p`|&VZp~z&lEdHk;X6oS>Zr(eK2UNG;TXrZ81x=84;z@Y1dtkO=Pt=DdV{MSGn@ zmRVghqbrlUI$=!u_?hB*i5gNQOzg@PH?|?`XUM65S-Ii@E68N6SUbm)PlAtuAi-Pt z9Kb6g%%9J zC&=ATYqf$H*9%8awM38v#g=JUWveTEZvC;gRz=okg^dJLjoDTa?62op4RY03*sgYL zvF*}G_Bf0cw&BtCbn`;`M0DUxJ4*Yxyb1XT>Y zy8{trq_uaGjiundJ&1xEFrpS8!cSVV;x1nBZm;%&Xvf zh_t!nV8Q+QKEHzNBiJnt*a*SpTfy}k!RgFPsIg##;3Qsj_>n}5L#HV6dQ6JT>+#^Y zU!R@UC=*3=eAQnVdlK2<)4)`F7DN-tSd zs~iH&%1q#+PA`A3pz6ru(93Yk5?86+5M^O)gGUIk&EIot9Tg}L*UIvuN7NU#zF zQUV|*E>ttOJ)xzA(MCuodqfAq*E~uknVe^sjO>coo_o6P?Hs}k7Bj8vk^1a!GuKr_ zdcYOQ*QobgBF(W#>@R3v%gR!^$sGMIg)+*yQq=_kOcw$1?l5H|6U(N~e@(|P2u(=Aw2P+H7+*xZF z9PXKFjzVbfK;}5NA7~yNkR;lLBz5?L1lQ{i_o%OxP8PB&#)|fOg|7J3MG+*j>kQ2C z9b3?#SHj^Zrs`qnAq9|&5QqLOcQDofd(UmJDp!t{w@#s$bVijIH3f5YZAo}-R8nGg z2`t&HFPCi6#U|#4$q=crXj5ZyJteMT43V_qgTn&Nx8Y!a%zxjU*dVTfbtG9g_5Oj= zv)*m2!}#B*z|segmge-QMo`y+diwf4+2_5jao|70!?+|DYS*cAO!#804BqvR!+4{! z`U5+FBw}=R_nBG2>QC=^;Z-^HL~}TAlV)w+i<-5No-5A@gF$3VTlkTRieTiM*+8zv zE7?JUi3Jg+EQ`kvx3g>1knY+KG{2Px^RTNuxCGVgR|{_x5G;|O5RBX_h6mUoyb*G& z&}cz$COR0AZ&k%@U*XD-^2qmeEl5bs2y*U3WHe&C@Dpf01}wuRAACJg)OA`ACFxkq zqKkg)%thSttU7!fguoysi57kQaIAUJQ$DaDD%Mo#t|wTeRbEElI#sv**MlM_rh)Dz z%drU`hC~h6dMBulAwH+Nu-+yPwZ)>!%jmrltK_^9*=Vz%EkMHVQLFEmijl=Oe9Jms zvmw!=dgi zI!SOrjOifo59nGf37Iu25_Dr~d#pW#`SUEDUX2v)c0e6`u| zgROMp7$TR+?25Qj8aF#pjXML)4d~CzKWtb_x_k1tp`e%CW?ODnw9FamH zKf)WvyFiH_eQ^Dmo;0_YNw}}b5u(VP_US`&`v`L-U_5AUkg-1zW9naX2Z-_7C%tNJ zhy-0AFeO4852Cr2<$g7n{Tc0eR6AfSGvRx6=o70Lp@Z0fgFJQTlBDNF)J@?=ZQ_{r z3&-f#=#l;WS}57P2sGc0eH-DD56@5Z_xTD2gXn+<)QeMG{Cy|BjisZMXwet4ygAAO zru4g~j<5+SSRQOb3sw;^E&_%(M_EXMF)^mJ32`A3^5`h15ay{*SiZ>%G|ONy3GM|! zoTCh{)0Gyu;aj|>S&}AxGV)FFmA!Z?0M$aF`9&<_UMyKkS?);1YfXB&1k9=tkJj* z8aWqnnSnhCrgDij1Ut$BGaZGyWwmR#tb}x zNG`#=ilmoF`7tC%B;RlHYexM9+j8ku)WUM4q|_NK&{%MbangFvoU;dGeFE zX_-UOZEXYcohzTwJ&;llA0P=1G>_pB>odYB@8+o>GpDP`uW8|`88 z&_3+$lW4kWuu75jFo!#i30CK<>P08YbSlRPqixzz)s`Z+BV;|2Bjr#eGFSG*(>=B< zz$ptkH-H)!Vq=F9yrnLvZ&Li$DR>3J)!->^L47Sh*5N16wDv0Wbj&FeW(mD+=qL~W zQph3~p^Gi)-v82!$VH=Ogc{{q(V5jfmqqe)$ve7CLE#dajDFU%NwXpodS-@RFWdC` z5oMcpABn!52ys?q{1^-bh-7C)7JfoH`yB{RpV|{x_VjEdK>J6i0VFcIdXh_wP)K}T z%HM~8S;}7_%&^RM-k|m|=k?YX$r6C2lge>k1w>eh??_WWD9R%1imtpw*7Qg5gf;!b zb7rKaYT6}O(%+NyGg;Cv32Pn1hpBx?;gH5y73kl6I#xg5-;ajk%*g6M|A&h3_{#x( zTodTiuWO@tEQ_oR^x-S)W)P2;Mb;cq@WHuwTw8^NToGAzM8SQZ0&S!QkAY>kTq*s^ zr>;+IXGBpbrmvq2j|#O8q7k8bkL!dF;oaWyU!fCjckrNhDG{T8xlqQrr7hF2QT}J$ zatknmi5T63TI%qj0v`qi2zM|G`Op_flAnuMMI*?EEO{|L>?66viLM_(j#2jCUL^+* zXi@^pAHV~gznI|%+8LA3Vb~ah-i`#_s{u9{@=CSwcf-fDhWx+~r09%gk)Q+wrdk%m zBwq;`z7kBucLHJlHQw@7f)soUNU#wEhOgKl`AW#}m0&8q(+G2`!&eDX@GU06C5CU{ z(PJOIyhd8RQ@|N$kVN@L?H02rK79U@6w|z)G{OOSICU z@`HJFLG>tfuEPfF@U8A^I&2`(qTBv+CQ7%srck6dZk(cmV3AgN8GZX$8O;#S5{lHt z#j3Qi+#-_d(AG9n*S|v{O7RK)z5x>^P z@5cvIWF$`X62>1G5x>sHkK%(VBN8Witi+FO?7{f~Sgf~m{;6?8X^)Ahx!d9$=%$SJ;-7Sa>r#4MObn@}G6{`d;7Nm`%WsH3|V#gI1wqnIl4AW%A zMKQXFv3Z>{>G)o#Jr_au%|sF@dg-^tfl43Op1RVAqe?SY;XbDG<^oSD zj57Ach@G(t^QNnt9X`&h3bRP?EC>!og%b$#J%?{P6&8@-YRi|C8yI<(#sYL!iNYp2 z>n=t_nOB#(A1#3@ypIiNV;iaz%7GP$YD2~K{uOa2=ll~7nHIweCiIsd^`yfYjC}`U zXRN~-VoVi|+L=sO4Cj#Gs2Ed`J{^vPJQl-x!fZL#@=d41g(Ua^2qd%NMsen`*)>ek z$%|CGl+^9C5$1AN7@b;Em=tq;b}V!ikw!U4QU}Engw0O!B2|LyDyuFc{cfzyT0D|2 zJ5;0;Y0|81AWW?TQ#>+3@*;JDjE^MJsjf&WBt=S*AnQDL5NX#jHfur{Zk7Cm*H+*^ zTI|w-R=HueQ3~Xx;jt$lwATh5gogdE1gqaIpZA2c-mi#^KjPBRic?mfi&lDumEI5& z_ZcLPW1^KvklSpuigzz#k1<&RQz7!X;;1i6)U9=eFI==yf+sg;}ia9Qluxl&{F}YlfwE6*CzMcq+AR zjQxLzopBwxff&aLM^ANR7YY9UVTY-dH{W&S4#NBdFyx!A)b^6#Cd)U>vA(eC8qFOU zX23{EFEk%EJM(yqg}8mLo{*vPwWWv`Xg(3`ZbwNnwIJ>>d-0cK>{Nnot?aT;-}Lo^ zOvW2Wr`Hf-M;UuPVkc-w<`u*}ng)e>%7O6*ZI+w9jx(HD7prUihA>T|BoYjf@AMeo zkxJ5`c$K*;U-q2x$@l#{n^`4r=}%}SlFQiJ5nD5h9=GU3hT_NGqT-h4TpU-Ki%|;% z-G$sceSIO3?sSm2;}V4#eT!Ua%ob@33{V!~jV+duR{0)1;rk=X^V&adHgaI>p1{;%8ddTM7r$3{DAF|3)J5Hvo8H{}rVkcOplm%L*T1Ya> zRE5_NW9L!n&63^RIV5-p1cvEIvz#jhFu7T>30F^;YKLz!v$QR>g(Nt~@*U|rWW@3y z-%*K|^c@8Vsqd&l;1GPrN+#psBhzaLzGDSr-;US`8uIBoRukr2Vd}|utRg{9jPFP# zdGZ|_2-BTwGn-6FYD#Muy9Ke0?-22;@5sBEt{TtAcgUxtzGFL)KIG=rV+649Y6bw_zo%k zIFYs$4;cTxEYWuifINxsc%w$rSp#aGuXl*;jsq0hm?NyRDy0rg<~s%%`>%(OuuMO` zW9$sA(tZMrbY@B4kxPP`VoXPxr6=DpkuaZh_$D(;>pKcb@NSM{nbN02O`_u~7-kXc z8rkls#Y_5*LWIzS1*Pny$C}r&FHqrFyY^3>UcT^JQ{p|EgV!NY) z1W$q>iG%m#J8B4Xr|{LKSjm*6zN3nO17w_znps^&NFYI?6%f z@fbMP%leLbjRD^gOz<7@J^J${Bg&-u4$(WTMUzy`|7JDP-(_>S@s zu<#u>OcmcDr60cI8a#wcnm?Q9JC=bwiSKxLuB5Xb)D3!c#Uc8RP73XX!>qDW`i_;1 z{R_lSsMY-VjviuE3&%878hyta5}Xrbnvw75C(N6pEZ<~iX?@3b68s(nrdCVz9sOz> zBl;{&cuC(;gpm4<76cB#ckE*_CP})rI3?E*e8*nK&asKk(062Cq7J@0%L+@Ik}g$> z?c^LF-v|f}#dnM)-_Hu)^u8mHu?sBIxZSh|YSed#I*jj-U{c>Pfk@Bdd`jv%B3eVc zqr&=*i5dgGqcXvF$oJ@1Zy!-6)psZYRv`#bbwtbot0`iA7X6G zXg&=~D;?$d8KYQ9_7_Wf)0g)ZjD4(4Y=-51HDR8`-ima}VOwDp3EDw$DCKC5{X#xAlq0 zNSTMSKY_8wnS8+frIz;HPnbrS=ZCzO{mCTwDF_aw?3WYfTH%|%?9X8AiI!=c`sbbP zOZ{_*^!k3Qekr4|(&lNt7KL^JVSeNai-Q);l)Uy2OqG8v5z(R z$i@k&dgb5N!ZY&$ z2MBYID~xv^kbS9EZ50ko#y%jANQb*3`SJl{iL~JzE1}GMz<9#k;tJ!-2TUN+rwmfO z57>UXFXc}r(ra(WXDvwj5Uol)5@XUZ-`$~=_)8H_#7U+@KbNs5TBdPj|K1{B>R&{p*Wa@0&#de(Bg~InVZ4|96@;1X zz+_zZR}$$cS0rC$e-)8>{$(YUS=nDrnA==oe3kt*L^{hL#h3k>Q++9aE0O;8PiD=u z^Z_WNc}eR3!|Z~vcI|O^Xa|8o0QNG~l4G~bJTL3VAz1VNW^zM^>t zDfG0X5YODj8E&saIZ<#W1ry|jLbL&sVF}#_p->s(WO`v(IFAQ zUw_ti;^&G;`4Oeqw$qDn+3-^^!8U{f%~$iXN>Myl4NAz%dYUN|&^`Z1Z#(EQ6*Klc z#7?jspL60t!hBqqrZFE5Wt5WO?L7|Pk>=xRUaOKY4*|wQeO1BOi!4(dMlOnwd96Y* z0^F~RXERnM!K7nVHAFfmhNP+&q@Q8u6_DgP7sqE~WsU^hkgQ495$tbKYtm{Au%li( z&|R-FU^smV1KsjHy7-2JEcFgtrjt=yr;RE3KcvJ%Tc?Gw&#>vvaIB+~Fn@o;tL=1< zU@Zs^rLD7$FgFR`^lhCk#xAu?<8BmP^tm{V>sqX28rR{sULw8wcdPE06@GvVUL7k` z+ev1H)^_>{_Mihs--1(UtnCbF4A@Rjg6+un=tVklnNV$Aj8kDUvYjEOzO1fP!a&B%7@2=ngiHnW1_ zo>@%u)iQQ3Vw?7kqw&e*zWh!Tkrv00#MHF*d-U=+EA-@d+6Z>G1IFWvaj2HHoeqrw z+i6L#9r+%8>biq$=V_U!!&wuOBy6+SANsN|uP$ilDaBFkn&c3pHEb@`lMfr@3^kJ2 zrWHwaZ@o09uu5471I-V~9xdmZ^mW>DjHp1X+og4g*dOqywzRkuw6G78fcY z%WEz}Qn_%w+i5WF|B}tpo~LkV8M^_P9nKpkv%~BYEFUh=j*(cm?>@m+O8l__Yc|Qt z2+U?3W8a0?31!4jpI{d;W(vnN1%#_Y`baQ7#&l!>@wB3BA7Ng2)$&bNKx`!#CBZ5X zm@<;kCs^B~t@G^s^*S3I`BE-+>*YfSGaGxL)LMivZ(JZhk;PE`#zK7)DZ)>nx#So% zOnn!QXsqyB`J@-7N3JOakr+yyyh86{TVo4CoOf=omzSZ9P542}@FPIVWC|+(GOgvd zzLH+`Xwv60_74#|LG?bX)KX zV(bSI+o)couTJet$7*4dXVavYpj$&+tJYE?T^B>DwMYYF6-k~=lU{;uNY)}N2=);J zmg!t}6=9y<#oQ&rcpuNIAXA()CJz7#H!Fpecm(z%W zaq%*CV*E&qM%3VWu}ram7Fkpa7z)Js5^eCyCpTZB zUTKg>PxhPS$64jKiPQpeV@ncrL$Y2e>vF9}78$TaccSY@Du9rB{Rk?Ue8QBt!g%*e z1%&z6U#w+k?3D_Mw8|C9msctx(zOm!F$5CxlwQ43F=38zh4JN;rV#1LKRf!bMT*pt zK6|t;O9~R{ju?`diz4;r#rZdF{>!ISmQ+cwa|~Em&x9J`m83!R|GihLWy;!Kum!bJ zvf{EzR=bilj6EN*52dYCPnc7Lsi(G59SPpq;qcAKE42{jVZeCsN==M?yJZ^ZOMY-v zoCT;?N@fA-l{$ztDTd@&eEA+@DZ#UmvoFH-w$^a%$DbGs{yFRv6O(jgWNhAisZ{XH4*7l2Pre})Iyk7pRrkshwLk+T zF(k*5_KosuN$Uvq!FI>M>m*s>R`pJLbRACt+W(@xn=e1Su>x^$zlJ(8+(fzQHFWUq zmsGGn7n!^>xasdl?te8{JzPHTkK(Ful{pqQY{8_mQps(*dW%Lry;e_d+3?o#srSp6 z6oxq^4LE>O5ChF$(qY%e0{IkfEz}>5kJ)iijD!w17RiUHk$m~VwMhEI*c?p@G(W8) ztJ)DY8H^n$5mhE@2lQuSKYq|x`-9auGewct%JMO9?cGSA(N-*-RTqkn0xwP_Mz9EExe@vbi3E zDaep?du2_4#B11u6JcAGgx5(7Z<*R&k1ruT7)q`K+4Bv#4x|b1_LMxVjB11uJ0bNa zQimVz001Kl$OTzH!a-<|7k~IAHFpRSbS)jS=!Qo-&#*pDNQ%Hchx<*eRhGS_1LmY&= z|HV+N=sYrg6fC#{A#>@ZoQFH4C1YNc1&d2sA}cS{v$aCH^)fiGUy33Qx{WNoP>%b- zc>54QW<{1w$OCWn-h^3^H52>vI9$Essywn`oH#Jt z+oO|1ku~FV04lKTJEw~ctvxEyhIUw!h+^7FhA`bsVi4cVMJf_4y6C5Jl&EMG zmukjNmhRp~ut=-Cj6SeQ4QB`xm@>D(-McNvEJQLFsYsmYt%#4~hZVIm4t1|Zm6y>9 zqUItTkGjvI=Ho*VE&;%~x)LW^sHkm<+JzT(Uh05Fm6y@?do-;D2+LtFHd6LXX)nY2 z3-O_ts1hgol*Dh?*a29M&`HSbVw9l!&;a)YO;FJ2aZlJLt`fL*z|ra}VC+4Qn@X`k zFRbN?CoylsRDy0ywKqDA821B%?OToQ!qFb;RZN0~F{bsvXHF$##v&!?#?%g{%_htl z4qqj3o1*5kRYWky=pK?O6y+2gva5FZC&%QKu_$z!U-B0R+_ zu|`3m#A1AyMkPv|XpY3sP>D@U>F1GB4lHztEL^gt3RuM06KuXRQDO%%2DW%r;tCS{ z8U&_uB;xn2#C3$JarmZF;%X9{XZeOB;@aTDrQV1su?H$pC2mE0C{doF#M+HgbA9;m zL^rh^agtPZZ>a3}^*NWNci_@*<6u_QRv@^!8sR)gT( zS!Qo?A*8^)$wdfhdm|JnMlg1;TA+E0TnW}b1#iP8e;b{s_le*YYA=evirBVo;9hX9 zJC19YuduXRKNqKMnfC7hqFF#HK{wB)W1=&dpR0S)s~VF5(-^x5u@h7+v(2J(<4e^g z4*!I#78Sio}t^z zZq87*E6DcSV4KdbL$}KqyWA$y`gNbWT}7B2VXEU#Y78ziwg*?NB*Bi2ho;*#goyyg zgKk$d_H~wNoNhmZwxtim&(hlAH-Pb=+XH0UV4240 z_AJ>a?!DZOCExQMB&*xp1l_gG* z48qJ5rk->=jRfOkd^6JRY{I;--ey)%k~Tie8T%KAt(lF}?MbKl((PO#ebGU(y3I<^ zZKc)i0>p=I`&$}Y&V5}mgNRUNZL8M#$nLVzhQ=8P2odLCQ1dy(q&f*s?yVdjsHSMJ66UD~y2pof~Zek`~o>E#~T zEWOwU`z7R>@wjM2mJu1ZwpNsKO+?r>}2AuL&8wbVgj&EDhWa zWXR)?*ECIMbi!|Kg(b8}E39J1e)kdT60D>>?5}e?n;4G(BVE;unE)AjBEgav(|Tnp zIhBydA+H65xxnEov~D@IV`Nn%IMVXvOb<*+I>+I>eBQL#_~bUdNKJagi>HMn{rDJ) z6u< zg|SaW?1WaA^u0yHUWPK)5aXpTuX^ny!Gj<$Of%B!cEWtw;hRpcJtR2W@=eey<_u)! z#0+|rBJUjZSci}q^avt|t8~nZK=V)0s}Hx!bGT&iokTa#4_=}6DKTq^jdEe50|!0i zE400&6xudhGX^AyVglp8oVf`cU_Q%!?a2fN8T$mp&e#OTeokHeUw-A)1ae9600<7n z1SS&ZI)`sM6DTCXnU?QJ6A%>#t0(6NWsgMTyKv*ZM%~zs(<2{4?S1$OG+!gLm3E}s z&rns6NqG2|>9vDab}3`uj@Sv>@j0APNtknmsi$sH1qpIud_}arySz1o>0WI!n@mC4 zim77k7R1)fnypo`2xdWnid(c{hN>i(bf~J1NS}=%NjcUA^S_Q$BzZQA{UqpyWb1<_ zg1z^!O;$uq0OMX=^5cwqwV*ibxK|6}qmL!eD9NAy5=ye!J&EaPA!)$2FkIX!LAiN= zTktXOj2D6CU&LKI&?cP49UM)NppalYKYp;bKpuE;x4u`XQhA9TVE73%U-w^eO;`OZ z(KW3EXp$z)xsB2enJ|K&BMHIu_5EyzJT^6RXSG4H*b`m(khPEwB;BocRtxE3?3)lf zp*Z-duXYgQbm5q$EU+EYOM>?vbeN7T3%W&2P1|+YR_YHNsY{qg07Je?;4;=_?QVbs zODx|6XQl0s0n}L14vFH|wnHQwiWJ6bp6(&VK|4fVMmPVTv_mA8v_k|Tq))MSNY>|# z)!l=rj*s)%z8o(gxG$sAlV0-~`-g~~v0f(=Zi#%cQ!?T{|$#I!@Iq&Vxru>A;`c1R6^+w^#Ic@bzn565nV+iUSQTvGFo z#KK+)URb{pvxfL~$PkJzCST+$RQ29@(6(uZR7n!W@vOKea}!v^d~SNclL^!^_T7k` zu?ego#w_9J$po56aAJ&UMkcVDFn_t<@=a#~9VB=F1g<6^DmErCAVD>OC_=^r1`#}j zHb^hoe^Sz`Ge{l4b9cIEgY+==d#grh#%CL(pD>RACY^FPUDii}B{9AumE&pHJxZ7h zgm3!kvH`}91~+Y z(%L-L@^cBZ{il|%ptuz+tJz8t{0Ic;T)~iN%l(+}D4HsXL-0Cy*anJJW9K>qU&j=T zGbu=f@jkp-PnhRBm=PYLZ%1kMzQCq5sj=hlO+;#PMe;Sg+CroY9i%!WA(keuBl&HF z+5Z!pwRjj`!>b)c`lUfaq0EvMwbI2|FK2Z%cs_c(i%8Wmq<%FIAWbEbJbQF6Jp}ux z&7kX8Z7x!3rv;9T`J4{;nD}XdBb{jhSx~9d0=^I6{?C*5+l(3B+k_c zmz?)nVuNW1K$G;23hI*`M&^^vPDH)i1{wm`fW?YS9YJtJ+zTJT}6 zMCFojyX?DB87#3Y!<7#P76my(K3ofq5ea1%Qg&u#xLFGh*Dq~KIin3f(}y?DKrd60 zVUKESd_iQzb=*iAJ~_+2n}pMdW#28zJ;k!`CLn}#s!mp8zcWLYeb?jNo-1}JqZ;Lq zxa_-*jAS6iS@td7(!;WEAr(fU7^As=QbyW%#$hbX(K`L%GPfmLbcHkyVI*H!7;TPB z!J#XVx4s}Hmh9_V@Q4D02+;5W)`BZ_pn1*nVmx1ZHPLwbwHRU4s2|I;D?c+~sx2kI zw>SQwxh>zK6aP06hc8wkc?}!o|M0@289;k}FP2J%OMd)HB6h`mX#toKsT0xgcd+eh zDtzlh){3xV32b^1jDF>oGqd*eRDCc!f7I|=QEaN3Xu&jXV~qLH=~;WeQ;CYh15J=L zFW(26HCL0SFb$vHPb;4Xh32fUkVbUko;LQu*OBHHq50KZ(nx7`qtVt^CkbWhz52TWZNC9nG!_Y5zj= zy_-lgB`F_jrhvEY-6AyqkGAiDk8{f2A8kUGW+$b!DMe7kDq`DIXuBHQGO3hUEh$B4 zm+01aW3{X3pR{Snm`oD1q_o6t?UpTq)+W_PS|vddS}RKt6z^yeRfMhP_dMs^cm7Xi zQor^2Xy$$2^PF?;x#ymH?w|L*U*4gZ!Z?^sipeGByDG($#KDy4_m@(M*?X5_V#f{D zZLofu<3INRv;Vz_!e$a-C672_|6D!5f6i3x8s*7A)stOo^mwFl^1NWRVwz)ORF6`{ zTu97oPshV>B#pB~6>|hJ|9mo@ZYn23F}@|h{5md1<+SP9foq64;E8y;shnoTEFk8# z$KzpCPKjbB5HodEV&y4P%phVu!dqI5`|UApt#TTqr?Wm;3=Gc>BZk>q^g7k@tW?aC z#N-)FJUI@<%q6Dp*DA+~shi5_)PZ*%F$+5t(-0G*zEyy0fm|A~VxB*Kj8tuE+_ercUuSyoH&8J9c)3)q7l7o1F|{ zfqcy|%Z>Dz%rN4R8!eNfY^xYTXQ(M#9!(2rcF=p zmQhYmb7Mm%N`E@JMy6a~USfMP?_dRF0-#ea%NwACC%bw}s2h#~9ZHaC93!V9 z=k{j80Iu?v;JI1&B>}^|WDIZWD?1ooqLB~ByPBTtWo@A@zfMHByvt`}eg<{a6;wyT ze$M;WwO`WDUEqw9(eN+)yg$Q=?dNRAw54gsV%De&q-MTfi+5+GZI9UXpny#ZC;}jc zt4sS5vqqH*Wsw6~%4QJd4rTodAW9RH2DweCcX(_+*Nujp!Skj{;c4~#ag6%@-D~(W zTGO_N5B(-d=z74<%$oxQ!Ym^ys;dEJW_2~CgAi{f52~1P*hqxg=0LSzP5`f8vN|$< z!NwC(9SeiQPA{utsOr`Sy2Wc2S{)e*c;k+rR~=)O%^hHqKy~CO^%PsE+4srncv-(@ z(TnORR%T8=v#{zYw5ww#2w5HJPannVCh-|2H@v3l{#hfWko`DvskH{L9P94ps5U8-`l3LNtxYfn4uSt{kzW0jYw4( z-F7)Am$G@_iJ6sMqK!#jiP+^VY-LZu-a&TFlx<8wkMSQSj@(!q$XOM~~ zC~Gj)7apBen|}0&GdD$~VuY0T=xAMIlD_h%P##>=5yjN@X)yg(Pz8E8DN;4X&u ztt5+Gj04qyl@a`lF6IGtF&@b)W!>Zx{ptuiivftb17assxeXfd2Z#n%=52nzq*;X7 zG-bx?0rRrROe_|q_mIwDsB(J0+|P;j5Kf=M258>AHk|=~_S6}SRc3eknaM#e=nPuP z6DNDXAkrBWfRNG0DjLG*Qy(y(bOxle4)4q86JoeOz_o%6cZh1(3&TxQ4Zm9CFRtHk zcj@;#5;fc$<@9iXlizRylv6JZw^*4K`k93p&Se{}&NkdX#c%~-h9jNz(S8wz!#4p# z43`VPHjz6)k6W!8K2sKHxMt*GV3w%iHY=wY0Zx9yovoaDVYuze>?l98FvF$ThU>Hq z_njCnEzEGFvmSAT8V>#42+WGu?Y8!7giju%>J{$uNIq>h7)Dhizb$@%qj!S{7vlR)xGkRY0ByB04IML|Dc?D zQN}sS?Aua*85!--)s|Xt33R>9=wOqtd2NIP_bM2eb~&#=hnu#<-{I=}6PQU5HFSXz zpf}Lp8lsIU+UIsK-nn%VIA$KA3G9@md)%8@gWIPE!dz}dP2*B=W7n&MVP@ZqhLc-(n;$oWQVW{QU-DS@6spvqmy&;6!Ym_tJl` zvj#WprOs{2%)5j)t+Qsrf|zE<@8AQ`w%Za*@xUCjMjFcrdfoPoR||2&=DO47%A1z& zM!uYJ`?}C#?6#R!fTn+pV$|T7L*F+gnRWg}P*CTlbvBwNHM7zD8LdZ?nAEROGO#aa z+nuRU_Yn2=h%k{{) zh_0!%W~#In0^uO7{No*;g4$w7YrLm}cgx>(R+Z6>Z98%LOzk8??^t%SH!-?YgXeFG zZz`QW8>N7|0El5KnazxCDjnPwDVy^sS7tL~nMx{jqEa7Wgih~^rC*djT3rbJ45k0# zFGfkc*d)fnblWdSi?MiZk|X|%#>uYLMarzs&ulp@pYOSw(>R!$ZtU9+$Cx@0$s21x zib}HI%Qh_}w{a*U9O9Y3%_4}A-Wqy9kcaoO=2oa$zkphrF-lcObvCWJS_QPv`gt|C zPTAZEHVM>Ry;4s#LgUt4tI`j%l?sEAWlx}(EteU%ro#UPV3X6Ke3=UC?a2D$=`#L-u zpiz%xR^jot+6moizRUe}HB9YS-xJzCZl0Ae&{2_dnYvIemXm0RkU8>=bX z4QhY_F0keLqn??)tD}u^t}y>-)a%4g6ZN`ymr?HyMm>BhRIbsm+psEZtYxM<_$YeA z))s;-vfq%8Vs36Kt`pAn~R^In51lqQ)||e&cjei`ORJ@Mm)H>9`L^%1xB+pMoD$Lj=bR-ww>eM6+p z7LJgTCTg=f<&+oTM*z$6(VCgD}n0EL`$ zjF^O8hu|kFXz-IevPE6mrp|phtNw!Ehn85U^tJLwcTsrcqv5V(8SyXJ$mF=&eEw0% z7i`cWzI{ITN`i6Z^~mKl{N)zBvuZm=$&gT@5@xG}Qu!mBB4n5Z{z$62WwVIA$3@TN z7JysFMZ&yDnK$6i{6kz*lULPX6rsm>`woXJllIS?(E5@I2sR>RTBG z$PlBVm3Cp+azu>O*8!n34wD_xB(p9OR@a5G%CuSKfV^O1=4p246`WY`nRVmqLmi&v zR}cOOhiJE>ln{$ej@_-g2?pc34zYk7zK$!_v9luUSdKt;*M}B3E3CjlyPQ%XMQ6y$ z)^~vg=2BDZ9QY_FFC5Nl2QEC>e+y$cJT}91uZ6FpEV?U;47ox8?oT{uUx52xapB1x z7slNcoBI{Qy&1Y`r;1gYqY!f8SmNWs!^fJ^tByYnhLKLbY(1@|rwZ_wIc|hMqsMXW zUM5OyS;aFXQQFhJMgUO~H0eU}mHJFjOK0rS`7!L3LVe15$~2+Ccr^`o?3%}6)vWI= zJ{qn$P_$Vt6ic+ni}<)Li;4KUD}TzsUT<<>KbYIL%x2gbl)=rg3&R+~_`i98#-|Jz z|2SOWocPB>eWe8O;KmW;D<5vAhHT$u>-lel@!8;|kN4JOO%>zU;|_XsnyuHypQGm7 zF+CyU&s6I5pf<)A*=RdxjAHysp@8u_a3^4VKDREG)xV&kiSdPlX9XrO-C+DxtuZt6FJw%j-jIOfqZNr(q?Sb-3-btBI!BUJIjv z+2-9(vuTm5Z@`5od%&ttvo!!7!)zzNOrfP>HvaoF&9+GmaY=DPW?QG!CxSZEY_+!8 zHVXyJ=92cZye`CSB(t9VB&-Ahvu!1sX1h0x24*|=KAKI7Tzw`ka8CB4p=N6bJcil6 zYo*ZHVmAH@v%MGWZ5-6FQOAj+5*D|s6^^|YHj@`*35+%wZJ$8DO#!>E@tchZeBC9< z_LrSP0skv9hJ*#1uVutpUMv<|!UtCA_OMa}Ot+gHXu2t3G%#Jir8J!uySls95tssf z1kuftef=Y$cI>jXDS*&e6MThumN7`u1Cm+8aTt?*mRAXG*hO<(2F1A3iZ`t*ikOe= zSs5xY1vJ4GXHTr+tV|g-SoeN+G6xm4FdO4>i)3mNnbAXnF9(mdzXH zot^(UmyR+5{CRu`u9`B1gEdF!r6}E+aCSGl%DPgK>yd}E>cpVFFN+w~>N!N&{Z2o> zv;JwvnbYI-;=@($%xT8^Y)2n9J<0U{9eD5Uxjv4xw6&acZIqF?+3=C0;L~leCwa!* z*P^_dr5S}>?uB*Jjz4Wq@AMj_thY_w7rn+P_(2=2=d#!qGGA0mZocbUtQPh!ZRovr zV^zR!Z2`TqnoGg^*KPf<5ZhQpg$#2F$F5(fvXb=-1$mf0&15h zx$#aYV^&nkHl-meD-!ROO4T-uDy@fB`qFaQ5AsTUJBWIIB_1abOjJqxQxbUVxqbF~ zjXfhhl9+&%0dLTa^nUI!Kly^}G?|ss; zNI4xEg_CTV1MZtF1CtZt`)AT5uB6VF{t-8`V6V`Qx zN=S(!p{%P{wO^u~ny!p2^@a`@Ra0==u%A_FL#NO7G7QaBL6eLie=AHVJkC*Yx()Uu zPk<&74SiwF-d^jqNLjDHLJiP6y($%4YJ)w=FL1NkKRYZ z)yjL%lt>TmWm{OMoSq8dgh=?ICu$_5vnAYOH!1InLwN5~blI$&`bFUs8C^y|bw)xu zV8Xg?RSAz?_OmUzO*s{XaDqi2yd$bb>4*tyxm|fDh49`di|$lTYcCBhFSPWzZ7qXB zq03!EKka4o+pQulF(P^wWx5o6m<{$Mp9{?*qhIqMdac(UW&PY_6DWEWWgJsD2pvoE{9}gr@Q0ZFbWL zNe=0O2{+)u%KLXAy!T1V4CVC0#gXNW42cIpb%sRxW5T))Q3>}(k}R?c{LdB5mmO*~X5A~jrYQK8 zi)?$z>8i%&d+gfWy-;hjf!YP)VnWH`43%&lBqR_Qrz!PFzdp&ukZtPEpB%PAkKRYZ znacZv-~a5kFh@Bp3E_lDxNbqzNJwW(xWz6~-e-jH-ls@dshqyLFtWUn(WO6BXC$Np zCamjXmEescp_kERnR5DF2q#$dmeQyer6VS+ot>GpW zQfq|tPQ%R#zAQ+?C+1PZDajAwZxju?davPD74qHrYKGovxJ|*0222|cjH;PzL!jb& z=W2AcsA(WN-jK+Y;!c%z9;77@9k(m>5um1Cb5*eJhrq-i?ir;Dldr=wV@(_~h+1cD zcS6JO-*HWS6Gwd{KE1eGrT$~W&u%|^l+)#g6U*?(9Q9BB4W76RL?}ijx@p4gJ?U~8 zihQ5{v-Rz#oE|frsPBHF@08@PZ|zB6I&H%G4p1rQ{(OB0E2p2%3$*{MpeLR5!XEXd z>n5!45S4PTkrG^My^N9lT0LgvM;O(S*o(Lkg8j>DEy1nq6(}8VXwSHPV;na z_&6DkQbrGN91gZ1r~$!ZSv6YEow#8eZwa@)8N!7mjf&=rIr3>7tkh??$~I=lCM&zqexZXv~vL!5GCzaX&aMZS_dHTlx7KFop&r2xs2S$VTP`LE~u$SzQQ z`yf*m*Jc~apmz-xfR*noc^%*^Z-_-2$BN+~U<_8dVyzas@XV|hlFZs4h1HXB@YQwP zuov(0l^MRePO7Z2TrGU9GF0G1TVMfbf>!7Gy<&yj~HKoLk|*|-?bR;Z0hW}OyRk_Ygu>Ry+mLe+ZVT)QNG8xK4lHr{ZD z*th}m8Y@8>*T$r@?mb%Cmfyy0Ja448Hm+68PV#H!w=p#1zCcI{*qB#M%M?M(g|>|iAPp+Au}*H|3R%_< zG+3Ux%F;dYZ>;m{E{|RpVw0*>IWD0>G%NKLpf+1s#DJcqT<=0(DY?GBzQjZByzKL2YWj4r-w08!)wk_;t-t0EzAd!oldh26Fh~f%H&)Hp;@K*#d6HTG85~^mD+4uOFVgm{%?}Vw ztjo_%$Y}kP`czPxnx|~kd^?gHPxeXWQu7wHZ5#s9Xf?k%vgS!|J^SXq*Zgo*t2Q^G zLJU>v>7X_>F9!51Wy*<~?}R#mn&(y1ScSBFBQ>w&`p&r4yxftRXSD=s9s#0+H_Q=- z9`gdMWO8YESHD|dl^y9VB9%G)&^~QYh@Dk;V*k58mwO(K-IM)%S*SbZL%nDlr?C35 z;xP6(cZC580LX3ZKvkfMI`Go=kigCd_34u#m<&dza9s;Wu|P zo0@7Ww&~OHV71bd#yVK(Gs5UgZ2C+*Xi$36SRZ{Y{Il>oD2;8JZPVxA!8)ZUjrEk$ zj|rnMwdq}Wuu17jV=V+d-j!JxT7?xL53a(X{mHp?-0oKl579F)v1##1xB*N<-;(HW z_DEM!CJ(NpJ9QlLZWbKiqID7I8;SOxcxk8kaKBP|p>f&r=J~_;!Z>9_-_=OT_>`)Y z(;EC+e`^vhczYLxl?}>uY6-mMfIESP#pl+VXCt(Gi@%NR$>joXMpd7U5fwG&jp!QFzj7OERO9KRRb$_Q+-c|E{3PvFTQ#kyThjF=1ZLRo zrly8{zgcUSz;{1-dHeZFsR}&b;(xBSCkNHDG9AvU3^FRv-<1*lRA_eaHIvS7G6ZJ7ImZ? z(Z|{{(o{>Hsm{)r)v35WlVxt@e&BqMy`nDA5EG*=uw60N5;N3bnqy#O$hTPmBM5l% zWfc-nu~mxcL(F~#6Hl?lih1o!U`k(7IXx;iM*+(TNH&0YicL|>b;JyBP0V6r6_ZWO z(=7=oHdFyg1mqY%TMQH1uU~G}*FM|M0OpfTDkL6ewqlkM^ZiD}Fj7Q!HLd=|n#dIs zlY>5p?imlWNHN2SnQji!j)$3{7zZ&k%t6}mFjEw>IR}^rzT&W9zd51tVHHA4jIQF) z`|My8udAq+_++|@X6-66pNT;Kf9)#PY2f|(^zg2t4Rs(fX_HXkU6yv-33L^FZr!ma zLc9NYSFu_(KFeslZ(W6&8eKu_YP$p>UBzap3Orxwe{Q-8=c4yTyB~M>pZnc`rx@E+S^YFF zJlR`kg}OsJ;KA--zf%K-XY2<{>sY~Li%d(?k#Gi$EIhgaP0zd+GXF4vJsH-YN>`%y z-~o2d%vO`I;|fRD@&EpE){m?FO=nftReEMy1zb zbBK{g=u!Tj>=83VEnW|cyO+CyT+}~?&TTAglP|{dDQci)1LqUulqa{hAb@CUP*3+R z;Z3XHW0Khe9UYd%8{{+#2dg|Qv^9B_ie=r)3j@+Hu;x`$n?gSNsQ1#^75b|PX;K+D z>MBGUubM1{%-jcQoeF*A)bO%NUE*E25NW(>aui8$*?%9Tr6_b{gfzMWri)5Kr17dL zT_Lp}iY3`jjKjqq$qo!uu(SF>99!T!1g#A>*(QN5!XJE;j~6;PmHRU6;v=1MIv+Ss z_FFfEI%I}ugO;8K-6{@x|3Evj3O+2D&#bqr8G^{qd!KM?lG6)HOSFrxJY(Z55t8g`H7;%SsSdQ`X>J!Ki=pn z8@=9hajL_ed_OLo){tullOxPnAVW$!yq}AqYz$1AGtsY$aAS@Jw6mAo0|OGVF3<&gG*~Id0y`H zWWy@zJAKM(qOzK*tY(I>^5~SLcUj)6PoaotRM6aZ9Pg4MTTPQ;~9A z{yvI`g(=*Ub!Fo^#qtynYVcs2PKuGnx*qhN)Dx~;oP`tIaKrYs5(Rjd@TPUHQ0)h* zfF|vD;2r#nrrAR2Ue0UlND?O34Z8P0wXe6JyX?m#=k1Gmpte{XcU+!+Z@G?`>*)T_ zll{>Dh1PB=Dn#Ru0IR2N>M!1;c9+RnM$h@0|AAXYOs^1B@+=xF@sH5%*(a73$qPEK5fHx}c z)Sdcljk0*cu<#`TS0*3P!TZfm!5n&lQy?D3h3^oas1}jo&^)+H-C06U_KF#ymA~$) zn3ccg4%Qj1WWR)7-a&Tu37IBb>)DQWow+p$a%)ZM@rO{L!>+0}$b)O(q~4IK;&W^9 z-@^pXx)FwB4rO;Kb~VYp;OS9R)8MnEn#6-pO=XEpk2Z@o)_Iv)O}_KQ#w;>yeEyC= z$*Xg55$K`B7fje-7lpHRX&LNSF|QGr!$92{S;~IEA-JWoE;{6oq4wVv+y2>ZnxjbU z&wqozUiB1?0rh{q>S0{?M(0XRv&GSWOr<+^q8<6aUR8@Z7HKe+T?=)%6KF7eZvFD% zFtJg-UWJoPwSSg6piFeisDp>bOC87!)ImAxfEPW5`3|jvmg7wwOn~w6zWjBecG`J$ zOg~Mnpu((o`;C7)NU6|QgRQk$YB5oMKpn*6nGZ z2G#8lT=*dYvCm0<(u4i013jC-BoIVlOPQDEq5Ng4u09nYmB{J7kEUG5(n7Zr`~m)p>R z95A=B$omdg6c_AeVa^JZZHer5mE8)K;RhzS;a<|=VTB=~)%+9-^X0VA!gLBlOBuF< z4xhCMu}%l>4Gw2WLhDaph+uEwckubaUEnBo?Zks3BE3sUV|}%S3S1wifMZ%{6SSvJ zavPK0;GwBjii#;h%QoFhF@B!%^rOtj_!C`vT_CVMOWQW}16PE_THeP2%kp>$ufXtH z=z$KE46!>=2l~9|DcTGGKR}md*iNn8E6yP4+JSx!+Zh5HpuD_l8mySEH$|Lisv}H{ zE&JNtb@12{-PoZ>;>-Z!GpF}(1heU%#UHOEsieI}sdm1PrNbXKHMFWTK@}YAY)hkD zi@!Y4!6WpUh;mGbKO7G>w#hATh1~Ks;Lo!asD!mr5$@$Ra(~H6{lmplSfZJKJYM~? zK+$52 zT(!yPN7^-}AFSu$p0BV}W$P(0ecqM)JOF=2+lXo}nT=6q%fYNCa#_SIP}&<*a7I9H zXZ0tj7bYgLb*Eu5f2Ax=F}nL63tI9X!e^YRtiz5D-=T)16d=kTLc0Jt%5mEfC;$|Q zO|HgsDfwd{_ni(WL?OfnaGV(|h1!*>2+cpc#bw|*LW#r^yQPI1%@d&cmw*YK3K_NX z^6FFd4R4_|R6fVxOIP02%fvsNRX3{|BA9u?3Y6T3nTqZPB~!8LzH4Rh;a<{AcKF06 z{ya-pZfs`F+kWd6ZLoz{sFtgXs*~X>7r2@4Q4St)6`b)-06v64z4JW^z>#_aU*C>D zdER~pBO0~wj(7M`=X?7dfP?otNRD9#{#@W4a#+6m;Z73Z=vw^Y)UJdO&k{1inuwo}DVc|RSWjDnx?XHR}wqV@Le;eMy5T98pe8JNO-3BN@EemCRwAWrG3+zZ>xcQRq!m)bGQqhmvc~tU_{V*x+{A&ym7{_L z%^!^VvsI{id7xi~^m$kB$m&T6u}Z6IFu`chQ`HK6hteNm=xIe4x>V?()iGJB19jOZ zs(Yy!s&iq(3!Kb&$yt>@G)Tj&xbnJG-eZIO7V?+%wUdH4CFGRpe~`Yj$j@xOYI(b8 z=ULA70oAn*jPd2m-e_uC2W3LJV54+L>^^W}sZ@?qmpz~2D&sdUl$Be+t_3Y@?Rhxx z%Pj&icSde`WnCB&&%+$9X@L-3BN}Kt@MzcLkr;_@2RGmu6saHy&Jg1tof>BAMSrDT zq_V)LZ6v@brv=aJl`<3smFa>O1qp8`2+hb|HM<$JsQ!%hA;dOM_L-N3cH|i_D7JOK z`6$z`F8IN(DK#jgbzm1nR(M8BLhIR;lC!0N;J^T=DO0Kl+|ux%SaUYgSR-E+`t&gR zESo+94`wPoX{>{kJ~NCy$EMH1gHoj@jrHzJ!aoPUC1#u9@)(#jHhl>m)GIw{tizR_ zPQq@eK|3Ca?64+lwV7fulSyyEp?dfumER(+#9S43>v2~TTGKVI5$Ez~59wJ?6h5m& z=R==FVd!NTkI}89Gh%y_4uy;^K6fw4kUN79%=ae!7HuL$=*rXZr)>1DzV{wD=Ej>n zsh{JA_MBTfT#pPh%W2jV}k2jL5Yh^qV_KOXBXs(t>t7S5e@}~acD*3qDz=w*slq}B3_xP@Hp8C9V;t_wuT?kuVgmT{0 z*O@7wRV$Q2BjNcIHb~orhST*>Tv2ALDswJd}8R5Zheg82* z#gINZo}27ZW}Ex_+biqQ<*5 zyEK?nLMjhXW`hi~veCzP-*aFef8~l%k-UlKP+3fTC5AJgu%m=Yf}4$B((9QLNV5Ig z)S#jzq|g{us3Og8Lx;3tP3YAN`I#e4W^DbwCH*N<0)g)06R zk>V+XzDUvdzM;tm(+2+E<^Cp#+w{cp4k76;c@(ZSt>W0D<)9#a;@5PsDl^9!Xc;UT zcAy{}ms=ubO6nI=*!r&sYLN|i;u>k2qoU#Mce3W*8tmE!1?!PewN$7oU;i?o3QK8J z=`^Zb9Z-cHgR+ZoMro-9H<`1Ja3_t^d zT~UgopNvGB4P@qBcisB|dJ5`CYern>l^hwuB zNW93<)4$k-I5RmC*Xp0LkV8&*p!s{n21yk>ssDG@;w85icRoM)86BFc?$+`Ap6;VHY%L-n5>a+HTV;v%Cn|Wma(U%|h!V5$;KQLIf_c@nTOpaDf-8py1SitzB^65m{Cz+$ zqaNM}mU%YJ&4vi(Rnq{4Jkc0h;@h$6)QdKppi1!S8#u(cvW*ss1C#hqXN97bKrh=GT@S17Qauk!Jn2E%+z}tGpsBZ0w$spzs zyr!Lqt@kKqXCGh|6O(}d4AuD7K+F~9(iH@9(-nkg z5W_I3T!R~IbY|9h4BoK7PXd|;zMJLAPXAp<_Sjg0`U&115VRThxU0C4h!VtWo zmw+`&ELwS%kSmyTm?0wFy4Y@tgO5h*^K@*B;0$?FrT79Su`@!pP4KyuGB-k4rV1l_ z|Bek_^c2+>tGj)^_e5z9=)9y_uwMmXRFqg@E76HNfvr<~Zk5f6P~vaW-D$!6bu21r zPZ+!tQ_5>fZx)!#e$W@`O(6oC0pb;8rWWLAQ;?9&0IT?nn*p}m8mce$z&(K(CA+$+ z|0-WD52-G*y1>OO_Sdq5RI1ah)#+9TlpUn6VVxcIOAAW<>UtO=SJDd&a3-DWn%vA$ zC}(^E?q&>IaaOHL^BoBzuyZv z6F8eXnG;1pdNFg4trrWLm|h*K*I)NU>eZ!s-J9pvi){URb%|b=ay}tQFWX*xIg5n} z*ouuPF`f3PPQNrd!6K<=QVCnkWEh3bU5q779&#{m)gRS$K88&sB zknw@ET6`)BXP6)ALgS48Q|NWM8l9Iu*+6;rSe;z|@+9x0AN38iZd5yz{h*^2q_ z(cYJ?RH27Pies~exV8{+ylSdY%%Ar`T#Z8i@qL6b8QLJOJwzO@nrao(cOS&nDKsZi zoP-GM?g$abtEQETS^P-Am=a2)NidY~>>ATPoYnKO>w}>rUK`0&u8)7G1^1l`T-oSf zPQvSIt_HMw{C6k2e=8aN%P}tZz^%N|I86RK1vgS(;SEkc;=ki@ ztWA zhO_+HXMe&R;E`v9#;AIzp4&JL0mB5H!H^ZaH-x>+I__Wyo(rTwtOsx7{@hn{LK!v) z!wGYDc~bxN8P+Q3JBV+F&6hW=smhmgSHXNUZN41*Whh_L zSi_X>5anAM#5c?4%bV6gpz|HwpfAu?prk!@#Ys{v*15Y9%UIHsJRRhcv5YkH8u7$f zn(1_WotT*2O8z9sMa)?^@gR}>YqR2RPEbs{l8?8=jKNG5-v1pQ>S8%|g|Lt(2HI#K zdZGO?=(ohLec^YJ!GBGVsJ6jMda&QIcDR8F%_ z&s+)&r)QW3OMCN_({YiT%c7@m2VO)-M1>keA?^Y&N3cs`6LN7YVK z%-@J9e?J~ZXJ8zP`4cfoaWN{VOD8%<5;Oh1#N=3tIe-}7w!|>o6te{{Jos`F#Iz~q zL1ONHH=Z0VPrYLP2#j6b?CUT)#On5p{_D}(9!6!&R!l1}b``P1Lc+*yk}Z-;QohE|;uTj_C{}hiQ-%3$ zL4(OZZ)Rkhb!up2OTpV;xs92+iMJSXGXl{~(wh?8TN!>hC<(3a=CC&&62>r17>-hg z6`%`$Ev*LkB3?@)q4h8rCiq&~=Peu=uRJBRFoQ*QzRF$+mf^3Z)#F~oYiT63PL#r2 z62@?dFr1$Krs#A|6JwAyc#l)=L9;4QpE!BJmJ!-FB3)RD$2T&^hw zT4yl*aGO3253-a#gfkFx1A@L-hElg8>=Cj2wQ=*QahS$N=5deT^}N}m%( zpKsHT!GnoPPa3Nh^q%ZPPY$h-i69T2&9z_l%59ttqhiMJ$y-D%zP3yMMK{WKXU%JM z@+!OATN@Z~>1%aG;EHiy4ew*&QXVhi6&R*b?_M5jS}cXK#`&}fVv<(hZ}-1emlHBS z%&Vpn#XNL>@5Rkl=)bK9ak78dy?jiFI9@fCD&{x)Ag)58*G7tyU4S^gC`25unramD zJhx)>(wMah?fNXTbf3#Yb3uqWUNzMzX5v1GTd7cYq_`Y?C9*I?9Iu+{74ykbDV=zk zdBa>^iIh7b@0ZU%2P^G#3cLNYQzI^7 z*l7$Kyx&flww- z8%+26=l-9^@wT4q7mo|I;6&ha8&~0#bo7*LL*b_gFeGdaPuECjoqHoY=viS5rwGGl zWynwwp03s6UPQV^LhHLfBYY-yioi%rHF~mt7!q2TX(GE#W!Hgac)GR{_af3Y5?Z%F zHuAqPhBJg=hcc`OU3j|IfO`??8VRivr7-2q_#K>n%>+kD*IMzwq-&(H9=V%^FK-K@ zpJUUv6Y3!s~fPb2Z31%03Upm6Is0I$p=TNVrN6KM99Y~ z`5_6C=PUX4ZBpzk-vFK>VA3^<&zK5cT#Zz4^SZ#39Q(!cf-Ul_~UPK>6LhE5LL}O^j@8CYD z5FDis>c9ij2a(1)&MWj?Ve~~dy#wQNGi5*;>)T2yeB%+J)-MKm^gf~#g@9lFQq^J$ zirGh$h7Zwaf-5?Q**Zk8&>=dn!0>wL5!62A%OmmH=Nu`N_1FJIL{Yv?2T7SB!#rL! zEmF*0Pw&N5Ds)(+I5R}g3K7Svrp1b>R&j|$Q5jXTYv z{^$0wXXURTpae&F{r;pmmQRd?4P9_l8PaT)!eQuFgFB{F=<)g7x+#+PpU6Ap)Le5Y zg76JF(`f!!+Z6WDFP_J3QbT9GZ45mjC}wZ93;fYUzd=3|hyt704&(9;yTDuR0;hx&n9r?6k-Y!==>M?5o3+5Bw?--OHoL%IT^Lc|Yp7I2 zfz7mqDKMjo)Uah2xB_#Dh$!$ZOlqOPCD7S) ziHwP6{((P@HKf3M>;j7=G&e&~WBjrH8p(SQd7A^^{j-uhZ&dh(&Pp<Te}SgEJ=b)i!~CM*MVpg$}O&j3ki zZMa%;mJ|?V20%?YY9pNdf(LVm#EIkhY2|WAw`v$MjWilEox*>Gctxiu3|NR@r5MMo*7_LTfhZ)?CyE$5jC#+OKpR^fa z7bPgHL~)N9Tw=nC6g1lw_Rj|rD_Mc!#`H?q7zG_<3rk5*SeD|pysj46akt$&|GY${ z(;o4RpTIWDdhwmc_GCsx{p^1G*Z$}JMCF{QK`b;;$+7$8bURTQ6Vfm9x%C=Oxl-AF z-k)ommH^-%S+h;cou8Sgq-mmZ`)g6!bcS8vGa{9mq(O{vC@8NF?U#$~ZfdAq;F6GT ziqEb0&WkAU4~QG6(*I3?hiHNCc{NIbhuZ~q`IYj`kRWzzT4)d(CEwmcpl(1JvIDUw zWKT~so^}0EzPv{=>uhYP^DV#YC%;FH<%jH;a<`AC5!h|}wqB_%jy-zx7({zx8utkWD~Grd}4}a zDrP@ojy0Ir22jP)6!YpU!2C5&<@Bgn*TrJ7WdxjH09i3gV!smJFi9}Q#B}1bk#;QT zy2#Yrk$J2+HUr-WIjTer+Ho}N*gWg=h35eB?7w%fY?UgBi7`EnVme+1rsgNb#FJB~ zm{r7F`QOCkxD+#+nD>8-hf%L`C}u1%f9r~;o0g~ZJh4F=-MLZ^i&~(=eg9Ft<6&khrhu61 z-cAfNR562z8G$!jnf%3*v;7>=&3X}-BMBeteA{AF*xhDg4zB8FrVF}n1YxX_1_G|)Dv@!!4$>7NUxQqfcXUM zxHB=u9Ev%QnCS*n5krU_{2imEFux+^2e-9z0*0t{5gz z(K=PBykZ4xB%r_mVhd3ZDNsxmF}GfqfRHf?xSRlo0mK%fp*K@8Cld3)wFwC6Izx)y zwb5j!C;f>r@u%d_m{>HOREUXPuu9NKI3)XIXc_f?5)(;gZNlC*-%%AB6EkC&GgnSf z&uv_$dXzv9-$Pfa;_=*ccaG>j3K)jAc;tJOJXMRD;rroYc#po%iA9+g>b#vRc9c%3mZ>RKxlGmMxAyA;zJ10(*sSOI+q7-9hN6w6o4Yt6vqewUbHqZD%=G0op5 zpx96aTt~n-1BhLEwb=Gk#A4aR)bCOuu?wRX+p3uTh&k0@dbHRk1++Z}!0NB#m0lH_ zqnKsHyzy0Hip@|=F);-O)1zWj6mU8LZ+#h0h$=QfF@1?~?Tl9#wOEp3UT*@XWrt#V zRBZRjQY{Yk_oup0OI-BSjD`t9+-|# zR7mW?sKtgWW;roe8cdHC8=`<21Z>|Puk>oMZ9~P%ImGPuabk*XR!kBxr5`0=v2_aA zvJQY`11OCVU+lbNreYo>=J)Tbkm8sawb(Sp{E?V9-cw9GIfE5*Ix)N7O-xQd#q=fS zMuUkbXVXby=+~bG#@C*hoYjiCpO|8Ui6>`()Vn)0e zPdAm5nJKz`-vG>xwTj^@7145EyKU#3AeiTgxqNkEn9kz`Q%%e%PbsD*jtv$aBbdvG zdFBqq%#MlC7&22aClHfuFeNcCk_$~!z<2)wV68hb#fB?pBQc+w3^$%)Lljd*%ykCS zqhbRTa5({A-mZ!j#VCngGuw|Ai=9Z!QMW0^6%(Tt+p3svp8@89^2Fq+#f+{K?qGSxcYmxOI8zu#G2ebdTE#J|};k?#M0s zZC`8)9r)q!GqdqGRsT+TS_fP)uf)!b1bGIJoT(mXa;b<9$_d9u*>mTaJ4f_Jnt@++@R#V#A9a(Er zl6Ph`R{VNrmi6h8ShVSW;k$9xe)#_E;kYRKY1+Iu@;!g3_r1kKK&QUsZe5E#{Eo7& zB1BQ@ar4t8byT@&Jxm#V`tzGcmOomHpxigBGX{`Scb#)|@sJLGFX55tD81wVwVdtnT9>y_(+L0t2v zex29-qO-~YPI(LV3a3j01<$>>sdQd&$)$VRvp|Y{3HZb#9k5VHhpNboybYfwsc$x0 zwV$OscI7(L?kRa-K{kI>&Bl-Xsk63Y)3Uf_zPl3#O5xynI_IQXXVtMd?K#hT&VGs4 zP_q_!RlOQgxu=b*-E}q&(fYO&9-aGr3*(@3(e-`#l_A*T^I!Ge7Uw}gg0{#|T|#V8 z`Drv;xTa3>+XCMHM%;7qY$D2~Nq zm8Gn13ufgVE@g-9U$ByPq7M4KP>djs*xtd|ZVkfe=(*i38q6~xFSo3F+WcRzN__8P zcG2ZQ_(f#TeU8m5-*bIKzK6Y5SH5R%t8{7;%D;0~rNh_kz%wFHXat_+rkr(nMPFuhZDS@UXqfsmIIjv?Jb^XZ_2I=p1L` z6^n1#YTzc`Vs)3xE1a2a&WQupJ4ZP1Wr8h#aawojS9ww|{r(!qj)QP;)P?xL?g_Bu z3HYsy7>RIbpL1gB0>w_K0ChWQO-3n7JDi>?aDETfTB#hJK^&pixKgyaaqWJdg{AEwipI5@QM6%YnB7u#jG)3i z%|E_Uw*;Z1D%G}6N*x=-R;<@6r9Sybph!`bYE4urw%FXpTCISpAht%SGsIFjnm)Rv z?5I+w3?>9Iu=Q$2Lnuu8so-!l1Vkv@PW|*i{cI3ggSP|`b8c?DCa_ZZfARM~xkbT) z$#TxwJ8tHcv+5)iCzh%bKp}_R{14V&xz9%*EL5F|DYmCjx z>gZ5b*4()M+^Rt9;V>g4<~nVPel!S;x)^xrFGe`d^Cr#5?|v_24P+#kGNBzGb;6Oe za)lQNGv&u*L@)k7WusO8v>t6V8TXD?@S1Mo<0f8Vo(kt8uEcJuF&a=pO<-G6L8=^%?v$ zkCpqS8@@ru+ht8Mw6g-Vci<<+!;`wcaZcul0SqpE3120`CH^mLbDlcz1XR6q;gvXN zdB+`PqdUG76-ET9u=hWz@{s|y!=kIuX}xJ^ckS<2_W+|pXKWQ#q>OOf2upm`>^!CI zmOeAfQJy8(I@k@>%k^)6Zzis-tB)AQ@+_B|W6?WweuICP@EPDQ;Zdve(l=U?4@EKP za=5u2H$Qe>x)Y`6*ZRJL3BN^+{2Sl<`f=A-=cTV-GtT+dyWfnXMaCkD`uK}$9K3o1 z|D?S$&Uxv_pz8kzG={Ws?CB>bX)Q}U8|?@|{+l|1(* zk>0{X77~|UqS9{-lJ0W9EF-L;!bwM*xq(zY)}W$PIh_`T(`~4zUJOral+$N*0gK?X z++qX_PhRcR;mNBd7@p+2Kbzq0wC2E@&ERC_CHBB%!ge2a*ZBt~zN_V17m_yrzNzm2 zqGin$D*5^l$rpC}&VqsSJz{6!{!a{xwxh8RIpc?J55}b4xozF8?s09_v1d3OEBBi@ z*n>*^p|7**1f+Jk&jAfrdCAp{`K}%PSi>Auc5lFB(bRz*PmMeXvt*o|sv3v6+kB7A zYT4r{%w*kl(HYs8vy#ay&RXQIr{~M)9baTT8h2dS5x?Nat8qH`yi8B5T$A6?1k#fnQMp@9^K_tG?f&ejF}LevS83T6HkUcz5NO{F~SPLSETVeVx_s zc6N8e_Ri{T?#y|d$ zzE_SQ#~vw$%eu0;4y)`Gd3(qYRIW{U+}&6Q)}YNY=)gv*+{QU7k3pDhz?f8U_+jAZ z8wB0sxlF5?=h)?T8y?v8#K?nu=knMC^|pctXVYQOc18M@`H@XTo(ww~cenY_9h1VPFeE?S`} zATbpxD*46dHr53yl$r%9^lH_pAVeUqn$lF@*Aqk|b}<2!dDWDz1Z^Pj?T?Ljrgmb* z*4bLZ{`cGUIstL>LVNzsS$!YA`63gEg*c7EcM!icqmB|;-3))Zjm65a`Mv-{Umy8! zj6}0outJ5ogJBc8#JkIH_@O(uWq+7BcRUBwDCrcZzKLpNureIMar9P6d4ge^<$!m0$*t2(RK?J(B+J*vic zN_>VX%5Y&2L*G$g5=W0NowhwM7&hzkxG+m$1N^W_+kLP5{IJMapjF(iu=i^1Qcr>b z&+hh}AArVkw^oJzH3;fkXZa;!!qMSh>ClNY4L_Z_*fAYAV~UuhDLPm<3#7ioz}n7l z_jfKjayN6^{!17(nd9o;{$7R)Yu>?{xiZ`bzb@k z^T`rO&`HiTj{P`T=s%&|cQj6lhLXuI1LVB4wI#U`KltB{mt{s5t9H)nA*f_uI|3pp z>ukzuL#d3`qSVG{v1-(%Zgy~q4_j3&Z0m6QhIt04e z+{PSLk3A;Ufpk(K*50D>3vd-IzuA`09?i%njrHR>=+&|i`E9eHq`pp^6@+}ek4y4# z-yh-bH7@VW;~k;v^%#=P>cDzE<~0A%hGps23GNqM?pN~MTl3uCV-25+p9kc&jDzkn zfPLv2=P4U*LDU$2G_OxdzP#_)+Ujx+!!q^=7gteU$Uw2n_70kti-spf zoIXgFt0nJ8`$5+nvT~jNXUQHG-+dw{v;`rv>QhJLPaU;p^}C%}jf}W!v9|AMaN(Z` zp0bM_5Y?UlO zLsjSx6^v+L(&wFGCh}D2;5B!N%8i){d*?2NiC*{M5I;;SCCwW;J;|Q1WRU}Ck(i^< z2MyFNc;3|gp*J1Q=g zak*#J;rJ|T?rEmD*e>7~E=o(@klQ#$riDCtN?< zfa#R9SSapXEPJ9c5Fr5OaH>v025Kg0jsq)5G2ZcJ&zT+J^0|2aHuNikHw-|YX& zv;HR^LLp+sBmQz~MQ@)F~@gE@H0pf@cf#5_BCc*k2v5D}p&M8~$ zeFbxMHGFcLBk3I zKmR5hR!H+QLZM7%u642~l{fWBm-~GT8|jc~i}t#zWSVxP_0w{hhaFcV-v0*oZqWOG z6WbS5{xX&SK(*cEj)drOHQ?Sq>8IlJABO?{8)&r`g}Jd9piWs_7GMEPz=to2@L_GW zD-|}xz(j8!cXPyVwG9gORjJa@I5qh>ah=pzP5hgd{GR-soP0U{G9-Ej|3#XyWHgi2 zwwS%EJgG>Vw3pFcbU4k{A!a+0Qg2cn{$O-~42Uf!7sT%V<@FP2x_AN4m@Xs0B%y$3 zOy~0kx!iaxz9(+F#|@OGdvm>-?o9ccmi(w*Cm(~q^f&MD%f#WrO?OJMF&%qDG2P9G zeWJs;vD_}$biWShP)-(Nw+7e^v$8U;xg(P%jrvH$y~$lU^p>;Gpe28vo+Qp@0)8OY z+p7g_T50u_+Q(%RI<%EmbE6O3&s|_N+#fEo-Hjp!-T2 z_`3Y=pZvBwV~FlQa0`A*LbaAJ=)o`hI4h^fcA#;cni6ddO^ICY=kwgJGSgc$gy90( zO*T4VacGXP?w>ppf5kv+Y$v%So`HsIsb6--HjuQ#QA+n$(1~?K6K#M~l6N+;xc$d< zy4)WiIsRgiY_d#!OKxLW$fYjzaA#ra+pq_d1OQTB;cqeJ{6C4}W3jBnnsrvC!LqTG z7mbFfMrl20Za3wjO8QBKD(_n@Sx9&TWq6pMjAptcZcpe^hKrRUoKiRR{6yD4ou9lz zN`8ffGM@Yaemg6_>M!-2G%wdK)Fm+-zEFAR7~W*JjO-XDYyn5yr2@EeH2TXO%mMlz zF%S2!I{20I_Up0L6i<%Zh9|i5iSzc$a0kCWaNd5Q{`%N?`?>g~X*x6Xh7A0Jf^f>f zS#>}9U2sVLtMc|Tz3ss~u>TGHO(NP9m;+PlfsSF|7R zS@&DbeAj)@ESYZ$`hz{la)+>NIA@4|?93M@THv1A2>k;OP3>eLac_NYC4@Dtz&~s2 z@K0k3B5ZDh1Fbx_F#{xMQRn^Sly8YE((vrf`<;LjnVG88HD&M_^ z-IZ2u3hbTdei8M-s)eIS`jY3~EGC%@9ui9ZW1n!7NMoy4d;G23RD$;}I6Y}i0SoB8 zHD!W#&XE1!JNObc6H#Z?mQ?ZfzVl9<-Z%P)%5Its%6PnCJfVDhVEt%fSO#fh)+y#t zgJD#>ZKdP_Q_9+<1@<4;jG579SnjG)Ic^2E@71*e?$%SiKkOm)^yb!~RD>ui4jcNz(wEOg>8Qr?Ogsf z#x5^v{a%S)r+>0rs0+WuGmeB#ULdF)Aj7TxC*PuvzrpY9zu-5c#7zg{-|wBb6(D`^ zWN&_v^EKmOK17L$GdWq)`nD_^(X~*&m|K}!Dzh~V4z1w}6r{2)8h{gTk9hCHNvZDT zCAdLI(-bfR&bx$ntd4A%nPKcerzK3ArYS{>jGfzc8ixed(?YCD2`}92Zkz#fOyCsY zx9H`cEy``&t|~LtriPfnAr<_h@sN`pI_W?@P==XW(@YU;<*QDtW4}&wY@Hamj7}u5 zjsh`fU+|l=JFTd_Htbhz$9~lgWP+C2tlI6Y^x{-u$wB?$CsrTOt{y&op*A;rbH|DX z?5yD4LDLURZj~GhEl-n5)TTEJYM6PH3GPqw+}n^kxZLkZ(lrW8xd|m*mdanfK;^s2 z-*r~DA&_9O7RcBl2Wy&lb}9HK1BRnYz76L}dXM?kpAW&Ur1#iY;+{Oau^-}O-pCKI z&`T>an0-9Kz0>5C?0CY`p{cFf$#|2nR@~7y-#hB1ybYiA&Ew427Kv@!omF3A=L7{&MtFM&de9xj&*%3}~ zFM3ZqLJo|&O-G0g2vUBJl;7VUUK%wAgJ&fF_Ty}aoS|VBAK4@01t&7W9~upR7`^d_ zt$7^Y?QzR!I=B19+y#5nPQa$9>N;dMx$EeW&!X42H$Yiet>NaRw7c2&;;*Mm{^|=O zFb!gL+k6fYC3;WaugOt5*P-+J6V(GGKQJ%w^uwGmVu^R23=sul4-p4^l70b4_0Ojv zVSuUoIIG`>8nk|O36!>%049orVAe8s*SJR)gMI_n@koziP zXdB%!SDivq?rJY4pqUg@FAi*N$&KWotvpjX+-W%Yih#jVGpk2uIA!t|T~afwDXZPN z>zIn`I4~|qXzJHpKw4dtjyr7 zBf9w1_dC#adT-qi)oQjnO~#58|4)-tEZ;lxvc7nQ2=B4UmTH|OEBmRB)B7#TBvJGU z{Ln051#~q5fScRl27w5m;}11^%^bU3eKBvgZ0OWXUCM=t;H01IauuS?Sg7D1l&ke7 zle0>r4s<-y93{O~1!eefzM9|F@os_NiovaDsAA3~ zd$V&W7U^&$9c;75iBUbUH?FQ2>lVB0m_)%*Tiw2CtPgc0yky7ESJ0=By```-lASeu z<`+wYxG=Ei0}Ud2G162{DdgD2h($U;NhhgF8NOXe2FH4&?buy?V|_ZZJWOU64&3{m z%<-lk|2~s{wx=oL4Cp*t|8f*#RTlKNPN?9lZkk-+QJeGjFR|Msp}RHp2O*s)8N4L&@in`~~?cv-TXZLTI~ArJWCYb{iUmkH=mM@wx4R-4ii` zaEEf}2M)HKVhQV1(hqMk_Ae)U)3sd^qd;w@{J{8T%J-kOK(XjoEB##3pRy}Zcab`& z`>ay>38a4*r%juD58r=Y8#MT629-$#PDM0hzMk7y|8IU91GjVFBNL+zKK^|GM;7Bs zfze?FeXFrmxv`%TZb5^Eb>In(OfASUu-aP*PQLWOZiI;X5N9mW(#-!0O4EY#CgNGQ zKn<}LgVQ*MuGn#@JP~| zpd49?+PS1C{q3MVVel_S>BzDD;Z*a9Hc-6sos|b(PDwJ8hGP{<- zSIeixd!{$SPdCDSuLgF2AQK4>Js~psQpUg@>D3^$s?(Mmjqhazwu?lOp_mHAJP3?$ zPVgR)=qk-t@)9EgQ)s?-`Gs>HCQf z2v~pf$LE$qD&4I0uW`=JH;2mrG5dYiKuH14N;kG}v$P_WvPFxrnRaMr6iYU2wb(^XD>o}CcMHP6Vs;#4ceALijdpXRHaB*+ z3`|E*6HH4iHS(dzo<0+%RHoz;zxO%kejWy9Wct4T|6Z^BFrUwPzUSV1?zvC<+vpoo zaRBItKfH*NF-9@o$|&ScUa*MEP>)6q%yW6r4E?ryTp!5{RW8a&u$;x`Qz64GRk z>vF;M)<+g`BM;kFy|q3N8doTLxZX2&NT{()Vj&)Me~ewK_(sjJj6MlWGBc;0?yi zxZ21z<>b3u%S=2T1bnVBJmaimtO?XH(9ve^X*X}reZ za$}7__@-N~Lu$8c=iL`01wjbwlVf70HoGuyBoNCIJPP;VtCrkX7!*H=le zmz-`XM1&Dcr8c;}^E;!sY03g?TOjo#`u^71*aRpM0T!CH*mX`WfZD?9F_FO8RSP4z zu
RlJ|(dgZ0OWa%irhR_vlQnn)2v(f6(XI8p92sm3nKl_pX|QS{xay^5l`JSm{I zyTYx~Yu&CEyc!b^(%9--cu?j=S*5t@P+%KT1a%(%d@8?!rGQ-dgSKPe+j|)9Yw;y{nD>&8>xu<|fju|NB2Lu>TuSBWxn2 z?$f1F*(ONY(k9Z+^-ZMo)r;urHZQ|9WA+I%Pqg!NdLz#|(b{?^DDx`((fEV@Ba&?r zt0fbnEZf)G|4a6!{j^vqd;<9{XdSNqUaS7RkG8x1|NXz~4^&fs+F%fxf@qW!D8(mM z;9mS83Z!_o&|U-x?!aq5qc^->x^&+>%zg7>>1@0Ud2hF&-?gTuET3%HxJec$t`H4o7$7j<0LC{rTrRER86gNQUt zi8R5V@Hzu{N|w~)Z;09mw5nV0GhU|_ym)Vyv9;rn0iw;Cfw-m z6AtTUiqaUvo73>Q!3K;8dJd{P1!sxE!4W@L`}avdihRpLb^oK=gHv2p{-F~W&_>3h z4tJpNpu=yE-{gqj?eli{rXPfv7e2}!>8*lCCe7c-gMw!JW2F$^fr*o@4W7)xN~};v zX*>OeEpTy6tj=t}1Zy+Y=knc1vzls)at!60ct4kK>kMo8dK!0O^RH1*E2)k4`i|4o z9J$ct!h*M-jxu+|c6T8*+o2}Rqxg!duspwq|8DnvNBNzKH&8y=3y<^h zVO9^$?dDv1r5Y=m6cmWj;SQ@DzE)?v?TY&|2L!Y5)#-DsfbYyl?n zI3JI76UC2UM!ia$08$qWy5k8$AwEW^o>$cKd05w|s_1jo>S{S>jR@0G=a`=!Z z@SDNzz^#3-pMqzBUg}5Mb#WP8ZWcE(BjNRv3&}02mH$?$MwRYr5O6O%$^KrR6+9iFGIx+Muy-u`r zuM_0_o`UfgK5n=X9j5lnK;pw_%Hp##Kd>(zjZj3I^mnm+qndn)Isso{rNubxHuI56 zfZOz_6y4oMuM}mX%EWx}oC*GctEnCG<<>ZH@T4s52>fnvcHlO6=6YuF351E+Gb@Gu z{@W~`c@GH0>Y2|7{=XGId*&C0XMUl3W^kP{@8@D(8nG+S^g|UK;^xAvciAR1FN@x@ zm#xDSDz2eQAFL4;50+rbQEm-)7@mS}xs!Yn^_R}P!mb=yhtZ>Z&=hdAM3`UE*gi!tTi{siC zT3Z805KT>2h}JghIox0Mhzx|rD`L+=&c(;WfWUt-jp$?A5oZ9yA4q*p5ciC1RtduEgn)YTwf!BTw_+MM#qlIq}jWjsOvAJGdDZ1 z>fmiOgUytuwGUs*ZJOB*MBe<~U*&&Hej%Ek=nYNnnZMG4hCAg>YERk+tEViAmxvx` zq3!J?h3wJf?>2tSLiu30R@j075smhAE!+1ljR1V#W&4gZA^L}GG_{|Z070tnR#+v) z+n^;7XY9uqvI;#Sjm@nImKFb)MG2OFz{RYYjg|_*>3Gw~Y!m_Aqz~G9g5?DTyWWJI z%&ce(f6Ip$Eqf`^f&;tW#{>W8y=}idDY%*vEMD-X1k2?j#yj1_$X2B1n4}Nk&xm3S zRj}ht*thYgN(PY_IA#lLu1zu4+Ap_V1u^*0u8p)kSq|-TH4`xYNtxcDt=K9FhGtH% zNP+Fb7umr<8E=I^4k4{cQ9Eed7O5R_D87>@|PML>Ofn&d=p~=?y zJca)tx%;b)8e zmYq$uWgtn74PMfLW1rY>*$i2B;pf+=X(9O39;_Yz4m(V5*}(fyzXNZa%9b+zK46k2 z&G;vID^ewEc_kAGoQF>=@Gq3Wp|erlDl64~a*hZ9Hf$vZcm?OX3$F151|BEHu#&>Z z3x~WTFh%t&PgnX@(=_7^fq{Dn0!#a8dJvBV{J@%N-e@o#ISy~L$LDRq3f-~%=_qz0 z(3C1xA=6R{Y(}6;k7clVcsO{yYqsx@*S8+WR5=zNm*tvUFrak#PtPvc$Yby9K*DYp zjl8cyL;-pv3SwX!c0*F2o>rrzP)`eMuvr|{)RWm>JmMzVYLFXgwVqR!AMKqYO&_AM zhcCMc%La^veT*Bn$=xF;uPT&oIg##*z$EffYcU^GIK7HBMR@#D7YlP=MUboS$>f?Q zIA<#yz1e&0kJ9W7OoN9ed(!%=7P}FG!?o11Rw}))Wv#hA!ymP*b;V7xtd$EKvxub3 zHE8H~seBY$>k;(~k@3E6Brt?XnR1}h8%W#D+rIWcJf6}COU9c)VubZ|Vp_E#HWehP zmkpf?9BjlO&v45ALsZ}z_z=8<>T$KV;6om>dVEK4jy}8zm8*e<7;W~7duRacXP5W* zrq_8#eBklr)+$FsdZbc$nxqM;#nCpPGaw_(>_z$6qWt|gs&1ANCNE)Z*bCZSf_AM! zb8~a#YQ`YGYGNSqYpR75&pS`=gc+wf`*-qiX>lew?>a>ta&^-lMN`GRx1!hv439zW%+aZ(Nb z$!(h$NVtXummX4SYEs4P)R#=fMhY4cPHpxU^mY4P)$n23JDJ;-9r#rrxBb<%-pse` z6_oX1iawe#EyS4;8*T`U*^l8lBCVnllo-a%rd~Z4mWp$wij3=W#1@{+qegRbvczgDD|PTasn(80~ll~jaY`loqPV9Xa($ZaS&H6O}5r8RrS zY_7Y7*d<+5GAS_bOXPWJTUF-VIvhO(5n<2b386|JtLZC%B0Hp75qz4G7Iv{OIS)-j z$jJ?zAV*t=tCsA(Gf^+~cKec43)5(LYW?m~E8h9Q3%T)+(HK!5Rak>0QKf38^p<*0 znX$I_g8y=)nDl2nrFoj>YNM!87WVQgp^4LEVK4o_CoJq;*NL9k&)qFZb6@M1zE*a( zVao;ewP7)OPtO;xRI9HydUYGXfd9alH}pshZL+@p*Fc5=eHi(MUc*1JNa%MZH^o8J zt`IFm?-q|IqXu^(4(~u-7VC|4^Zl(9*U|W|g70+tv6lZ5niS~peLJG1Yb|~mgOqRW zBj3(!Eb8lP&g`&zu>TQJojb4s-ldPn(m`L%7t#2kbo`lB9HOVdGE^8k!%M*sK5X;W z8X@|(_)~qx7fXoVN5THogx!EY6;QMg{bm$D$Hp8{N^Cs6g`&w;iYA}gAkk#28BMl8 zKr@=W`N{ulG&u~I;nAcKYFPwTmUFLeQ}-*YvDulS|) z!>(po>g&S!d06sByvQBlQivgDVy=nD1sES-{)#-v;fMGIYh`B<(wP;fQftf;3Urdg zpkih~E2nPRiPFifrO9pk@J)E&e~i*E9~2MQ)5ly})tGB~75pl<24i^5xt?1V zZwaB-@UW|v=e4WgUAyqI6{i_D*?xH3@UE}%@+rQ`JDzHDw~56`GWE9&;SYCIz_A}T6@3su9-t5B=Tsdb@ft(N-7+U$bD zI3D$2<0GHPMT;Taes2kZVA8nhhCm|bYP=Yv71p6WEQfbiiO+5KX6`Q@>G+i%fsqMK zH95>XCh}^(5FKG5GaQPhV;t%WjQyIz@nn8le3=RxrbIDif}kuk*dPq`Ko9I{n1K~P zsvvTsU?&UqbqX8G!#>GaF^Zv#)82`K#&H)^&|d7HRH1^jsTgppLBuzf!prSZcoOGz ziZOOwuL^uMaHtFrZ1NmhHOx!%i{)e{a!gk>I4uG)i)Q*$JQaWX`O?)?Vt4?=Ta}7$QY>&Hh5{xC?p9*I6^PHoeKO ziAkCX>FF5E}?1b8%B?73*hi>k5UVoh5v zmU;#XYqb8D>vsC**0^XqQUpi9Np}m%v8}_{a6t_+wd+_|P0urRb;^6G=h5%;*}j587I>=rdBvLwgxAk*~{Lb4YGW@lD#4WY%t;- z3xe3gnNDoW|#RrL+^b z0G@^F+2pDPV`Q8XzK+AqfAFU4KyIIjfwZp|;AnQVfnRshQSCn5(#7c{N-lAFR-J&c zj%P?q(91@igpDj+rAW7Ng5EsBT|c3&Nv&?kkD(;1g~lS#hyl7*pl=qAsW>Qv6hg_p zf}62w*|$E?eprrNS=WX`u3B7n_!T+9!V?4 z76{p|kS1FU2tYdp!0;)`&k!llpg)5xqJ8K)kiw{5qJOl$7z-9wa)^b|3l*(8a)VFT zI{I)C3b)v)3f5k6Cz?cysWJCu)EH~faF;OKm!+EfF+kI68D`}T9H?v5vV6g*({bW} zgE1Y~4ZqY4)B31nceivx!NMAD`m_{~lDwvrRsiiLRZN^rTZ61ewbOs;y`|Px(9zTf z%A(rsuWtqCh$V;98mSGml-C#-TFW?>&(bDqD+|+~!A?=&_Mdle4ENW^{h>!=I8YkH zms-$NaI?qLQq5evycJG00k{W~8j+PlKmth?R6L_mL;`WGS?0 z?P4-Gz^+$atJ=jU^%9HLE+z;ZL_cRC(w>$Keg=UU3EG z3b6KPoVk$qPBze|`ZmT?4L~a1u%j5=AwG~_zaYCE$-lI=v$=;=O%hdG`ZK7B2xp8X zr{Wgi3`H&2q4S_xJH^rhe0~-75d9QFsrd&QAG!-{8=iSQ-BVzD6A!1a(U&xh9QFSF=o!wg!4Fq^9{mzKu^xH`Uq#v5$DDE;hc?+;GB=O zo5lIF=^>+}h?c!eIIsP=u5-)Rtn;6|R?E8mW45OTN^mhqM%=!nOlEyGu|AWOwtU^& zo|G9g?=s-HD6MED88R7l*)wB4(3^TwgkPvN{mtj{{9I76*v!uqVpmEkqvG0WgFA3SdG5B$D5fbCztLF4fg-pel3 zpQx&Oe6?B69Nh~|527~HkbZPD3Ojpze5$L8N4%^z~JSNJqYcUlu(6 zxaa;|Xne;Xpr5qJF%z`|`nRBIt)pd)$bF&VolaW{YB{W~pz{mW+D2=+Ao2>+Krff! z!unpt8fz>|!3(YHYD?>iwh7Vpf0D_Oj-OL}x9&)Y3?dR8Cq##Wr~x`LFz##WJG}lU z$(=mDL5D&~ncWDmT?Y&H$5*m7QrpkcQL_aVp7$DuNu2o#0dYaJ;#(bt;-T z3k3T}h7|cP15@VW=Aga(aC6YNbsy|Z2RXMd>Ao+MGVK)$bgG6x-Knxb~LFiVY_rqvq1PJ{) zsKCZ~j|thSHcwSX9E7Kz{v@(D5?!|E0EH@0iAPssX3{piE_#reUqFlf$zq0|bT4f7 zlf)u!w;ooU*>T@MTt|gxulOfwg>LX@1(+rj#)Cq8A+cV(91S+N4I}k>7?HImN+(!Y zFP^}t=%0G6!kvP>VU(B*A?jaU*s@ZP)WRk~sJ7K!@n32o;~U-MIa0gUjG?;sOl*rW zqRD+GNjH-mR751>*WwU;YnV0-o4im2kAF&C4+5$0X`@JNoW=>KQ%z1EIZ60IXLjQx z(bzPab5F62(m7?u&dDj9p1Z;@(|qCd(r4j1N%S?%)j^zE_KHr67s89&<2f3eZbl^$ ztv5wDWtf~!6HeEfoZS9I6^bPVbQUim_tSnR+1B#)Zu%M<-@AnG>U2ZHKVQeTY$9_> zsS#xfw33GEd>4lCRbRV4G5B8Fi@s&T*JbiOSNKj6zGx^1EdV*po!~x#WZQiC8-uff zSxE0dA_~s%CF!^PC3)z*kMkOejcDs1=2!X#d%E3V@~0@6Vdvw$wigHO5yc4%f2-|W zsD$6cM#=ACN80#zZW|Tlai%mGvz>W+AqrMwOxsHnMVOS{ZGU77D!9`>0?7|#QGI7} z2$d>(M0iwY*_stCgnCBoF#dAg{%87aZb;b9WXI-VxNW34Fe1jh5;9GaL(?-5Il(L= zl7dZ;PKx1I-0ObA&LvDx%IcLgX1m#BX~U z$f5a2@wf}l>{{z7_{!-U!8PyzY^2w~j2LR*W}!SmQT7y!@Y^PX_;o(iahayb?s~^w zaW{CO-mg;izR8<;+`i-%yrlf_b@~WpkA-8j5z1%6vE>rI&hOoWI{y#7*pa)7Xo6Nj zd&)rj7tlg;P#1MfBorfJHVEcz3KJ@ZcA8U`*f$put5UEoR#>oe=w+1xR16vMChJ7C zI9#jv`GJc?!B7gCjb5C@EzDLa6gb_V#<7!Z*d69{6xcWm*LO5+z}1 zq`4i1_QOSVnFhf*bP;&egdOD?8NOEFHvpbj)}Cp>iN>Q^aQ;j@mRMTLXnIr%{BH^V zAUR^x)>Z6OBJiUK{?U`di=E~Pd|!f(x4`$5N9gAZ{ChtG{L&7y+@k55Bk+GG_<;nk zx%_MkPEU5CT#n#8r*Qm9%Rk__ z;dfVAVi9T2p4QO*e1LycA@x*Vm8+2S7$k3Dk{Ra-$xxg1uGq*%7%L=BHAtKd63C`z z2Xgv^ZZPqqT5-4#XueQP;ZNGJg9(I|YdyZD1dPS`&6wuFs;9yZ9MGG}ulPP{wP6LzqFOLJ)W%XQ)9B$}mQHN2g3sko zOY@&+uKvKx)jWIx*Em<^K9}!+%kDjfBbn)??;~$PSH1RVQ5>%kc}=E8|NK9ird~Rn z`F40SPuLfqMON_7OvcB>1|z7GUDQ4oW7(C+7=5guP!+L|-sl9Piam=Rlvu|Qls zMhFPN_ko3jk0Zova-U{Im%7JIDEGD<>KlG@fP405;&TZ?97jfFH=j4ZVHwd zDC|{g!Q3%H>G-Ljpr~Y`SoZM*__T5sBbe|Qt#je4DDZGYDX?;H!xV1mTk$-m!5-&f zc#UarQW%;twOv`Y+)BNUi+FcI{4t~CKPEH*bRU7t)Gjaf)G_~T;mpZ=E&{wx)A zcEM&=g?5iutcGgX&Yc|pP%4VN6?=i;78=Go$t!7GqY48>&|Y-%?;hW{C6cj9G#^$55EK^0iU~ieg$Y$rj3GWW?frYK?Lh9e8ONz$ zZSJ@BC1c=Nv~dDi{sz<)Wc}q*n?S-BSaB%3su0PWYXz|wUe`w*rYUXMSW%_?eBA(Z zJBlwQ17IJPj$j&qvt#1~C0C)uWaliw`KiIix+KwH6lP?npzQyNNTwSuklQxN@4Tkd z<8!qI-2!vV){$6RIOZc+T8JGAv?v2+!9++=vhsJwYVtJQvN?oEmOUS+IOjiJmg}`X zZ08eK0&B3uAhbl*j&M8S$5x*BMce{PgMzi8%{XmhFj}(VRDPvz^~cfg{XLnlC*!BR zVl)P1s0!S)`Bl><&8=S=Uq3g+)`jie*5^rk-NJ3->&^UF-XJYy9UkzjRy_O}ZTYlh zz-Sxm-Q}pBO^fpJak!~67S4UB4qc}G8zp{g9flJUxb~ZWW7Us;{2yDd&2aiw*W#67 zFc3wuDzKDZYN0K#8d&0QS@Tld`U6%w!n; zQ?4|1wXA0~bDOp8?*fdDj~R#AdK}V0DW&2oX48W!&`nW9uM*MwDbf9j&z4+Ro`EBl zbkkQ0uRv~xb`SAraQ68at`eGNQPDFX|Jh38)@;efx zQ|Hy7i_)om@eV|xYhQLh{2dP~nnH@!5E}h58bjl=Sdl$1! zc+OTl6*&iPGit!D%2`!4XM0zpV`Ok@gW@_#=P+eK5&bvy|8H{j)rn%eq6j!hdoHJ)GU|d8%8dl z*Zx+ma^-|{2I#s2eD@bZ1`3F<-j$-pI?NW~zL?=YTHS^#d3M}Tkhprr>u61A7qWwv z0+jwR2(8Enka5=m~IRY`!us3JFH{Y8Y%vz3pJCLCj|7`a|_N&&Ce zak{vG#Xf$v53FB;m)2$@of+XnIX-NYwwhqHBnXe!mH3<5X1!>}>hM+guv_2>M%%M- zB!ceG9LVpL7hy4gyI|-I?_HbW@_otiA6L2;KuDEXwr>xDZl|yFDaYXx4qsE(THnBD zk1c&wPrv_;DiiKTI(l01&O1&!Y0K#pTWvl|Y}Nj9FLfwO;Ga?Op$A}F1jQU!7Ytpx z_1X+cRkFzEz}INO1Bo^vGhsEgBK9Sfvcp7NT@dD}G-I8?|H+@se}> zL~%#5lY5B2n$1O2)I34`bdYk288J8o7T*!OR}~J)XkS9kOAA7lTo40=9HB5*=ei%I zjl!MV5@x5nkOB;^jF`EqA4Be7EtABjKgvTqHZe^%DVlY&zh`e&(#c{OgojOtzi))$npO#;m3u(3|_gc@a%k6L<~2sKQ|CzB~Cz$xv- z+VJ1N%St=@+RKik+bZph#|b0iRrZRDQTy1lF7M5=(*DTuuRl}VgERPVLRvk8AHK{# za=SBDXp|@#QchF|C>>khQk(@(#}e`y{?GxIHNhh59^yu|pjTOsi7^ISWxe}H%9<>) zZaYKt4VU#-kLa?}zJt(pkd;eqe9Y#YFXRgqc{b;kA1PwF(6}O^i2qyo=k!Cik}=bh z`iNB*eB7RHFROwtu&D96HSg%HNYQevDVv3hEMtdPBiLt}Y&*=Ei}fT@4(6 z)6Nq2c%A^ZEE|g!gf|GuaotFUm(PllKc~A7@63+JF2t0C?Wy@C8KJ-FKHtKtK4S4B zkML?qw)p&S2|MDkmXUovUuY~=G{WUP9db(Pbk?`0^Bnbld&Nh$)128xNx>kL>) zH~p9x8ic!~4h&R$+fU=hxnez?9wt3r)VAayLH*DkR^axE3Ro}(&gFvsG|*#!enz10 ziVeC}psx|p(nY5Znp*8er}ctpQ#yrKg-yps4tdh0=(e7Ygucfz^?7qJGW=kHf1co5 z%~RTt<%kU5U*PW{_^KG_cZd!Sf=@HybE1&16Y^&OoYGD`DqrX^%!&3E_EidzcaqF4 z4$;)F5zxN_lzO<(=@#-QGqTBM3;Z<%&#v4{)S53QJ6&W-Ru#y; zog1602`I%Lbb4E=|_>51Er*iTJAs}##03SbbzZMD+!G9LOv6S1A<>h^7 zZoE#r=ONn7L=f7&pO1|52Z)6)P>p}}u|f;G0=Uyl?HL>II?2J`v`<6_Y84=CAH|1p zpbB_`(e47gpC$GMYVblwXw#|EOYM3U+<4R>CoTr zn}xk`W1%7XSPOKM?dYg6)X5=({w!InJ}&N6sJE1IejePb2bl;9$Mggib>h1x5QxKX zt?I%A9KtpJ>xLK8dGL#(rd{Foie;dMC0L1jIw1gJr;U<aD|PeZh+4t z3m+lWB_iTh19g8Q$NHGMu%yR5KAZux6NOvyrZJM92OAe(#Zl(ly>%&Z64C#+zcdT& zPxV#<4~m%0UUHNK=a9^OdaggzB&q#ZZ_XI?pEj@DxRksk0?HvG`s> zh$T7U6rDagMRd}W6Ieg^4mmpvNKBQOh5@gIlo3)9zXxbfTS54DY6YJaRBNtKBGj{I-12?-GT70ee#`GCYp z^RCR#?G>eT-<6+};+RFOquT11gt=eR=l<0#c*z-ewa{a7l)h}NP`|fdxUEAs0be&k zw0<*BTShL%~@h(zncvIM>#!Cw&re4BI@J8Xb|#j;i+8vPc5|0m$}ajjB;mDdNv z)ClTJ=jVy~_W^~&g@YZ2+R-dFSh!>f3L+ZGzlF-ol>j$IF?Ow_uWY2yB3uioq>Bb# zDd0O20KQ2xz@vp)^91}wfK#ifPcMX)VRGG^ABVRMJ$4`6c$Rz$UzBp|CY(TobFU~x zF%`$2OvC9!$w^xQg7vbE_v1#iY3tetp;>Q5yN_kP)3(y#PWQ*#hvU9>KC9?{v;*dO z3#GL8y~ACAe=!$c&|gjrq3q;Xj8Ofy^WVg31RPq53(&EHrwu!KFiVO(yL1@^jxjyn z)iC}jO6Z}KCR@kKq)ckuIlb22&u9A-FRn?XQdpsO5z(SW^H-XL#`aEVy%5^kS1(oDNA+xkU3gsYPh9j&OKzs~3VAa9AtwDR zdZ)ix=-;E$51Zt#UaXtRT4`DY@f}?KC)LF!EA?{4?Bf>_~+tqBV4FKuBPfsPB5}u4Z`G~eGF6muMS+e%9_cZe#b`7y49V}=N$g%@P7WocewG$nT=iNkN9BD+n3HdCvLD11bE{75j&i7))FLNaN!!!0tm;Pw+V#_E^H(;z`A@}9gRPn z?-;Rl&XH5%lH(4C>h8NB;f%u{JK~Svv%|N^(RdV}-*?X0OY|HgHXjZ-d|Molrt!!C z2P9g%{GPbD!>#d+K3m;0x5v%dNL=Q0?ZVa#3$MeWg-unziAVDRIhk^^qp=f|Tb!cP z;R6oe5yyy)^sVs-KD_6gvy((}jKHmtmwb%>v3X!>D<^C1Q$K{IhI~Kv4a(qe!0kE( z#gESUhB!O@!89W7}VECxiL6a5+F|mhJF9wio2~C9Plx*n}h}qqs(V>bmn-fzvna zIeclw$81E?HP@Jx!hP(9)$UDRdC!ZK@f?}26=RoCC zxE~{Xz%Z`PCE@}SZGl^7HgNbKr#tatfwI_cbBS-vqpyKeo>p-L7pjP9E)bcHd zL+t6O<0C$REac97?vLXzZs2J|$G*ABsOyJ%*7Xf1uj~6AzHcMf_3y~F@IQi}sW_IA zj!B$~peQBrxYYF~cWD>ux^qq=SN1s{8N3|}8^l1GW8pe0du)VZJIzTN2$|Q6L+d13 z9&YE#>m1PpeGWd!_1oq9P&J6oIq#9J7B=?7auC%LxJK-B`i8#4paa6pMh0?>*y2li z4Il5^Sa3K5o@BkPo`NG73fU{NxvF=es+Yl!^s0`_nc=)qtNN@Xx=WAYWs#_2$xo0a zI0ak>LaQ)<(ntJ@ zN`p%xDM-Ij%`2p(nL6m}JIJ#~9+}`9x153pq^yw)r^w7+@io#&Xd^n%dSKNZABu?h zp-AEfk=xodD7mc_TQv>&KUm}r{R)*?ZxL=jd5drn5T!-vrfGYLy8kUd+xLURe+7;> zsji=m2#YdKu4;&H$wJ|Xr8c~6;}edWTv|2s)I1+vf}EABqkLO#CSeEX2{tX5ss4e# zbuQMwEzrMpYGw3IV)aPvkyW0OA0yAcL}bO1Ccc`K$%}X(P`S>uL%Vz=eazsGSXP6N zmHNj{?F@Wmi6oE-Zy%HWwj=*W;08_Mzj2lU!N+(_uZ#h~djwZ7XbU~M*5b$keLzsJ zAloPT2K|S=(ixaXfeRRp;Vq#tZgGzow5s92uMSIr`fW3qn+yjEiIxlpVu<3^aA1HU zh2g+p77D|GZ>ij4CZvV~YY&M`AhcyUn_x2@{=}tJAI!l(@vX5_Rs(_ACgnmRDe?Jt z_DdRYUZ-ux?HO@C+rYc28|ghDSE2MEljH>;8KUe>Y@z(F?+rDzSAe|DE(s|8IgT}IqJpf$ zV4MF#`Y!&Vvk;Xx^NCb*Tlh*cELc6!K0nf1k8h+}?;E!SjWeQ3eIfQ|_-(BB-FR>~ z%|CyMo0h(m=mzIw6M~HptnJu7yhZY^3JBC3IqWNz{26O^@En+yxz%2_4GxS>0>sX- zFZmDsC_Nru^pDVe5FZgot3^mtEBDIRm3|0F6_) zgzgN<6V$#Q3WY9#7Nj6)=fPS}UsL;e~3_-LSZVJ<^$^0(X(i24T&%pgLJR`?V9T-vwdbJ+!_^Rl!8qOkA>+H-<+ zqV(XXVR9rA1BJvV-xwrV5bHSv*#)QI63=X;q7vTGkB{nLQP-mu#3MN+>F^W1;_`KU;n1n?gLlj~Zb&QbknNw$Zp~;6u9ZD2p6xAst+71}nTCFOQ!ZURT&_%_G#PHQ3Wc*?j z)gycsn0#1N8&QZ+)G0zD!z2-ARXSh7YE}KTuND?{76%YqCwi+^(}d4E`*oA_V+#Ax zUMXcQwJKu8oFNqaCI!UgGdrC2;oA^+e}*4L8qUR@`T>5?LBqLiICmR=(=iTnk^h+b z7XHWeEXmVbaB?^P-i0O{2ST5Xa<~z%$Gk(zxdUUeP%Fpimw{qXHT4k4;!p?tgE2du z$B>6p9rBLj{}XsQc{BafgjOCmcDb-L4nI@4HOzUS6HOUzz4W79^3%>LYrK(av^~_I z>Zb+diM+rwG0PIP&HHr4P7f_N*9=5cY^-2CVPKsS$}q8_@k$r0d;{zB&=cmOh-kcq z3)UqD78Dz5qD5ntDrn!en~D{ii&mmB8!T9>4Xjf_{Y_fsR-NJ~4ol7KCL)x3LWkO?L$W%DH0J4R3r9C@+>7L$2JQ1U;i-k{_ z!AIhgUlD~!ZGHs1J}x92CJAfzL{=0tckA>eK3QR&V$_=tJR^KQ)J&7GS;rBH7|r^E z&{%4r5#|HZnVLSJ_obEWu+JbT9iv@e5k?~|j96GYktlB1}FboKFa6lYRJ3 z2(XjD_Tla1cL=o$pQatd&%7@CaEkAyH4`#O*r#&1w-G|L(s#_NCENac3sSm>1lP@S z+AnXgKU#{Y4$BOh?=P|s-=LJB^gP9+n3l`KRtnPAK6NI|2CWC3TXBtNt9{DQJWvAW z(0O>?pA4|1TZy)PD$s8QS_Cbb*slM7SVGn-Lp2zRIQ1w9S; zu^&G$H1`+Q0VZ!fS!yGq+gd^+1LeI%Wi-oy6&4R9fKxMkrIABl78TQ4C5T5j@uOVM z8vk~P*Dc!{R%uQTIS^s?z*qIximwU&%y9fuLa!rg?13MFf1BVB3&+Pr%Y7mdh#)|# z5cuqqFa`RB=3664vVb++g}RA6ON*es1XR7{v95p4VZ-%AYZkP74YY)`(5=>3GBURY zLCZAIP7kfI#*&e->IBPXV4V{Bg^4veiiov>wWZCX*^7ukjiE+lW;KFVWuWy7U1nlM zV^%F#zcsK>dI58paWpel3EBt)4Q4#kM2p6)QqT^5tgCiGtr_kTOeqY4YYotPtCK9qA{B%Smzm7U^c--i^goWpndj{ZV#BT z8K)eD=j&22&S=9pL+duepwk2+1#BgM(JKs96;9Oc!z+w19yA!`VuXPil9k-i9pS8m zC9=3N7=gw?p>dUkMs`6W!kz@A=8_ZMqF5Nc7}5jN%wyg=Ie-~r=}#?zFs#{A)MLV? zWshzXCF=8(KUo-?s0oj=x{EC|!bGKz%@9?OED^FJa*1a)lDq6p)I?!3%wVI&ZM+&f zQp_Gf-GM^mlij+yUh12sccSCig+IL1>20(`a059wKwrbtohs%Ws0Rwj-%tmOy@u#p zttk|Y84XigyMSb2|62?DkONs|)!0Ns>n~^{479|w&;~P!a$^*3ae{Vmm#%DXTxht7 z7L8k{xWsA$4cwNSS(IqpIt1-e0}b5lCR$DuAvHmpWT2r^E=7kX_f@YcS@|kerJU!7 z(58(4X-HHOxsSue0CMjDYWL`y-d3s`@kD9MU%tHwR9y#q0_%w8sG< zYI4V%U8&E9=V3mkIu$J<=Gv=qXvj`EG{jZ2pbD4PWZf|`4%DaPw!)O@Z8|NS$r79` zPP@gA=^D)F5C!!)IFCQ!ZQV1VffFifwHgBRCw(%8boFXFVRkq=6DqfQd;7=4{(;^LjG?1$px?vv=0csE2PJX&bC#8^r z(JH)ywqMT zXTEU=-H`>-g$*_fP}8FR_>jszxs+hEhY8-FR4H@^Tj;jvbm^sbv(QcMMz>X`I~X5^ z3tfWIE)u#~LO0byw@s%@FSV}6Sl(3NAjM|LtLb!y<3qa8B^YfB!TXas8`uuiYw33A z(CN}k?M0!R4jiNz4Z58=UD|OtPUsSh_JGi>61wRYx^YV>ih+IUr8Y_EW&sCjVS{de z0m40J_}~`01f!iVbaRC6SPR``oi4r94nN9v$N`RAp2kiV9IVsL!-pwCmteFeg7+uI z3EeCU-Bg_}z0{r)y7|CCs?CshxK4LAKFkoh1f$&zcr*#N2i7b-4G~O_=filfEKZ+i zGg!(ZHw&H{`tqlVu+-G*$sN5t=MF?^Y7z+?=U&>)D*3_&)ycdqXX!qe@BrNi6 zxFR>n>06d(0td5n9qFa^S2`*PiwPh5$gy306T z;3KMZZ_3d*QJV33 z$~@izNf6rIuTW#Se1WMvJdu6{XESr{Z<`5VSxFcG{R++#fFb~ZUkj+=^b|w(1-k65 z_^?=HCm793@cyLxS91+3H|YjT1SPPPUTVXHZX0l{9$T){)$pNO=n{7_PQ=q3Y44*`g7olbW!KC}p3g3-RF^Kbk~UkKeA z3*82tF1^&=l5=wC#(68n}-jBg)YHp0ipZuN~YUvp&R#vYRT!PHdE;41IOyW{ROCL z(QJH36S@SWWeD9zg>H+5Zn937UTR4~cOG!8_8qL#U4Rc`gf78odz#q}R|?%$3*A(m zF1^%VCpet51RQJ6K3u0;jt@?uOEB6Zq5DNW+o8=uH(jSoFSY4Hx3U}Eu{zxxFKIg>H^cmtJbi39e~T zEpRw`l5i}Tr_-&&hiO8WV6-Bkd#H}>&}pHYuhXTMTCUJ-0FJe%oUPMs#)sKLmteGE zfTy0)3&PYDc7Ns)LlKTXU!%Zo^TpX2&>s(ghGVOB<+JsPRj=_cJ^ zgPj)-fL|)8SzEa_5g4cG;X|3|NHE$Yg7+sSi;ixSZcr1Hz*2gtT_kiP>evBD@Jt82 z2s)0%Yo#MWXn}vQjyWbP=t#eUoub03b*y7v7y$hW#y!ai#=imp{IWpJs$+ltiVtpl zcwBTO80}7i_a}{coy#%bq#H~Yl)zGYsa+>@BkDL9kRY7{dJ%NY!)v7@L1-`iopqdT zvVxBEE0`)Ow60|x=Y;{#ui$V2cmn|7mk(-I9n(c%^j7%rg6K#v+G7OoPs)3ZbzET5 z4UQEQM3H!@-KOZG1we3UM2Gm)Ri6b&@SF#F5p-OD*Gfl%(B68URG3?$+B}TtOM-3@ z{zxNznptjsDi7w!r;qUoJW6yPdTTC1;`Bg#*eB5l!Dz1%yg#Y@f25Zec>@_Il__>raGr=gTr{dSKUD`8$fqRXUkwV@ zk}44in-da4d!D{)GDf}Bi!P?{2h=fgxn(<-1XhbmD0D?z5`5)G( zLD#5O-~+i0T4+sljp_gfjaon{f<~=)tu!JCZPIgGM$M+!&A|o{y9`XAQH%MhCD<&V z<_P~bP_UL!i%5vx4If%WBZAScCU}3+-dfhERoAFh;OR)*vxQqLdHz>=}4M&$fqaq2|VHu$ylS#PLU9O89ua$Mg*hX zPVoMu!J<)zu2CG4S(NO+)+QGq=vvf8%`_Ji#r^tI@~eqQ(h*dvL93!vtHz(&-=8J< zmzQAJW~i`~eg%`6ueNnH0W2#I1E62Q!2(bV0Pw2?HEa4MRm5&uREG~8q9(y;B?RwJ zI_Fg?xIm>zH#l5S0!!(omM3&07GF9b!LtGMBIwwR*Gfl%(1Opfj#VZrH1+f=I962n zdKK$f9R@(Zf>{Ev835qdqVrQtoLdBLT14lIC2WRFfu#haJwx#Rr1Ae|9cxUw!5l#e zETxy)e8A!0l6fe899%LR56+-g(*8J6Df1Q0r!p}-OQws<9<4ZepaF{gpjDA-~ z6EJx*&PjEdVb$feh99fTU4|?RfcxWhnQ!2a1-{Z{ynRs$YN*pcx{i8npR2*qwZZ8d z-QG{0Tt1gYFQ133I<>7CPL#X_hq42|(u?Sj6w$ZQil~gmqWwhA1Kk@a){Cf%iU^0< zcAUJ37904#5%#3nMN~@Z4iq!ax`$qVSA*N1+tJjQl*BXuCSJ{RDli?;%nl4FLV0*w z`|i;V?P#cVe_psx?k6d#giBY!rK{o6HGKBTc6f8Pugl@TiZgH&dXg`og`z*r#H9A! z;7j7xRAb^XNPf1G&YG@=<>^Wg=sxqbOXIQ&cJPFL8~h*ln$Wlsa}7L}^-ZsJFto?l zj{6h5fg;_!T^{?SPH*M`!@U0puK|fKQVj@!#e^W4cV?G26DLIHHPDu3r@9;i zItCm*yn$4+m+eGd^!h%>;Q;m}zW{*8uhjaAPFltV&>ml#Qp_)!^4Xpq-$u86BH9mr z2Nt;S6|*mt8NgiwN;VZ(0TGF%ic~DtT;h%R!mF@6Fs>JeG~`^?iaf{k32N z(NOl++apI^8YqEG8OV72xtfsrqn{KhPdfLO+vDsjGS0+f^v2Q?zj4^Tn?`q)p7?{q zKJh4)LX`Qz5eNO1mEuX_j$(0jj@_jmDZB=U@ghOf!y8Gfq>j3=hOQsKsq1QAF{pUz z?Qx}R+sbo0{^;!}Up$lw0q%>fmDK#&D{81TF%yTCb=d9=>-*XIQfSzy*QfX*v28VK zxV2Hg>sjg($iZNjyTH;rOKL#syxP7UAh#4+shK3kstHW&))fZYtM6-*eGa^(xN>FOr>A&P? zfhbP|grXWO164+)>cBz=mJ*CsahIBh4&6+pDKdF{W^MjKugzS~LqA8Z#lbyGXfFjR zKTrhs}W7n#!xaKE&DUFP%jZXaJ@wR#5^x1g3S#Ya3G2r#;EPLS<6&O ztEj;V-HfQ=hI(wjEf@lm-6V}B4mqSg$(^}VZ!{YS-x4->fS>LA5bl)(WKZD1@IJ|% z+1kBNO8uwR*QOZw@6<_Gd-n~F5O=e za$uIO!7=Jp*GK48dukx~1AtFe6y55;k@}jY(jym=7Vy^&+1)CKHMo6;)OiV6?t%@x zbUs9Gg|eeE#LY_Fw$fTSw9`_&bRr7&u6AVyJZXKfd<){eRLgTxdCeIE|hSr9Yr2tEZAePqxuD zpxHTKqvLQRH8t}Svwgei?ENJ-;WH_YDyrHp@>KjuPKuQo4k1u0e&7CvT1XInUcx;1 zcP$KH>_38yUKZL&S6;y<|)!xhxu)`PzUQ2=RWvb^Nm&Ul^ZTbvgO5i*|A$zcAe8jgfmU|I` zhl$^K<9B#`ADD5BqmC*NxcwpN(l~5JSo93c=J9=r!ya)dl*jjj^tli9xin7iVCg=Z zTL1;!Tjj8vYPd!X%mViSb!^w?es`A9?S6)C_n0^Hu0_Nntn zBlJClzfPN<;QOZC#`Ol`QO!btUf5Q8By}ZKM!WOd0gVGTaP8vGWb~o-cg-!)BZG#qa-_tK-uh*WoZGruz;)o-9(&q$S^jYxIpf2g&Yt_dmB z!46fE=1$_8Gz$+sSbbX$R*z66DhC+~R!i_CiS=Mrn0Bx0Dpz+^aUZPDdWHkt2Z z^!SFP1-qAUvbBVRwG@lU663|^pn$S7-z^@YZd=6J3V(xlQ09W~n&Va9!-0;nSp-Dd zBY_^sa-n0Y0Z(nOgMHUgKSoe)R4CyWI)<~*QL+T(e1!sykjgEpW>M|0dRy2VWy^MU zV9J1w?D!Al43NMn)Yun}$}Vk6rqeqzr&rl4PT^3ND+)qHt|fl+5_uX~p_`2Gg^#;n zwD#S`8Mxhbq(~MQqKUx2dsWOrf`)2QOq`Fx`HJ)Y|LI@B)fy*`tmeYe{vAvIO1Q@8 zdJHh7fBlz2j=6t5x8KS7*C9tn{(srOc2js9i%pHi!R6eAoveQiQ`l)>t`tnYf4%9K z+$wnRF#1;vW2Jw+<)r;=M_nc$Wcdr1EZgxfGm;kEhIkREi22=&+!<_ zQAceCzIVkVq2UJ+46C{4L<-(%cYTF$%(d2eq2~1A)7%cOf8qT*)fe&imF9beR7;>Rw4aDv$J^Ir(QS6kF`1s^j zjV{tcf5Mn1SC}gM#cfanW7gguh$7rU?k%g444Dll8PM z@|!eqVUFIs)xqupCxQg*`$r&q{NC#9z|`*E-&}l=UOrr2!ElKO3W4kx#2sQ4cW?~i z*7OiJO}OoPk;Sd?1}1lRtLEa%dx{I6sx^ITq!4+6iR9MmxqN#W9gB$~S5~f`@Baw>6FZQ+y+Emnjp|}}U69jEE=AjfLhC&p)6-fYs7{}4I#hH1uC{gBc2)ezc zw}KsGwbcH9q8BXKh3mb$H)@vbQulHl2MXeduL2!IT-{E`srtRuYoq1_zBGz=6MH&Z z%wL%79dR6kb2O=l_kTc;HU!xwwCL1u^#2xp&Ot;+P&w2eTH*;?hK}Qvp0Ba?KWP7v zRi}LOHF?n81h+m{BHN*UC3(n zeF%NRiTI)`I6FsEYbfBBU_N9vOL+{EI>s?;FE1m9$!$R{=iEM)`pgLqiy7O9ge6Hg z4n)L^vx!3BCb?)cyY$Fu)QVA(PFgVlk=xPg1D1mXGG%ds3~ZF9q;LoR@+7jU*@t&} z;@@Y3z6XPD%?=dx--j8Ok}e1!iGroB{$F3Z56zo;7F7DBGvS}Z$gK_$iIt*vQmn8wmYeg?^es*9_)yz{aqUGzR-X76ihRZ$`pZx*bHz&$EB998F8#WJ3J_-#)k*xwJ&p<(SiMua&W;Zd=K~)#y#NqFX=cuT;T^_b$qzGQr5&t`{Dgo->UkJUVXIc~lFJx-&&v;&A}A zQt`MVIu9;|&BEZ0Fa`-QXYJd=#GJ6?IM7BxyIRSd#2_zr2HS+esXZACQW}84t}~bc zpGLZdijNBtAJ(c5GHtjTu8hnLg`S|+-NOrT>_@`q$^E9z!|(v0*Zbb1mr+<2+f zisWZ$=t3U+>v8PKL*+@wZzr>hdt0^Ifukti&dM%0>rh-Da{Frp*hWu#Sq;VGrAJH` zyD^fpw~7_w|E8DYS->$}?8Yd?zgy5YKWm~j?uE0jWM^j=Q_fzWLdD;&cV}-ClD{`d z5{@ZJP83N#6SN5yG>fz6qX2Ygzg$T|esU{Tb;s`P`-I0w&*<9rb6cF9c~D8C^fx7o zw!~vSAA!X;nD*xE2ZcdV7z4xE$(*1)3AD-C+sK^6;L_L`91{jZdNLqqCk?=0zg?W2 zf=F?8#d*8>5Jw-_*%ihr^?_!R#n~0cKlnqkw~d^e=+TqV=}FLd!kJUNZJ~d}A6)Z+%*qBsM=)jq=kLG>e~-*>pdB>~zzI za?v%#?x(6zzOo089*y#a79Mn8^N(wkw?Ad--q>dNsd9=Jle+n7TI>u|qddPS152ZP zy)alb+wfDx`BL>E&+t>_jsw*PH+`svt#y|_nnHWsZ>lln zk&Y2rEwF$&)zt}zzW8w}e$ZiBd8dvI|Ed$YovlJZKwUY6niI z2D~U4FKoN;BG>@ItWZI`T-hS-c`pQAQ%jPo7Y>#@1(Q~O*Ki0{1Hs1XLUmY$YC&+8 zmzYLkVg43OiQz3uEIJ?qXOiGhF^Dyu#L5$~1{0Jsl2{j6#M(8Wn^-U71*D)}ZYtIO zsopyLL;V&9wx#O^(jfw%%|Eld-mxz^7Y7XChCYb^IrMX^;^4M)!@%sWE%qhP;ZPvI zM4NJ}9;h&;8y}p0iDLa6#X3rx@abLLeTuVvu;z%vXTOBcehHub96lpa;MRqrlMwE` zkiyHUw%^i|4l)Q*Y*$~6EEty5P=Jh|w1kHK+pk~k}%U@d7_E`uMI5}!!mDh* z9U}_*D_AEqp9KuU=ybf|!HRJ}Re02^pVr$coy6g#M(qwgYo3PHJyzDSIs~iHg4HiN z7RPp)pj22;?(Q^>w28*3MX>TLSpURgqh6G17OV>_SoY{xEM9}49C+Nc!-6BdGE(Bz z8(61=?zNs~71`!WyiyC+F6*&W;aFDjax5rL@^c#O$Z-Je9>v`t21Q_}ci1`)(4_v^DsI9@=rpCE@NQ z1wv1I*%KT_^fsbW;qJh{7)2XXkg3AmJ%2XQr1S0(?!MhG#xO#KyMMHh{1M^qO%^mu z7(xA@9!6v-NhnfWZ1%u0jO|pod*DyqwdF8^c~BpUh;cU#XV;_AZ_yaW7)GdYw<3&z z5k{y!J0G;+gRTyp!LMUypu*itdor+uyIl#wpgAno4XL*+VS(=Z>TN?!h&Y;N-n1oDW@?I^v49Z2bcUf zNmOvV+Ja{BN-9v@D_@Q`J!UBxXFLy(V(>~8+)nMmqepOiy@dzgFeE&B8-%HhLuZAl zd(YtZ?Y`Z-at3mJF}l49ZlCPQz!KcfQ4AWw(hWDMx6NU>hVklcOIS>M5x-SlNxo>h zrg$Y9S{JgI=6zg0A~@I?Fsu{08>@PI>3vmj@PY-44i$-lWepDQv7k7jqv%nH>U}dU zShEm>MPa04sovLS!Pm5 z!yrnSNMf2VKz{|>1STyErkr8CalQck71RVKj$r&=Y|i5C;Hji@2Y-UpV*#iui>>qc zrL`<#_`&AuO1yUZ`vf}~%jx6IyIKw4;NgR6&ZdYyIfKYG~aCenc zFH?elct}D|%FdyvS^$KNDXnkT4y-kF~fy9NBnliCr_cGP;F)mWZMc!j^KgFjyj^fEZ6bkQwsX z3|KjW+sp9@+cPy{;b)7$K5hJK8JW~Fid;(50>qH#11?bv&&3lX)xnagbXD6IJp%4{ z(}^-7nbe5`SOSe@lXB#Pjh>ucygY`a z{&_yV+Tu8P>SIU6mev2X+=3USlihNx4-413Fe-&qVI>-iFshsVl@%{aKRZDehQhzC zSf`}=sEp`ocUj}@s8=0r$74NI?$OikM)%4`pAwfbCYMpsxo{(@y4pZE3nK!g8ipqA zR!~PtyIKquPhVsx(i;oa*GV{zmnooIX_3 z2PJLo|0C^7z@sdZzoW@uT!=GKqESKP3Yzsq0gZyY88>k!kSMFDK|!N{#se1>6b~R6 zqM02gpu%o;70s$B{uPZ1njlBGQBi}UMg<89I^j@6jvziW2D(u9_@eyp&;V(9+odr1+TFKIn(pmgHu zD$O5kfW=V!0>uewWKMTWU7S0ZtrH__8>RM}TBWu`#1kKZ?un)nWr{bLRCYQa z9@GfbF`PuCF|OSiIRf3_oP;vPnPp+JViJZeJ|ragn#?d;EKwP`WOAl0{!L}%P=;xX z=W&J_fqcpU37ia(O1C%k?CmPHD5-6W7;diIt%sXPJ52jrpj?zX9)6x1uO*St@N>HX z7DMp|{+8JA)7e0o!0@wfoLzw!TL0k=duZ5aciYZ~pNFDoMCtr(28~;68V-k_%rF9x z8o&8h837ugE_(P`ak^!^@n|TWpFP$TRHVv3u4s5bBTVH-sEjPiFjan_%IHBErpou> z3{Q~QB`qhEloAF?2_S0tx$b09c}Y1`#|UIXI5@v1H1IcT2y*43bkx$^>G-IF;9ucU z?64u{Wqbfp8FGX(HRQBE-#O-JW3;*BBpGce4XxT?k2WQe;iA;>Xmj?Xx*-x9ZGL;i zfQw;t>wigbw0X`%n!sptn+X@g?ylC%kWcnKf(Z%Fcaoy1L|NX}pN%ms-=-38GNMMC z=?{lVHPZI(0d{yMw3`X7MHPANRI4KKNGQv@v>g)0Xwy+hRM0A6nCb1k6X7F!BXCNoG})a@a6Hq+fAh>JMLs>rifU#&ae|nkO1n$SBM@I@ zKu#K#k<(q*p`c@pzvLk;W4uZ0M9F5$YTpqiTnvrhww0Qn@$Sca--p;ksAl-Dk4caj zHP0Dk!o|?|63q-L%9UL$MR7jEKPH+=l*a$QMOB%oyw$~`5>FkK#=rKUA%N&;`lG;3 z8ehj!B@!n%C!sXn*A59o<4+V4yfPoA@kuI!wg`l2{7;+36lmEzOyfV{3=i#SC=PB{ zBMgD_NW-b;+G?mh?^QrLgVbM5WimpYMcq}}T~bl^Mn;xSnA2VFp`ba(2|WP1VFOIQ zVg%Nq_E*@UwW20>MKLBeAfHcRH46Ugjk3O>cn2cg)j>E(Q)z}uyHe`dnOi+tS{69j z%;IfIRc7{I11yG>J<)Omj$IH|d+%c8o&b&_DI@!vfieMS&SQYZFtGz6;e-@()$x|@ zJ9p+@A7u+kXha#g2lXjdyxG0UUXlm;I-F><cx%$}qM55zg@F zt%gBDNeWLGC?x>uzo`>v=Shzy|2>9PzWWQD$|%yrh0_(Xbk{w|vj-B)Ztz~&VC9OX zcP&9Kg6t=PgRsFR^aIt74RMe{C9{|27T=-Al{eCur!=ZY>!m* z9-QF`61$|^gpyLiKq&!`t~c>-&k$M!$>^Ud+AS$*bvh%kLtzEYb||bjN=JplGVxJ| z!d9(|7)+kQ2Wv19&eULnud(JQw;d(ph)Oe5+Lcnr7IwiMb`R!6uhls6d#Mc;!@_=A zo7gz=ih4879H|k9b9}E;6pbhg+xx9OR(J%|Gm3Egjd>{exbl2@D$ZCGb2$PzV^t(-WFNuY_jy2(8DEh&# zsRK_S+%?B^sYf8Rpz%J!g1| zW|F4oC`~7D`c0*w@jNkUH{7-N2vK*Hc9%44qC%L{T`N)0o~2+$@&xFH%}A~jMuxyT z1`PqspeAqm^1d{HRDu;c59=u^!(S9F_VC*!_;D?qGS3X!$%oij1NAZ}oKEG^b&((N zx0GnZrHT0s?#cOI(~d&5&5ifB@xgg-`LezRZL8dqXE*VIBi?Bj;GK3jaD*%zI4a;Q z+0+-9MVtD(`89J`;V9SeL?XzvZQt(Er!<937^6v76}nViVZVVrNn zFDF~H)gI`JOLQl6RLk;jWA0{-*aLlp0d-DnD02_=CpX)KrhOBakYcaeg2J=i=fi4Z z?6!{J?-mnm8Z0UXn91O|Cd|GsW5Q@sio@ME+4WkwEiRPWMBZRPofR9(VgGDCH);%#{G$|#(&;g#(92ZPUu*3wLxIQMB$>BLB%;xW6 z!sy0Q9PS#VD|S>%^4hpiiot~j)E&-7kVyu}XO2gZ>ntb;@E?vxkW)>tFPx1aTZ*+L zK&lU5+PUu?@5jLRfbW(uWD`4dX_OZFgA{GVQuOm8H&z(0c=Ae>7fmxa%z;B*VQCOF+f-bbCB zQfa`pUT=LZ{aaUpf9VqGRdh;4-Sbqxk$5e3y~-(0kl6P;UH8ca$V!)!Dl_qHiqNA# z5;(RFsua@{K%eutQ=z*-q1#^Q|G_(-SP31a&@}*OejV<5N(CY?>xsZuqVVxSm6H^{ zKL|eFu!1X_<-)7b?2nm4waq@AwZ_;ZE0R_ z1Y)@A9<=UCN9ovgttabiW4`vNN_kt+Idb6{~DbI3Fn94io32; zq^>}UNl1x0`?AtKaUFTyf&5|=g`@{5m)N7WIeV_13A$--?!1kfA%oJ;;#C}m>wyoh zH}D}U4EH2H>M&gXhY>TV&iDXGo?-B@9-3)jvw>$C%LY3ZN+Ba(U~CTIzeotDsWd~S zT`3Klsjd4Ug3jys(9(p;0d)oI2k4+OQFOQ-pZvxZOjBuwO1n}TMrU*+ojiQt`m`rR z)+0lG}HlPF_;rO&&YQdrH(_Hw++;tP(tg@=Nn)#B0ODCB?@gj-DTxSKD=u4(+^+H?h#b z9Cy)+1#fh=f;;hOsNl|{(KL+M&XtPBc62mhv7O#3qlq%iXl56c;emCB#deZ8!()YY z2qi{?AYq`C0I=bL$E?7$#ptJwML(qiC!XmuxtOd-qt;z#|HA6tT~ZG6kS(|de@8Zv zuE-2t9NM>nOrZmr!W4mVQ5s(XYh{<-jepmT;Oy2V71i%%fW)=imrs7y*7n@O)LrGaQ&#mSPB zGLr*EHdqWZ*}N#R#jpP}P&(m6naTYISPU~MQJj#O46>JHotud}ibj-~>~F9azZT;0 zT!(ucl$pFyXo@p(@v98D(ZCf`NSoCDyzb6vC^P97O~WvgE{et&&3)()W7hq-Q;NkWj}RCgKt0 z#8$)lw?oC$e?=t|RKoRNWvqmfhU@=4;VX$C!t|drJV9cZ^qo*rN*E|50O<6zYW#-h zG(dh1Aw3`7jGA_x@}u}jlJc;@h5|7RcJ=&%#|WP00vnAdj4AZt0&#@-X28X;igoXkRV1)L{H%$ThJ$$5FDR=RX2Qj=iUFD#vWgD&(yeo= zICw==m7}a;^ITPBqH>4x)mvp1&xDhR924#acCw0WXb%gPsI0Q@0F7sRYEbCi4i&>H zIw&fQr2MAyw5?vqha#z;(LH(G7T%(eivqY$KL?4rGDvS! z*nuTO>~Y9M4kDRZQ~=u>d~F{Ama`;28{qgXZM5J!SdT*%o^Yl}a9~yvfXbK1=7!g? zFbMWIM2(cA)<|bmqYP4xZG#Snt^*Rf4shri+;P-8z)@>oU``naMT^FuQX|oprGR#w z{t1nXgJ_zRiL@E%ACZQT{t4-Jq!%TyG~UG@THN?PHypBOY)Eqf z=Cug0DcFP&hoD-6xmQ8*I@STl%cz%{U?s7^OeQ;+Fw0w=a`@?AL?q-Fx8&mz-#8Uh zlB_ntX2xEAH8~t+!W`Daoawjhi;XLS@6ie!q9-lO9WSx|#eg~|Hk8SCCj(?!>{Zza_P)GKH~dj8UC`Y) zYxf!h>ap0{7EJa=7$95F&&d0a6Sg*DB*6j__i_F?CFp6e97cU77RRV7#TpQGkXVAF zUI=S%4V+A?Am_OuQpC-f9%;B6z1z`ALkIeJdL^_2z}R zMsJKpO&>zH2x{7pWTGz9sA-E*wxFgmp$h~xOIid6u2U82N{yO6ggT&T;AHSkLL<40 zh^L?s9=t&b&D-3hwu$9gD1f)Ff)$h#dN_k5BkgLD$wW@z#0Aw%#Xp^XhW^)^?!F%D z(YS)svhW%A9WJPmVthwL=wU84nr;;&ZoqRk7dvLbOjV42hps^}Y~RbWi}k?gK*t5O zsucYUoy(<)vh7ki_)J$6)^RahQAi&`E-GhNUlmt3KB6S@YQaqS{yg5cSBKA?ME|Hn z=&sIG%Mm>Q(SYA1s|72W7A#^VzSyi#ekjl@Hswa4+=z1RP;SEKUP75lgnm7aC}UIO zii&3ZX39;9@(dc-ZOW7%N(W_hiy4EK(}?a#qjWCjPf5I9tyjWVLOfo2&gd&^Ww{3f z6uYvJdgl{_cOI`RzxgJ2uN+sU*NoIh-nBJ^iZ5o|w2WvMyT0HwJ%6UU zosnNr3f(OD_)RAG75TNeqj3zQoK+Tqvd&sgeoCQyOi=PmPGMXgt*|x&1z~N#x^X3A zoiil@>q^3keV&8T`U=*xa|CO!1|`*XjrZ^#e>r%)zUX2qLAlO$VB z$I|%_JV^+%GOSxy11suSOWXv8XF_9U@}DC-mhj(MDiV8SbUiQV(^Q(F z(yo+-p}!&$eTG8c47U<)w1-qissXBlU0*JtN)FDSNtI|>BbA^uR5;68x!oY&U6k^K z&dG&)uU}-1lsv_Bcu0P<0TyF=dF%gC9K!j^?H>)43B=*I^tLMyV@lcds&GQnu21dw zwevXq6Hzpxrjnx!8og~A@m5vUH1dov0+Cb5)|oP`8^bXdc}D7)PS*4>9t|~pT-?hP z6w@%Kj#Cv43Lb_{9UoB{9H2C(j<>3esEA7eXLy3dE=?697TKFcU5V3Nhvzx(YLNB-07}$s}s=mhMppU1lOGW23QPTf8dqG)|@UfP$r=3 zZ5P@Vh@tCSU$)nS^6Zefb6tNXibj;KR~j__&kl&k(?g}}mxd9D)b&oljZTiY0O>U+ zk8>JI*T1~L6jY?H&zvDNID&3Q7bmNXY%&5<*B?+Btsb2!? zvL~5H6R?Hv&oL?y!xlcNQOuAl^n;^lcZ4lG8cik27D`PjSJ+hItqmz#I5C_=q%CZI zUV86R=miUw>H_aeN7Lg`QReW@*}G>3_bN)D)mnZsQw!$TS77;&}A@KJ_o4wrC- z8Y9Zkp9hI`vIRm;DdD1&Kw%prk;wT$YY3=V348Ii!3Qc{Ov5Ap^m9q~M@j5Z9jF}CHSay% zIh>0Cx(_VkfY<;|B-j;@&{u#1Vc;9PleZ385+@p`LZio?Wj9bu7LdjPQ^DJB|73ub zV_qKv%#7l_V#2gI4uFrez;L?aAMxMcQXF1lf_>pE0PZqj`oxBbh=YETEyAGi@?7Wf zZv!eTHk2vB;RcA`arFCq1%+v1%lW^>Y${zTCBMCA>J~n#Wm@crwaMOc1LPny*yrCJ z{vLJ>dZ_~cKD>jS4Fk=1U^b0No-|4e{d^%2PDGSp{i+hN+H5Ezq8PiO&~tj=Z+A9c z21_41CC{C`d`BLvGY22>;}iN3%#|Ns(hpu0L(X^fV>(%iJNswAvbDIgf5e}|t0^0~ zCCEh-wFI33!o(Cz<<~F}IWEE9h$ELGK|GkFQ~o80jf~{)bH;EozYIwcqEzZM#cS_S zm5N=@a4H89RB%ZSK^!?kp?Jio?2y^_()n1aLz*-Xo(z6wzwJ_B)`LVATD&98mm zh6AJ!2*?LN2ut zh{@HkSbdEVqW*%IHx8TJCM(p`AA&G%4g=41!gB)>Ld8M45`}62(lGWGKEpLuZzs#i z4V=rsyX+%8I08f6Jk}JcDG}64rS=UB&jRB~_!F_)Ogfj*gh_*MRr56PB=-ltF3eEHI^lV6Nlwfdf%Si)QRyY#%9@RUHxcdK4e1 z9a=$zw?ZM6a~UjM%;0Gd(*dyOfQlGUX@*L>QW_Qj%a5ef86T{38LBcI%L{vOTG!(u zMMtF>D(y;X7@c+hj;PP;_`vmnSc~=H7A-{9LhRej5hA6bP5-gaWvs@BC?U?q zM}01%G?M7WLX>@L&@Cew!pyj}WOkQPOAS7l?wd(ZOI4I94c!IGYCn3Ce0NdmIKcPO zA9Zh;(0=r(23QQwcEZ2NnRLD%-D{vsAn5T211yGHyJwnkLZ0Ba_C2%CgB~xRW(!GZ zL^-uj8#KH&4TnLG{4fHMF6{}xjfSttf+^|!=&#t<%*LakJlYLeW+fsW+IOZ34e}hr z9NPb?jG2^SI-YC^9&jQSvW)p0{&81Gy-5JkMKrs+Le<^SmcaxER)O|I-Q1 z^DZ=zCNR(Y{S>1TF%06zr;K^tpH8yoM$Tg%Q=_RwnM9dMWzvZjm3T8SHP5>soJ6Ei z90}}X6s=GfYo7N@rei9~Dn9BOCay@cc=k!5(gZ4DW>Ky(Dk;M>i#t_D4P}^S@psPf zT#KP{5FetYluQ~uy>&8!=#Y&NT1p8EhJ?tI8m;cCYiQ$JK%Y@mK81Dh3R}qfS9#RX zZ(pQ+I#-4)N<$YuO+%Inq>?1l8YJ6ADcekM2m25MT||C1DuAYp%W<|9u_zikhW+%M zLVNKvyYbmm8xpskd|2$MJ&A8bL&vbFsguLlqmkxM_Fc$*9Pdo*8;fF;b^S4#;=}fl zz(eeXNC__v$LKfnwH0s|l!%AK3>4<55)hc4JJ6#%j|UieeThhFM*j z%E+V))9Q8xg+~u%m{#{KXW(EmGRU9^C8dOcQUXAV$O+zP;=eug{4G0q9=e$+J+1mZ zF&j!l`zBj~b$;HDo`_FRtB@itN*xb315VUkPhuhVOcO4Kxul@l32kg&l9?bg%0vPt zTnyuQaFSw%RA!icAkg`6(>ltHAMR94u>^&Ad2i%&2F5N!lc2SmX#*#|>|QC-e* zPDQEz;C84Oihr)6QU^^8Q~b^@M-iofrl!dEk8n2P^BXLzO&!%%SEIz}mBpp*b; zqCvxv)_lGe0K-isGWcFGq_f5_f^>CZT6%Z?Y&M5;C8gcGGDo@hMVX_JDJiOStg!eS z{AR?Vg_AJk$f3Z2g2Y8B8;q092&W#edaJ|^1%@(guo&j@g+H+c+Gz&L1m-F?8DKGN zrN82Y)T{b%4h8<+IkL7Ha98I}`RDYlFp5_R!?00mH$qwzjVNXRy+UeBG(LB}Q$RULucw>hj8yh< zz)i|tP2wa1eVr3f%HBVkfT8SNg#h0l7&acHsEq9h7KV)nTPBJX&<4h^@!&Jg;GJW* zC4u6V@O}uKQYsC#o~G1UUEAoHL4Cg{b;f_+V5RP=((aP-bX-|OI&Wlj-GPFRwY<<{ z%h!o+&6ZmfG7PX7T7D$zn~0V#b|=P(_J0hp7+OB2+}6O5y}`hF`030j8c|x_*`RTy zO(R}tNNM@Te$bF+6d1l8 z{{ZV?SKz<4mqYtV)4M+O8XHD;N<(YQEf?or`R=0Bu|4!nla@$u51PvWi(wBt$`W&N z-tLqbC(0fkF~DNjL#g6~I?Us3J#uajCq&VRvWFCd#-k}#P$-_RDtmahqh0rCd#D^Q z_K<|mQSU+f-advHkA|{`tD|Wc_RvkyXoP}>*+WN_QA-)7J?t1KTuq@2(;mL&439eB z4Le|+FIKmM>4%Oz(^A>b_e{^_e9vf_7|fB`gJ(F|29_TO@q#^UVU|y@z={Tai2wQ3 zFkaY%Y2lEcXZ`>b2;?{U0@G++3x=X|c|IUSinrpsMn#LH48`XGoA^8+!@4IYZ{ocO zsX&R11W8D+Tt@3;v?YNL{*B*AC1g1+Fo%}oz1xA}1dg#0|BGyX-r51$(BffP-YekmvpYQR6~N6=p@ z>91qxuSWXo1p2FKM}A^^E8b1D#)FpQ9dBGHGoT)gy$8WucrP+QHnqlG;a6KfPB5UV zVsAi**cY(jD7#X7V(&pP*?YqPDTxiD2`To*C@9)h5!x5GQfk}6YB0rL zvI%x%Y%o)PpSrY0V1rJn=#7eoiS?)^|zihO0mm^HUJd* z^S5J@PYw6T zbi@bZ4+pns6L91mmYtZ1!TerA+WP02bOxoN%R!d<6ac4vDH$$G*)?~vBmRF!XuU}+ zTz`iN7sENfb~H^98LzY3nL3+DY2xhg9-6gDMkQkS=PO4kX2?OGX-71ihwC4RrV{0$ z-)d6nXj5?*u0JlEL}X-UhHxN;KZ(Gs%<+H+OgEbDAY8-aM33y5@lij z`CamrFT@S=&#zV)BVk5i{`n=y@Rt9X`Wd=Sub5u~u}()(aWz}T!?;!F(p)BxUrmK! zr^Xq;V<*`Y)3i;`isn-q@{K0V=i6J?$#)l}j_0H^4{A9i6p6go0E?maH{F+5jOG*r zrITopnv?!?z^*_HonLdW9i#b|y(QiGoU}ZOMwG^nG-&L%H>Ag#FRD4|AHxVl>if=- zqVLT*Kr`Gq0W~3AwBM8x6EL*>X(7P-4Z;-uVU(-Q0;-t|cLO?rxIFb~uDHTrmdJXRtI>jhS7OY*7Z&$&%j`)3GG%Nw$Bo7 z%Wz&cPK%AhL7#>h6fnVL4n;hc|($&f%q2Q%aGY!vjJf`jxsND#HV- z3+o*6R7NUgn9-`UIYV_0naG8)TL)mMv^M_cmhWQElJzV>%`JZ1V{zY-0vs{yNJA;> zt2LlT#I{+}`oK&l&He8Jgg zKpP_FKPAvW^c)!MiV$VAUrgYa0$c&mwU51Z(D)nn=#8j#QABabqO108BQHy_QbGxi`Y?vSp z<#v=woBEWD8I*?h+-WUxOp@;|N*#|G*Y6Z1OmLAS%K(cpW~8A?f_4AcL+&V1+XFxT zEiq2inDH+IEXJ5oe!IQL;t6{Tg!3`u!YCS1W5%fljcv{^d{7SM>K%67qZc_|yiJW6 zdWGXU=LFQ4F*2Hf;ZR;K1fm_vKdFpT7)scf;ZYf5D8n2x_Q2UC{cWbPqL|GO574WW zN<+cP2eQtJ_&6^;W5HxGC`s+DIm zlH$$QXUj78c_v&8l|KoUPbhTo_4WjrQA+rg$Fmhr^g!!$%<2sLCf7^FPBb_W9*?E3i;(fbDK^8YtU zx_nAQDZ|MGQo2z_wPd&`b!-Adf7U`z>}9VCOi%&N1vZ3uRrmjv+o7p0Cn zlj9AFiHxV;wb(*Yll_`uXI!wL1lvgGmf;^X>a4|ZQ%QQ1& zg9mLJbl#b42}M;osx$d&u+e3qV{vNf%8{%LClMKa7zFI$oyiJ2{NS)N>D~?rqchok zBa^70<+iZSWSz>O<+!l%bg9Z{q6~99eT_3D5^r4sPvF#_%ug z5`Bp?V?5skD+TQsV5Twd`_UkEh?rqS2x6%PhPZ&oaR?%4f<53Y1Tn~jS?hRL#UB+I z?W!2%_%evCn?xK0wJ!E%2UCLe2FMivX>Waa0B!g3PjA3oAc4zDTQBJt{M$i1B#@Le z*N1<|SQo;{!X*qVQ36qkMkIK;5;vd@U5_>3CjPk;7g;vrFJJkRg9ZLCiz>DuaM6HB z!{EoK^m;W7f22QNjZVp3)$4v-KQZAzEpU!2vCoouuU*i93r*)@4_#6{d;mO@N%x+5 z>+@cxN76&TY&B;kB%6S$ zpnSQnplw-UpDpgmo1xgK@VNVwso{APSf>N6Jx5TN0kwnDIa2y+VI-?11w>TG4(4+$ zgCfZ7s01&C<&MCm16MRqVl(5)E zJyPJZslQ#)F%O+u9d#@9v@y|J-g=~a(lGQjs#`1YqXQFQ>Ct+A<{OHDa7Jz8?O^;1 zt9M&*@O?s1;K!zxg9Q`zQ#UsLxI+JHJ<{F+ve$e_T0TSxLwEyY^laOuCK;%SLf`3t*k_)ij^~oh(o*s@RA={4TN=u6&ri z#Hwj0!FaYa`k7Mtz;{eP3-rlcK|e>+zxmF@=ywy0uK}Zj`u9-vx9Qgj{Q;W(KkrD4 zeqU98XY_rl{_CXvkT{Q}?!o2M1H=6+&juszsy9m$<6@xTodLWKq);NIAB^ULhaqs0 z%UrCvJuxos7QClA<6?}I{&lU$qM&>Qy11o9eSXv;sZ}B=CT1qz1-}LI8h5+aPOpQS zHj5nwg@&id|7IqT75ewJT#Ww1{)xZH%8{^@Z#4S4f$jBmO@g<#!mC(vPriftI*SMy z)a18~UawtTA;H!1EsdMZhVEwDEuJCUXqKV-R9;bJJtwQPvn?{@jw z=yw;uU#f!1S-FM6qL6myQ@Z{(ip3VqX5?`z_rQ?aD5b$@WoqEJ1_g- z{eyis`uy{=0D(2jOtTIjqXJ1q!AB1yy-#)Fj``=IY>W@>`a{yV3ri{S8h!G@Ba=Ly zFz32XD)ZFWQkkNP-Q&;K8gN~NPU~4#gTUORVEP3no=p|+=bzZ8y7U;lL$n-|02aXb z%Ye|$V|zTLHG=eLg|y{7ND9XXxZVM-cR|~tg7Uo(;x=fKNKc6u0Voof$g(ha;}N)z z2ZB;k#rVJFl8%K#zbYtSe6X<3=kBVf;Ejk~w-R`2%nA>foc7 zrY!p9)ZpMtQdaNFOa1{G`abDn|6r$YeTz0EV;Q;@nEMAiZ}ctt9zUn$0-fk=VX!aG zns}Hr_G(i(m`5>D4a^tfa|SREGki#t?sR^jFnG=vq$luhO7Ptm?A%yK+5(3MZcTyz zlcEYd_x9K=q&97A0+(Ze;pbGi=VT*bz42ZjJvZAZt#-{Nks4-S&#u1B!tY;4X~_f8ar`a*3EB=wH;q# zTbnI5u{xGnj4mYU4R)})L~wzMrcXRy*$`FGU3E10f|ipW_}Z5E%J<>hM*PSNu<8{C zMDYTwc%t?NZA*&!eB%pb1W&jF3+idlankioPI{Mda@mte3InbeIO%>rC+AM&r1vx= z@O*zho|3dSPP%&dWA6?8>#`k43jMBR0`PZV!@thm#7XbnNXB;zTy{$6l8!B3lU;I8 z*Pg9f7P{l7OFFiF(DsS1e6bJpY-{lLLD(S~W5l66d-CbIL-*EGq+%}VH7kBTM;OnS zZ66QZ(F@jIOg(Q{2!o6{e4rtZzkJ0(bhl()Y?|KpdytaO&B4Eg{%I7q!fPn7_Y(eV zcai^Na7dr&00k0MNs;P-UwGP)Vk;F%)PDZyIaCf;Y;y8BRExT;LjQ;<1;HX;L2!I# zesI7M=mn^M0T(pJ<@u-4xK|Xs=?G9A3CKDu;K6)X+M znAO%en~$m?JHMJvr%|QRM^dG6a*c8fD@OG`xG^!-Mha^;Db@-C^SDRo@1NH_2R%bU z`Lax55>B{q-IOtN6fO2^N9JT~ta*+Z<|f zyAL*dVCg-l3Nx!$i=6Nn6KfZt^xwcJ={NfWJ=q^z#OhK2z{bQ20phDZ7#e zZ0!M|4SIs=$I|Pz@{arq&>g43Ay2h>rn^ba1FYYWI4gHx#1vQt)qvR@zH5i3cqn&Gs|NIh?z?%F%&F1gJn>u?A)3ZaQ6p)5t{ zd=SDY<9Z$x*eV_@w$-M{m}SJWinW6LOapnvm?vMxd~T5Iav-H4tN{YtayBH4OF2~5 znMM}V{p@<1t`loibl?2cmR`jah5WPGM7NmfQsutEZzghvK_r37^)rc-DI&v}2)rh{ zayqM@k;QZ;Tz6QN`|J~=a@C6Nu6LwzM3*Y((v|z-TAN4$l^bCasZ>NNnFuZ^w=1W! zMi^OKxgG}H1X^y_$42F96x~c!IigFI>w(`)Wa7ZYDi;#9oMIAbrG6G_`O({=mgE*G zwbWU)Mi$due~nGoN#zvXOp~tX2cdf-BQLHXx?~nv=suW8(cuw!XO$trY(?bYTcRF> zoQRN{$MeDZtErFL$9?8`+-Dk7L3;|tT~n(_?`ll|hRb-w8SvHDj=ZKPhHEnJywpan z!*M{bM^h)-rv&xOM@AizR2|OZI^f-QyMc6;+sIkzq+5v|}L`Gg*L3BxW9^F899UhT; zO(Hpp$h zf9LI#DKadz`49pDncSE?T}mno^2>gS3-V|iz3YqAh$fn;o5*( z{3m-t{uOpzP(h!62p&xyQ3l#$FrC$N_!{o;F!?{Vj)E3EhsWgqV;)=<=aWpG&*8Jh z+#gyZVr3kEPY{PsaP(FBAkLW=kPcNxvZf40K!~)4v!!@svAIc z@qiD_-Y-X#><5X#VfH>bFR_Y^5vFPuOU3#H<}t2*{&{`sYTv6TCTx5$Q6AWy3WsVR-h68<96TlX(MHz$oS?(5^zU@ z2PYGObA*R{gNF(|rL6=;8iI%drqb|onHF&;MI?*++1oBltnP~L$MfyFSLj)8CetmJ zrI~=b%nMIXlL3=)F7L|?mRQfzS1LMK5rhIH5k6~-6UjC}s!Ry=&P&C8v&Vs!9)l8) z=dO81z4Qz;=LM1H6p<$yw?b!iHL_Tq_w=#pI+<80d5$&d>PhL!|H+((=%U^vH)__9 zmggsz9=<#~DT0TRClO+KZg*Fm3|faF&l&F<^3)T?P>sm5(w3*r`q;=~c|LH7O*a8~ zo@>(8bI37_ytsns8uDz`^86AjFA0x~N@DEtNQS;7%K?Fv7Oh5rVE zl!o72<7?`)WMrb}^CedW0=VjijE=-*F7v8mG<9b1=6I)`?%S_78pLxs;P_P?H2lK;e*?DlK;6 z;94_&4VoCDZ5c9Al{@zN5MD^8idg9NqVlxj9P$NF*8u7YDFAvVG-={u+Qx#t4Vk{S zMVO&s9<`Yo0uuGLHQ>w_K71s?mo{MG>&Ssjvv|h2`8=wY^BLznsn+awL^Rx!JO~_4 zdy-WGKT5*~_)-*9Gi4bs31f+9<<3&9J7FinG}1Fv_OV9H8{JjS=N=ZTM{80PA{zl5 z39|aZ+p4PVu-ZL})h1^3%X1Ek)tfXaVs$8RB*^M18onJ?AN#Eos>dQln4nBamS*II z!G{n4N9=a~*~GQXsLcTQ^%0YP4uG$fhJ5WUyW4Yv1Whp~cGD5?5Xdm<^9}>`00Z@^ z9U8SBF$pzwsRLjoOyZfd66bzft-CfYt7ZN#nzf7L?N?L)_R8TE?n#8KD2X$!BH zg<7`{p{Dks1IJ9F*I|$-GDx&+*WBy&k+aNL1)+8#lX>CHgayCl4XYA@Crt2p9T574 zWn=(xqLP2o#_V!gylcrPX|X(x>xB|UeUX8B@h@5|TJnUNB;P}m_^o^5BtD;I$;I`c zMM6uSP!ow(vIUa-Eg<2vvr;O5uT4SlV01&2yA~+5=O8Wvf`cB=^F_3b2aX6i7Rs4m zH-g5$C_kYIenKPsgq7M)XpQz0w#%%(8wtvJM0>v&?<=p1tk_RDa5~{|?k9A4iz8n{ z6%O$eIBXoi18Pxz0xlww!}_gONLl*{t?(0YpFHXs$j1r#(Y0tH=YE0+9=E)c{Bfl_ zCmf*Wv6$B)+*QB)k!t7MT_}{=RlFt=LT@^gRR&?AkwArMIQTsDZv++eSy>^RYdb?(Ne%4_zeX>o& zlJuW}>TsF<=v7MyQB0q&nQmpK(NET#N=!TSAnum7yhBl-aL31+b!Vpg$!2H+cfsk0 zf%+H&^*=4tx}PM})QROlgP6p)QxfO?wV5Ix;{God3EfW;Y9i4DQru5&rKgV_Mm!!B z`4rd`1W!aih*$?Ce=`s#D*0btv3b9-B~tQ@TJnuu5=TANK%Hr!){-aGB$iw)`O6N2 z#03V4k3*V!EqOvsBvxw4zjkuMlK=E&OFn`pLh=Z7K=P*maiWqRZDV$|{G@r;I^Uor zKN(LCCyM$c1NF-mYAty}O=9tB$?rcgaT4#%u;k*p(ITNGPpFARotFHaAd#TXUu#nk zJb`ItK-X4LNk}7_0YQ$Xm)lnAjg)h!Gru+OUDC1V2R$2lejB{Lt^9W!Gu!WuJZ4tlU#1QK;2aFR z8NR~RqOLU?o^jxZXnEbj(6uV7S{2{Z@Gf$?=nl_5E-qH%EET!-YQM& zb)i*c(CW0S@+_j|(OZjyKF|#P^F+SqvSJK=P$qpuRfD;dIf64i^Ht^ysy}w2?#KT# zsDL~BYy7zu<-6Xn5oYKf)QtaE_*S^C$4~mNAoxHsT1KtveT9-4*-~;ZzHP&L6ur@N zZZ~|x@7?&l9lv|??|izhBF{Z|1-&%mIuS+ORsYK%V-Oe9I2jnLUFV4$@-efaQ&1$$ zPP;sFw?Gbq(tf#!_K$m9|4x4rzXvZ0jmsoic)C9R1J%XTU8UzrD$9Z3E=VgQNM}*t z)1CdBJ9`b#ZNUG(;{Qhc-&7DB?L!!@lnWN`pem(5LCZOVf56`}$Z&kYM|wb$DWr+> zdF($wj^~cG|9pkf%F(ss(^~Z_rFOUfPin_FHg>Xbj8ECpD@_FyQh2n3|D~%%2X1X`y6C+QcO>WjGsZD%}>Hn5Xo6s=E z$jAP{l8DtNy6_02a3bQ`G~LjK5=A+ikrng#P|}K878eGoKVjI@W^Q)ovCLC7e3?mP zj3V;UW76=1oQTjc&22K(9!JJGZIe?p1;~#ONt@)b*tVtFOefGLA3bYGW`JV412c^+ z54ugxJlaBTwTUkL^#o}^Dx650{N1EnswhuoWW`LG#5Gg5$p*XgNrcGOXN>BVDIymu zB7~fX(5WkKlR_pU9)r_1`KP9UHX%ebE*)IU<5Px8XH_yG&-9U!_Wqgk)8~}XZ?>yk zclH5yHod2_8UNGxO|RN;^*ff8>CxzZqi`Yyu%+6r zYlR+-&SPZ76-1c~phk1hKh@$O5h9P9MD%F1daU$(gq(Ok*CDPqxNyKUsU3mSY(tuPr5pi8_Qr4rQI;##RWc;DtA z5h6F4MD%F%>ce6ugq(;>VIpXgGnhzXZL)u=ss`joh!7trrKHcC974}yO)+gl#xM7z zA=?if6F@<_;?TTy7I&kBUs0xKv@eO<_y`zi`IG(Hqc`$O6!tM!N#QFMx2iGSlego( z#g?x2?T+n3uN7!dB=p??Z23<-=#2vX+0!B^i}p!70sS}p6YJg;=3GHfjf5VFi!58F z+qYS^&$)uWE)seYe(kk=&K2}ckod@hrtmPPl`W*6nHnH(9hY~tC z1%;1tSa>xGhw;1!I>0>Z@vUvNJ-)ScK}gXd&kqtCS31x%^*bnHL!}RjxQPRdVduz!(#Fc9LDl276PXlwy$awv{vZdRo@CFPv zhinX0_>xGTpFx~EOfPT0UwEdFLCckfy2p|8`XJcI1~w;byiJAwV?QK(NWH8;;V@ge z2CoT+>E%233C~HSmxJT=mr5_si$r_*RzNq$vn-{T+b2aZ)o%-+huP4PCZUJ&*`n9A zfN#0Yew;Yw&_7kmms#}KXK_!i3_%D{QS_F#ZDWtc!9>A$p2CP_gyiROHPYgrthT!* z$_D-s1>;oX zTw-gGT|6F%1OG(%753}N@ydUU@?4Gm_S?zvVE&_FM%XZMs&N~!m1!4`N8%zX|2W=e z)`l9V^*U&l-fwmc^O;{&{TzmAn?u_P>}%J|OV>oR28yQq7jP{fuD9t#-r1|IC{N1Y zN#*--dB-#^BABRbc zKXZ(}HxscO{NeY14Sw9rYT2KTLT>T@4ao%g0Q7W1j_c@7I_ zQsHOcaE5uyLq>g)RDI4+_34p7eO>^fmj1JxQ5{W%=fCc(u#XC#?Xd94W_|R{qSxId z?Negbr+uAh5(Qc_1~k9u4!mpsPr4#z9*2P1FCM{c9I&nyvB}CKzsxz8BO`7`d z+bb2#I>$7(J_wpQGo8^~h{9Gq$H*>4*EfTuo(+m-{PA<8i1=P29eSBa$A_sCn9CFg zEgcnHaU5^AM&MjTYy6COwA5Z|fm!_kVD`NfM>M5U_$4arjaN8F3O`7NA9^tk=1eKv zj|!)vFs*%)-xv1y!9d%CV~4#}9wW#gpqma{Y8Ig8(EzG^&Sooe*yh5u zQurMz+~rxTaAa@CWy_@O6IAx}XRNYOBMKKTmBKfmu%1b`%fLt}cOfC|TO9}K04eN> zhqPGAts4cTxBNQ}(i|yVi^7NGG*`-164J;26$fdS6uvPY(rhW$laRhOEe_IDDcm6* zQje7T?tUO$JJm)S>7H^!t&|sg-lD>*pNvzuRtirdY8^l>g1c7)Hbm^3%!(YMMX18;V=5L5uG3oM&X{1 z`SdlyBow1bDgq)<0#wHa8xsbQM;oJYChdzHi;_NUSHee3|wCLpbZ1C2v5}3CE z6X^PSIbE&to3HH?dFihVbiE64ok-H$68duHIyh=sf#O(bWqYphNaM5YiiiBqX=$A2Q_g;l)PWk&A;|e7oU!_E7^|WgZPbM&KuD z_@NoMJa$P(9BtZ!I-}`2U0o3Dg{Q>%5=h*b`R7o}*p7Jb!c~3b9PEHCY$G*L72=wJ znN!<#llri@aP}LuRCVTBsv6TPMDwkaRzuS^Pe2R$zwsrnc2|B;0Mf}H`6ld*lmYIw zjIP5Zsl&>93>ge16b@zZtiV@l_@Nm?z)ZhjUrPqQV6RVU1$ZJ?A5A%U;-5(XJKQ(9 z?mZcrgAHjZo0`shSDqDn$7d5C9H#;13Gt4Kc%0H}r1ZKGs;U9jRAQ|&lP8sKKB-qy zzhI~DNfQgxuw8lZYWKjj|HD^o#l}xMPjeGKW&E2yf%DFrTEV$>(dR!%Ek)bIn>Nt< zq1vQQ^&#-!t!Krz?Hw^=?DEJkY^D~z0SLPsAwOLqke$WVHI232|K)U(myu;QTK zNkutyF&;{Sd{vRMixu8^tpMp4=yZUE><`i^ry^D8{}GAU4yy*= z@{3c3co5k;uL}SR7Fx>A7cs~+#ExvV6VYu5h3-;~t|T0sRtq8Y4-{UulAaI4-;e~# z4FGp|i6)hwqr+2lliO`fRmBC}xKc`#fIgP%)=rBQ24~cP2Db<<81^na2avu%r*)(} z^m38eA_oio-vimQuISL^@v8B?(KlHw0ynhX2FaGH9=KCA$n%G6kY3C?=nMg!K<{s7 zVKA~)vOWjd7%HMP(p#UkmdBe1_CY17HD1C^!n(IGPWwgnm|AV}gv;v{moPdWH>@rm z9G(38Zn}&nlY|lo@^DhVI2R)eeZk8)cqDJBT+i<3TyNVl5>%h*G?KU{H(`pyoE=4f zNI&MTng!L3-9c#X`ifH5-yt$A4E9<_eK~apYG9HJx8q|f6iojBruc;iOX16fY*x!} ztx(8Vv|GMFuCmT(U68f1Rf6!>QaCJbdq-DvahVSGlH!X|oF>0oXp{MRtyp|O#^a9F zMXPebRLdqbP)yE*RGyH!9;D)w94IBv6{fOUzT3lY(*>_3bqaLd^Du@yTVIu)lAlxv z1+#llc6ZJZm0i*bm2DSh0Kp&!`omtAe;%8+eM|IrK4kFD~{$MPdM-r zOd_t92WL%aT*@6Ku2ybmakZqkpO#G~;wM*&`hDeU(VuX&N;ofAio`p20M$ZzU2lE% z9OY__;lswouFc1>tM%eT%GILp=$Xl!X!AJX^Ur9-FEylyt94HL?Ew?EJ zqmHBPFP3?Zi|1<92>fXperU$-F^RicQX#Gh8gTY5cC|=cy0T%lTvjm88g_=JJq~)> z$LdI&JNL0>3-iN<8Ts-bwYFKV){nR_*(nbjg@>A9Qir18=wv*#*kRoH>e6&X{ldLV-J|Xlz}pod zcg%lIfN%q^|HW&x1J5p?sK4MWS8v>tZ?-xCv?hAbP?jE zEFeQ=SFb*UT|F{ExOzM=`ls{27@Xb!DBIQR0T9F0qfCX(a`o;8vcz1yb3~jk-YVi` zSC4rK2rmJ}i@16@n(Jidnk7`ot{&T;*qEvY9HW(B(eU^pe7%jhtl6oK<_VkoZxJ>N zf>%ae>~A?vJWR6Ky!8VGZmEJ(@*?N38NM0uw_q@eh+B4E=P(Zu_w-{L2QM*N58x$I zOD!12@=#cz%3F_%(U=fMBLJ8y_7d*~q~Rq}rq!6rOMD*467mvDrLtd@sJ0|8F?L&y zV&1{@#h?@DJ?F)6FL4aA+xHTyWxyNoE3}z9`)zz7b$hQxx7#EWh06;Rm*gd;qW0`1 z(&z+^cKyO$BK3jr60<20FOj}Pc!`v2d5KB*;hy}e_7a<@^GwW39439*(>IF@!#p(^ zQ{~yB_>SKw!BhZD@e5Cs!d--HR!dH#muS*%Iq6VdqWEHi1>r|GNj65bZ;!TZxS>n!tHxWba2(r z&_TNkRu)9A;uL~e!I$kvx_!0eFs-N{%g7P8k2)`?-ME<8s-roWCmi$xjCUSSp6AoQ z^d9k~LPXK{>bCKG(e?qJ&R%6}ffo;=v}+qLiEU&IkyfKoEoED4J>8e0U(3QXD=Yq# zl(gm8=uF&f$CPe!Kxwv6dTp>!0=M=v=ZJ7y+?ip4c>?pGg3;v6I}~D7Y^i|uRiGyC z#jY!kCLh(+b`N}1iWqT?eZi5q>t{3u#b5ge2aY&E?|&Eh_Y^GpsY5}Z-R?=9pyzmG zoYWcjEhFI@i)K*|P~hK{=byndO8**uw74L7xw~=>F5dQC78yDl5YZGIK5P_rgEwmF z;M#~Q_}*^06~nweAksTx1kHk=P$59=PDAYqgPnQKi7TFSi-IY?tKR*pz@#jSA7163 zbb=i}L_e3Sp7$>5v&&u86PAd_t*OE?B*A~D+U5ngs?gsBo6&6!b-g!&DCNTQ#U0i= zAh!-z1s@%80FvX&vnSn)>%m2GK0lsZ=9gme7&_w;v3Y}!c00Idy?;J;uKra;{#}9I zB|sbCFL=?Jgo|;$5=rvzykOy<_e0`Y_>~_lK9KKz^J_Kif0gh5#=B_qsrkv@cvtVs zPhMLz^xJ~q{g~Oz8AB-WfDw|bf}?H(e?O)a`dfU-E8Ue-ald#$@-m05wNr$>evoc0 z*vKCVgR%#+wIUUiTPx*Vc0`|32q44z?`AKY>IX0Ufbzm~Dd>vgyYk*=NdX@6K`E z=|*VAqryv);>D8GwNv^B3wy6b-8U?l#AQ(ZDWOtuq=MGto(50EnrgI&N=((2=nW7r zzZ(x^yGR3osan_dS;h@PR);zQ${i1X1j>XByS0@6v{90wG+TFDVI%u?O({5Zs zwhUFs>+^%VYLU1_r&p6()N*?)x2S=bm6bSLQE2duFc6qVRw|l)ptv|m_!E?#*%ZrR zS{YsSUQ+ej0pp#I8y~QANdK1aOL0%y#V!u+k3=RqIk_{{bUbkDx}^~2jBJg_<3|ina6EQ~J09A}z)&bI$ft+`WI@z$L6qaM!d+Pbf6d`gwq4lm ztk~rnI*$jquCh6lMOK-IvZVKTDEs_s5fwV{nZunp9><%G$8zO(tSIVpAl&ib3S;(5 zwZ$qJRTWy5|2;b%e`ZSLcx=FgS{#p2<7r@rJgiqb7*Ub`CnYv-a4h>B zBUyxNy#9{^T|>j*ckq>$f%!xa?%ot6$=~J$^Lp+_^pXZ?z-Lnuyq>&|M&*61$@j1J z;>nKut^5PLkG<@DU_lAq#|no{)>$Ne z%ik@9c316MN=W>yaJ9o6THS7CUp5kpO$urh6cs!QH_lF2CNQVP!ksaX$O{Y)f z1(_?qJeCZ-6=TU-iqQpF`{1~;+66@IWW71id*oALK@@mEJ>bpMmw`<^Y+LIOhze4s zw?0?8*`#K2hGyl2IYaboL8a7kGHnA<&d?P4M9$E|_^1MI${AXLF`PX?jNvu9d^MxM z7+w?d0V1&&;Z&hN{z{QDIYSa0RLs<9X0|19_=_Y10g-JfyDadpQ~r>Oa4soWsQn>! zm2*xfRgr7wm6pbKm0uTrekl@ue8FoF4E)`GT@ggvg)#`Rw!{|Y>Hq?M} z35E9>h5gn-)eO&Tq-!&T5-PHV4lqn1HA3j53_ zSC&=3^k%63=-+KO%Iy4kfV%WFYCPvIz*ecq`Klt0T!5Vdv#-BYUXyd;0_+#i1_f%m z0E1m0wyGYJ$9@>pL*J4wwgPg<>$AmOl_|d1zpKa>8*)=DUo54LeK8sqyGHn8Q^gm{ zMAk_0#i$f0x!0bR6nsP;kXo=G`sH8bT}aWpg8BHt|M6Q<-g&wBNOyHViYo!JR!&Xh zU*hLiaQyu8lz%>r6-B`Z@e&R?-s?`~j+cW$=GDkX$IlZ_Z5W-wJs5hfp9ohZl*-ri zrt_m&jCB!TxXb|%>uTf!W~s=#vciTsO{<&Gx=_=?a?KTcs3$IFO1`1J_YBtV7$NWZ zK|!BA?n!TAxWw}dRCPE2;s<<>!JkHb%(6xzK>)}(uG~C`oW=_lP8F>%kw6Z{?f_`fJMcPxv)?TZ2;;FKaTi;7y1}c~> zEy4tu>ev+!%dI!!UL zdk8OKFUM_bq*?AsFN;6G$`}w$l()?TtcI|tbG{gD7N2CJ~rUUkm-C8}pMJyzVz!y?dH?L`Jlt7&-aDPC0qWA0_X* zA~^7<6pGmWEjTzm#faJ6NL$dx5E6NG9A5K{>@|ZvO^hdPRVIfgo}iN8`PbqBe{d$e1;X@~0MchLel zI~?EQrh4sg#Es335mMt6sd%xuDN_6@Rh+n*^xH~2GD3fKW*#U?cNK9Z5xH*sXV@;p zbj5RLj>o7?YwoHi(f);j(T#}cP`e=v$IaV&_Y(-iy#&JE`WhKGp&R$KYM%&xLz>?uC>!Y{uGBcUYn&@X&)7Jf z?G)T9EPsBvl9=TrwrbKopbYe0UJ>pj?nid}PGU%$#9KbsPT~qX)<)fxyXq;#*f1}O z?g!x_Q-3AhA^O3t*YXn-&>kPTGaYG6_m3@8eI53MssX*gzeJ!r&vh z2yk+9mhzST4maVFoo0*-1^#za zF;3vZX1;_!F<#F8|Ka85T&alg5)xiK%*)+;t$t#>Jg?Ac2Py90tVD9Vg7XE+w}Xem zKEu(X`wIMzXM&X?|IhA8S8%5lPeItpERTI*e%Oeu-N`IzmLL8iqCmgOZe&27g$)GB zVMMo^p2D7LTSXaumoMI5(Dt!!QU}}nna9ZY zzvb#!zJE4YK(Lk6AI@1=9CoL4#pI+;5#OImq4PYh@vNlsB?lzvF7LT{=fRBHXhX$9 zxcRa`R}>tZ%u}oru>nxec}$N!G6tx{k|SbS^=Bm(3_K~@rf}F3&!~V0#(EWBh|Uu? z%cBn~73R^$qU94>C7Kq7wozNeqbEwfp=sU!u2*)61sXkie(S6Fz+Lqs_W;3a6oaLc z6OT@u1~jagpa-B<$@BAjyaoO*ih`rM<-+*kgDrDcF6RsO#oaJn`F4GUfx_ba%e294 zvt9Y?zc^GYTx?Xqa^~Z-Lb8HMRQwW#2GB)W#~X;L@pt&02z>A%2^yy#zm^$+7VD_?+>4+eYdM;zk5@k&`+F9?o3(tps0 zfbpUY9cX_-2il+DZCh0k9D=DQcOc&2O-B^Mx1aP7$Gtf!CLX@h^#VVZ3xr&Rt|Rij ztH6ISfJaNxJaL0|+|T(*IqrOlhvx|IW7{;ez>H@b z$`%pNepbjWyF?ic_B9}$-DbqIV|8k;3uHh;!d|Or$F^hA^8`UZg}@orRRWZufJiix zexOH==`TC7o$;eJbJ)Cz{tTNrd_|ukquB1MPSnW;phN*EQ9zU^FpVY=f!=kGgn5IQ zGSr}SeG}MGPN}^rinujpdh3(E<3(8C2OPIFu$9Ei)mc@p4`fjYF z&GN~7BfsZvUqyqv>UTs}@se(te>y?^KhnMiF3KwVAB9m%aE212!o*fxN-az&3~ZsG zW^yP@EhtPj%*?c`Rr9y&>w>M*Fi4x0TUu7ux|{8~r3H$JuVAU+JEazyFEgQu<_qQv z|L-~HKJz>Sj5B`zd_K(ccHZu}=bU@*x%asbuYU6FbkMMa;=bMWLUe{}s&|+%8rhkk zlXz*Oi_8Skh3ZZRIn2lu{K1<9pW_Zpf0n@K5xg0@Vr%mFTgs6lF}W|nZ~Zke{1DN9D8c^)TGQzJ zOa3Mc{Ej|SU$9xT<7;&9M$3+Iw0DPh9BEA4+Xe4k;CbF6c-aNXFTCROf{_n@dmuPI zeHESx4(8e8FaZQ%J@4QcB<~aPhBEG^Hvxm={guM=@*V|T;!SxRjdyc{lu^+|slPvg zhUa&Nea`*CFBA9&2>$fh!1U(`{PhHHGr%{uSCMDD!2fh7;QxI_*MUFyQ3C%3;OTY9 zy7x7u`71!CApBJ!zym2*cqzi_JEY7i{F!GjJHfe;CYb?Ge}f4&SEIzGXdyWUBs~R&UG)9ASBStTD-qZ& zH&eI>V6qm$3nM=B4B;gJpPju8u2Fj|Xg>25p4T;A0WP`5e4-H`B&afG8F|;#10>h6J_$7cRH}FKEFQxJDYsi8#iFmwDd+7%-{4{~L zDjvG4`K!EMf^dUE@K(Ye?0D~Kb4ceHfWYpanxXS7qj~mD>`m_p1r<%?00ibXC9n;f z)q6rfMbnW#zX+Ei4Dk}+>2mYzS8J84`AnF5UTn}w`t#mHvV5VHmn7%w%(LJ80WxjC zk0z79LM>A3A8tpzZQiHDH!p*P)Et2?Cis`X4-B6y@VNxP(a^p{LcHnS{j6f}O3fy;0V^6ZLe{E?wH@{v`yK3V~>ncH0gweDfFkRm&&fo;ZLX z+U5oK+hd6l_)@^L%de%@QiYY~A_$ zKKO-@a8JQ@ovS|stPwJ1;#$7h%hg}CZ5Hs_-+QZV`Mp$a8$BHe*>4d=>+=QsLxt__ zVLyVsxGC%6`~H<@AUgMoWb=vh17;AH|nhrnN;J(s1zAM@ieO9lK{fQ!dO+}j@&zOv#9N|I8~ z6U?5($VA{*W>hHP7rSeWqP8VsJ|=XBXXxrH@RABi7Ub1H_T;U+0=S44Cg8;c{!wW_ z@MW@>#UGVuo&jY6QRWEB9mL^-F9Ck#!p{=$#%@~SBX-^cEuUN-kkL57+yG2ZKLWop zqY(oBmX}e~3t&WAE?7nb*0V#cj>Fa&$Ks(^WJ=>O1BhzcO2O}~Z$$>O=Fyn4$ix*bi*$U}jz~7Hqm@67qqefz z{V(7>S4c~fmxH177T@X*0r4igw9Vr>ard}Y3_HX1679~U35!Ltk2=GCPs?Y^%LKA; zC*HzwoS^rQCcl9s4~c}7C&`19CyA?>*m|uf*^F}0mh^+Ua69T7nHf?kGBdG)#rkxz zK2alo?$^IPFTyNOL5WJSN(jY5ZBV8Q?b!+2T?zgw#pXB*Epff9%FTL)Rbq2o#DYx{ zOqORXZs6}Zjy5LS&h=o$Iul|Y`DT51)%843?Z@bg13g6FGADNx04q>7Bt4WtUv z!&2x$t*@6!7ps#E04uChu!<0~*X!*`2hBx?kY&1(F|IDieK;Jx*x>1b#CfM@d|f;f zQl*v_N}weB!aFNktV1lsyI;7MyBT55_`(4Jy5IgUJU(wgaUXWNN}FIy|A9Mw5xV98r4sEvVZ()8TlCieakVm27-}x{+R-Uf2$cOlHFK!uKym zY&93UcwxY0p3=PAkXwFSXQr>}86$iab!I+O6rX|4vSgl+bR_Su0#Uo;oHew;Jgb2w z?5Q|28ku|ollNbW=|cTMq25JNS8sn`g!GBTg+zCQi}ziFuMwuWS~BvE+gur~Xnr{~ z%`tW%Y18p7)^_sT?cKb5KniMH0nuVX=ZGjPW0bS#IrkR97YcYGf#;c?y;Jm$Rh5>4 zV3|kRTOy*Jyjhimu&w}JBH(KYJkRv*9jYYs1!^)K zD#+F<6a@Q_@(sL~-zI}5i$=lx>B2Unfd#wUAXw8_!NGRDaLN)+eH14zz5SRczbbmw zLa&|BJJ4GsClZgk!c({|Hfu#_k0Q|WWUddsi-t4<3+Id8g)w2ux61BBO*o&ez~a%G z)wO@)UdXTw(w~W%`64_$C%u+7?yRVk>Ep2D?Hnao<$+ZKr=ViI$i+5qoUUoHevXOQ zgKm=gc^I!|lMfAaC_BkBb)upubJ=J#mvfrAkck*ghRtOw8dILbxs%0_Kw>l(gCpu5 z-k|FL#%AWyB6!#;Zk667@I2F)Ud_xU$MpV2Uvp{8<}#dKh;@av4cc5R!s#~Q)LL;O z5=?I=K6`&v^kRhGchM~Q=RHMo>|T)QHJ7boE;*)s8w}>cchO>HBwcLTT-2IfbJ0vp z5TrTBF4Q)6u(@Io+R^FrU}_wlKK2s{?d*|*TMD^xB4;0w^I9dRm(&QFWhc5plIthr z4&K1UUU|C|+vif9(Kj><_&1a3c6^{^22&mAmSF^&|>@NSfq0`u{}ljjuyTT zD83rC+pm(EU8uzfwKKO#DeSJW6ja`N+Q+QmMlJ4kf%xpf6tmP{qF(6 z6RIb;kVAN(?b??CVmHR$k9_@N&n z1^(fBz(0tY3{``gJ{M{F&%k05>W$bP4ZfXJ3}tt6Ph=}Pzv?URSeQUBqFkYCu~gVT z2ezF3ayn@Ygtr6gHO>_bftsv$Z`**H%wLBAF6|lKW@<4t#!UpR(ga-u;HIlye&x3@ zzweIB&s)&>m4*&jZx9C~^jTrxPuGj35FcI#-Q5kO(dd4LasKgxOJ_ z?Ha5X)~B5Dg6Y&Ta|!bqeahP(W;ekcq+|8~CN*iE?+mt_>4$N&pkJq>AN?H|pES6Q zKh$tR-DC0UX$hf@G@u%4$fvlc#pC8HRL|>Fp8>quEjXiqtw0@SK=o_ig1T0rdZx3zX&;UBTDp%miUp@g!-)xOqmu>Y zDP6*Nl5i_c&j--sC_#+{s^?Xn&NtLja}UfC@RJ?9y4cuNnq<#=^?EJ%i`~(J{<%W; zSae@Ns>W9zJgjLa2s0D{l0rY_GXq*!q z+Hd(wu{xrT{$X#tyY>2ODNlRzO|6l9`9~%vUnpHnV5L>%G)SQC0Pf(eXiB`$L%kb- zXQObVMzYrg=FUBe+_mYoeU-h5hNOp6(DH-JvnS6so;4l0^Qnkd=9$B&(Mjo2N)O7u zYU4c*xhFJ4%LyIYLph<=O~jg0p~Ol7KV(5#6w8Wd^&%F5xi?{BBaN&JWWjah5-Rkf zM|}%DU!$H0G^8F{q@IOmA;>x*yG&s27Yx+z1a)g(=jbk!^Paj_a^8}DiUm2z7tv_q z70w^<{t=jEprx8fd00!dG&8>&BD-)nR?WlHRL5?lMVtwz9`TiU5hTW@_CHb@e0d1~ zn^hC1!Rd+nuk*RTMzvVJgi1>Nwa(=eRwC zr^w@EVN{9A_h}-JX86kJ)W(e%w%KV5gP%|)q`Rl{fz^pzc`;wH`cNkYozX{jM!8Zl zBdpGdB0eO{rh_9YI^v~}6)C8o5=n;dwK^iganI^Vh`^zge92sth7=A`gT%z@*r=)v zvlYxos>$l8u{wUmgoVwq#p;-uf>KISJhcpCXMUfga38;xE3eoX6TmGh(=94GdW|U4 z&|Pa0JY)^Ihr2|9+nmc{vIf5sG0?HBUjy8YDzmWX)$orNg3krXKVHBSHU6$wk%0DD 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 RvF@P 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�~-#p#5n{$>bK%A#4$~A~ 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%0Dtkop@c+8e(#Xgmuf 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�IR?$MRC&XYHI+qF-+S>n*rMPep{)3Im0BimXCITS-xWCv?Y8& zCREw07TY+KvZTaey%j>+J^>s{6`^)cqHJ4#Il^jU@mF-jEyc9)c>J4($5Xn?OQtx;+T zV4YBwW)M;V(1-6BdYSy!CpuXFRfE}V#mpIg;V0}rnuCxJb+>bTo@;F9c$24Hg?w@I zW?4s{OQ{QolP_+r;r$!VsHQJs>DfK`D_u#k&C&dRI-M&ZBG>R5&Scw*2Qb7vXj_(N zau}Yr4SWLxHY?OXkJTHwo`m1|v8pElQ$K)i26QGvxtA#@X9?`>dx zO_OMq+Vi)mBlKJ8)#ox!DZ8FmZ1OdfjRts_0TyM46Iff>1TZ*3mF^7R_z`)kojo1z z40cyt$WP=Ac2!-(Pvm9hze`W#9i}JpewC;0sP5#~#Bd#weH%0As)%>-1|HWuhuYX7 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�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

    GTmE?C_ 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 $tCwz!u!>LbMQ3j87{>PL9WN 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 Lxtao=gKJ*83uiusP`d?XhJL*`QF{r6{DUXSSH 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

    YR) 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%0Avy3r-UT&{zW4qHn=BsMf#cJvN`K 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 z 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

    O< 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 Ht|4^-{?=N+H{njHM0-)v_F2tb*z zFfH7fJAFDMTC&L^BDaF;C|cizF#?pJItTXYY$@!E3@Pg ztUM~(Wn;-g#YeK|SNV&+UAD`*KOmTE{WnH7+<6f!ov`|?@B|nEnybzXWNR`328A7? zU$7$4#$~HFTyo`_7VLRcW!4=w_Df@9^eA*0#ELuB&Q(jInmu871tdH&hQOt; z7uK-t$xN55i(@zsWQE#4@)tn$i@4oFo0RWBfWmLUKM}L~hZiyLTm1qoVz~HI>?WBj zC-}zR-nD6ptQWYf0b&Y$MBMC@zaV(2Sd@u6tBZ`Iz-^|2+p|sFHFv<5HE_L{lfTz06WP zH}~DK6nxQZp-piDrafoE#Zh~#1@%~_U%UTN_s?ESmNT2J_aWv3f&|z~X)C$+0|2{& zAwa}VPI6rA+=oTYs#(c#aJzFKZi=`%;`LCjhTIl$@!6upwRw5U7@>e2&+< zGZkzuZ^SIaj~e(Cf|sm5hVJ>$9?6Xdc!cx)pukP;$&{NcIX=#CYpT@l*2AunY$ui# zq=WSkPqEE~q@DWEM*K7vJ@P^Mlsjn=qAMlyt;r5t;DK_;D=B5&Cm+69H)!GlObUeS zMeD0l{Qjb}bRvxjBfc((=PuR=Y;edU^48M~Z&;$?6VL^4EX~&6Oa4_FKAz?|-(kJX z;3nNOhYS_<_28$BIb_CytXGKjIVSbrA%q3bG>)(`jQUoFG;tv-!>Dg%D2PD#=#9at zQGsKP){J9#krzdnWAz-69$wjHc8O61Juh1y(#i|jB}NsLbz+w&7~d`t${W-qc8St1 z-!2h7VHCcj8xYtf@`I1Q3g_6lqQZ&V&A$H*_5-a`$P6`7McsPWSMUhVSMWq#c=i<1 z$vmP=n}Xwg?T=Sg>jmmFqw+t#I#A5-J`K8 zS~Eq8w$PXndE@2RO^v0#rYq-u6ZmF1T2NBq3d(djmY>Xiy4Yq+wJzalWW#S`h znK|%Ul=)s}#g?pB%-axTL%EnnH4SWv%egft>V(o8ycZ^4&Gt*u?0iNTB zbHH&R~n$Klk<6=Z~QpyR;&5VkwZtjiFrEMy$$ICN_v<3K_9#(|Er zD58x61>+kBI!<%M7zbX>wfV+@4w(?JaiAc4<3PuaVM3Q#0``pq9k&MHW)1d@105Ir zfN`MY_KgD__auN>CFq#KF|OQi>vsHD+?^BL`7v6{u&frRM04}u&e0*d(NqI@9mxe z{gB^pKJZD`IaPJ5PMtbcb?Tf`R2>@=3Mw=v^qhq#q{f7T42=oBb5*k)TDT77wL6L45R zJ1r)(`U1zZ6{aFWJ1yfLi``1a(Y{lT_TDitSfpu(y-F8ze7nUs#+@sL!Xy0!_DJu| zSqdG$EhUsw6vPbdv(}%Dlho=3#;;hElJdSiov_cn2+}rjET5clF*OJS@9g$|_!yhL z!PP924vdq3ozYFVCQRN87)Vkhm?!TQeT2n1-i$^;>V?ub1g{rL-b~!PP+=l*vw23a zSs}_8T~`|?Zx+loBLgVuydoWM7TNw$wfb4f5E?*vv+-HZAm0^qQ)nM$g0)N&%lwum zDg~7`aFLqZ35`c4?rGXIx4Z-G_15{J zyob?1R_ZZ2-tCig++nwnK}%ytXcrIBH4>=9o~ogwODuAZArQ}EXh}U7Fj2xVH0Mts zMTj{OS^Rpe*<0i%lqJxj5H#sRAV>OT)%pg`T!;p?Q>R>UJ9PwZs#=OvYy^=!kwS{V zCa@NTsEwHHtjKP)q9#aS`LYOZGp-&(DOCAVxNZ@#b%X$*t)qNJ;rI$2N=EM>aD=fI zWki(t4gy*Z202~|`cs_gO>H!LN8>7{GqKXIW)Lg=#}Tp;&4qWcahTBMzDKeglNS=D!u|YKt6I-g-$@%rzO!hFNn^OV72&+nugxaVFDXfNU z3qBy92obf@6Jia&ixHtUJRI%u85$)z@~DM+;9$GKmh121>` z11D~Q&6L_V2QIcZyk0gJC)1Qe zRIbI1jq2XltvT~d1J$Cyy;{g5Oe@Nvu($v9RwbxSQcLv9e!CjX84MN?7vCJ6a9|dg zGKsI)Rl3}hLmUjA1S)Oz-l$UND^}{1*wY;LKVO+EVyM(x+)idG-nV&iqOW-0;>C%7 zeiMD(Dx&0xxRn|q6T=tyPt1qV5XV0Ot-~S)KZ@{@G`5IAq0WmKWvp1lD&>hfw*{7hO;K|SW7IIFzKbt%Gu zkuxytc=9{Ogf1z8OIJzkbRqo-oh}e_RwdL}J_7-r(L$erKX9$;PXLV+&R&d!b}I=r zK*|k$1_B=<(H1mEF)s8O2z+=yOF7fPsK{pk3pebU#?blTj+qv2X?|?s4#+MZ%To_4 zm8=2}N;F*Is%1BSB2@fg;{q*KOi`yc+|WIcqRxIoq0l?bgmMi%Jeli>EVz};d6H4P zY8}{U(>$w4=v0kQM9C0k#oVYU8ete*Q*p}@)^8HO=h?*j|7<@C#=Y;ANp$!_I+=cd ztjry?QFDJkhsA`GBO#B;=0(T9jn0NsRD)a)P-Q_5M1?Z=uJ5}P5irr=1bh#|!a1%lW9npQa*^#ZE zj>{wZlz8r9ZwAQh%CXIy?<@+(@;tisv}1X$ya`Ul$E}RU(%GC@K~B`T`DWB&ifJ8M zZxaa5L|->T85 zp5=?fS>9}CIhP}Xrd&lj!R(b5OQr#WY>gxUx&4u336+}rt?O>!!LhE`)zjCJ1>SB{ z73l;BIsxM+#oBL1r^fhhUH$C>uL%=7^2U=wiX|@kay1u070Xv;uo^BH<)pnoQI7hu zv!H6;ei_q@>SdE)h~&(-oRdN>`eux~o{Wj$$0Lp!JvIe9HpjpLn+QcTu4vX087G@> zjBz?k$7v3#2sJMibqFamBkHJHSw~%gNdX0;K*bf9URy=iS?6;j6^?r@z0SIv5#eHbRuePt@^Qds{>Owc&p0hlKORL(&CydKU<;Dl@C=F9|c-|h6C zi6BZky%Si%?cOuPF|bvFz8ZS2Q|v zZ6aEp%ZX@t?t`hVHfLMZoYA~tm36_)7;iM2YlR^~P2Q-9tID=ucAO#P;Gc38OA}(Z zbc_NHX5qVh;8f{M`#IXF-HD^6Q*45Zi=@Ayeps^ZjrHRrQ9s6gxWbc&XoBG9fL1O= z2|N<{K8-0g!jhw6zi^X1X9g}7e>CnE?zTdy^|#s9LtTwXm&l@nQEt%o--h5T!Z+;S zahr}&sS{fU%-{Ok@E#9mQ0t^|55NqD!g%2NiVzfAf86J|op3hB^X{BGo4J!ZEQA<$ zJGnoV=qb1xxRFgW#U7%fKkA?yxF?`LV#T=K>qn}BSNNHFa$U@O?bSTOjv`asO z)-cv$Y$kq&7+MSw)9Rl=hbS4i6WAys$3g*ZHSjgcyvALm>M395H#ClROkbvM$x1lx zS7EpA;BK|qZkf6_ z2w0vW*N>96dR$WcVkiR?RpVS&$KbEIv8`ca=ZJ&IfU*f3@3Q2(eqghZbYDS9JI7UK zAj&l}%gk{t>F`t<3H-BNsMSdIQ{pu%a~7p(>@5M$h?>$D)g~l2b@xkgS>9z}F5Z6@@6Np-) z`d3_OXcdv?uUWrwjcE(jl55vrXd1)R#tYj_U_S>N;fvN>cs4#}0d4EgUP}*-YMSoo zY;$5QBuIAs*%zLB(YY6%d)3)zabt-hwT_s$M87MWR88T`3A z7|e0(x35~W?g9hfD!z2wc<#otFSy|1Gfhj~>oQ<^i)VBi>>bc4RS)9oJ|N+(jtO{r zED>hkz_!Rb`zIbt*@tD`q{&O_dsz)k-Bj`DL4YA_J_d^v(Tnsx`lY5poq$ul3f%!V z08_pBG6NBJjc4FgcurBbZKxR89nbdgMZ8%d8j;L#ltiizv8d&uAae|XY*;obK6*Co z3r}wpOPownC|}GZ1qyyfv{*!Fk^=5uAU(9Z8of1;O#`+Q<|l|C zawJYq(0-Hk!aKM+{^H5F@e`(FzZz0)DRs&}y@uQ9xNuWG8D@ak4uC=~oLf01TUh7` z-Psm^V0|p^=+?O2$Khy8v!Sg1dx;8UNy16ITffWSOp=G6ec;O4{7noP7{W~*LpJ%% zykhf%mIT3bZ@au7@?Mf0W?Q7{Z_#eDca<&F=HHv38^CThHI!0!?(+9rATDU|YKVaM z?ecHnva7YMw}G?K)gNW?FHW?eDh(4TrS|Lsc#(h+Cs2TYxDG&Uk*ZwU1^LEx-dZ{+ zme`z2YW^fnoH#p^Ih?HmuS;yF^L(i!A9vdPUP*Uy4y3nnT8Zdv^0zR6A|%q6aMxMl z_n;_l;0^(8@FuZK!*Wh0pCHm8njvRz;|DH!yCr6hfPw;uSup3Kx*$(XEL8`a5qYvC zb!>vJaEsKC4X%a}x%42|Nc&+y1ZPoqOWm9+IF-Zz1*WG@1go*pB+I632w6nEmcdLe zpv|rDj63{=>w`uTcIY6K>{J+WU!2~asKLouWE0SWeoVz zu4Dsg8=F_efHwfR5Wv+j7~=aikh*bI4EEfv!f@+GLDfJ3{*lrKRI1svKfrhEx%DB#d;G3858Lji|& ziz#1%8VWeHTTJ;9)KI{o-D1j@poRht?G{sh0|<1YrRR$p>oDb0aKh#l7XDHMpHJ|W z7JfK_FCzE}7XE4kUqoErLOqANHXNU(ud1f_8ZQn3&PZ!#(jQIJYTAqr~YLXRk5VTgj7u>v8c91Vmx zm9vNDBq>*72QFf8sNzbwVKhDIWoSl$qYE0$29koAsiqex_XL>Vkz5jlYMq>v8wJ0! zGz-gkWU|MSM=*;OV`|%7;kRCtmM{*m(G|t8gOpFoX)uL(mCbF0@Yp2xbV_B z6$?~%C8MHC=bFkubsFCxHI3X+B=SQi7g3CpibZ}XGb)PwP%~!aht!NH^207J5k`JU z#UiS_k5OSnl~h$km5(txjHr@|Vn%#cFk#GynlUfZQ|$ds7wIx2(M5Uf%og-QmBQW3=@z0V2uGWjt2 zfWq=+!oJMdbwd`57vFGii>)$|L*v+`ylFMo6Z~~)r+R{?ykl$F6FecoJ%9YGCh8p) zlG!!l30}ttqn_X?Z+?wwu#Lqc-JB^jTMQnEKfPz z)L6zgagF=6D=BiN=?Sr?GWPKZJ3ZwLgxK>Kdnm%rNkN^bHDAuyHxz3SekpXmIP{_a zlH-k(AnC~q7qO`9AC+r(c| zE>>5@si-8vi~>u=AWf7f`bCYT)LVbuj~9d|lJ+JdbTy&ICaQdaEBLcNg-RHPHir@KBQhP^m(9`)GrnCvn7Ol?xR?^r@yKoo8gL;w?+ksY3QM-V&;U zRUx+i#UX&d7oSYyt@bY!_hh0kR9cFxlU`fhKr{9(+THSqc6(j2;w+C&uS?E$ZaxOB z9md3F<<7d~d`kv8deYs=y5wR@EZkZ28~@s*+#YaC(amn60o~xyzvV*&= zhgJ_S3}g2{w5`LQV!cgFqwuihT}Fhkguaw2wuIhD`Q+^Bt*1)l4FIBpe@Suy%FsyP ziLNBdrs`;*kxj6`V817UP3}WZ$W$8*1&a&fdE1yL4>Kx^d6J^1HEhfi>QXG`$rvXJ z_1wYsO-dm^xRg>1#9w^-rZz>XFevo5rDTeu1wl`vI zms0$>aBOcJHMTcajqPJqWBaxE*!o}K0U7GH8k7y*XDE9=nW^wB`G?A}zrAwoKV3cc zw^oh)$6{mu(b(AE92@(;sT%ve;n<&!uF}}2aL_`0a|9cNIba{#1D0(#u2c#KrG7$o zlyU>yX4q$jvAVEV%D{`cKM$iMUhH3bcn`TalqqDyK zLpuAP9mOHffTwMq_nrJ4hNQ^f(lh;hJ+ zF%I~z7zg~UiUVEMBq|UXK)ak3H&ekgG6l2sW#Hf>xQ72bLo%WDAccN#+EN?T(4((2w zx?8J>*I|^0bYJ1r-#UtTw}NuO9+PXp`MN8^-lLAv;ohSL$2e&4?N-DOI2m06 zI9GX2O`HS$KQYxp9s36Fj}>I}->f2|v(bAkMz~jFgnK0-od4S(ZZ1p9zdL+jH^B3$ zdHmv#0KZB=+!Bp>lYlpwUalMg@1<}A+CjOu=3U6Zg*9;*h}E#X!{~4{&C+36SaV#J z5L{R@*STUwd{`FNEQmxNhGk)m4wH};;{w=nn}?{68+Y%tnn-q?S`*2xQ)t9QcKIjO zjHc6`>jAE&(;s#N_*Qg!WA|u6)LmTJeao0oSC{&scrZ!_9+3jtjug8{}t7~98 z5x%a?gt*4PimT0+$~kiih=<+sd*l)V7(DRDDjIW+V77!9zMs&m1Y8)7F{FC*+#8() z`RqA*@Fgd0lSqR983F%i(M0$R1tio4;4qC3Gk|uz)yMrxm@TD^sr#DnC9cClUflPP z%*KQNZfB+Utr}dk*|q+gG{SbRf0DVyo*|!L&IoVIOx>$ewKXGR^^b1;^b=0~t2K7l z)62KJNY4_M?(OE|->aDZ)MH#u@!{`P45y?A=@ng)t_^W<^FF|F^neDNn@Fg%Wcz-m8WjJZuP2}fHBG%)1nAvPRYhvC{jL{G-8G%%r6!mnGFEetaot#e_sLj z|DJ>wKqO8VF9jNB54DQ#N0b9wpU4u-I9_6k^DO<4%l{$c)7yfacMpMcet@CdYBUN?8wR5?&^D2A}k9$L7h7atq?Mz;UYw~TyV3Vw3sONmfo&2-N~Yr)*i;0;cTN6oho6E=sL$a@1-<~ z<4IYV!eCbqX@>U+wwjLufiX}r1dGUlfa>yTBe&K51YgmEddM#*1cctgKfQqBPY)KM zU*QI<_XF@%so&-!TH~XGHpw*R8ff{*nRnqkqeAZz5D|8V_hV(Oh!aZ%6%lZMQ_iar z-l%Cj4biWUaELB!dj}y3e%^)Q`2g=^<%PuTU~XWm(XnaxqmI!hR)ZL_wLTHWG{kbi1?A^9B;(d-o@QGM7 zzCG53%TE)$w`|*@V8>5WuoN-{r4HihH+A{)GkC6#IB-y#A7biSfT1?FSkyBSsuid_ z8B9rahZKWgiD*E~gRCUJVE!cBE5kB_J;>U*3C5xvf6_dJ#4mI(?pncZwJv1-BwQj> z>lpcNL2gszWISrf4P@*`8SD0kSQMo;GV(4#4u(i{8@k8>CdiisHKeF1=)pF)V->Rf z1A_>p3!k@tmn_3Ji}8{Ol+ElxgSu{q!2JYb2jVs39>Or+L^urDB)BO9gBRGT(D>Ak zYDuX1wKJuvY)2l?x7lKfb^O}-7TsSg4CS@jX|^=*%PqbuM^6mf@(m$AU1Ra|f&hof zCx(WFK$K&J=E&y;N#P_JnxYJd@l9RIc0i6{mSnXRtD`LQsH>C^%DQfFc}!CNRB&+l!XRuCOH_dlKUGLBWhv}2$)W)>Pf-78QS@{dTG?!y zd6t{RMty5vPhY=+TD=rv$cK+>YlJz3^{u72b9Vaa+iQOESb%q6eMi6@9_AN9lzVh7 zH9LlTDZ(do9R6gh+arOp*FM zbDg|5=Rg&MKIBHST>}w~5l$h*yK5|sY!_=njCW#f7;96$sbM$~a~-A7eGHGMi#c6XUD-vsTT=F;CTV~%sEkOb;E}j)PT0Con4utoI;3Nw*X`aHt)0J`WW6N!I zyks^EzxYx$g@@-1g{Nve>kMlfZvh)NuBpnh{_G7KTPic13ETTh2<+|8I(I!7-&S)W z4Cl|vuHUc`fx6lB-iF{Vv#98W7B62!m~x}5>v&gZ;0woL-q2&?)K$`HxzAy`g^R2^ zj0eA;!PMZ#FKF)5I{ZVtaWmLWF6?X#LPhCKj2|N3K;KY5<>6SxfC~<;{Hp|J(AJv@tQ^;{WHr|JJ*RODvR}A0;`ps-uWDp1x2@&C-fSt!(K&Tx4XkZR}Dsu`obNmGktu(Q3D8>N_=CL4de%OBg z5nG7HtUVkvnu%HcWZ3V6HMakC*AlIDm7+zk{#x8-#Ze&JG|$5VDM3GR5nJ3ZlF+c#k}sR@1k%9c9@^U z76C^ho!GT7t)hwm+xQ*1ZS~3As+YZnv9TC5-{%sFg&3TvjBC5afv`H`qq)Clyh*<|#%fl|U<*3bGdN(B(EBD@g4h3pLwbOUqelH5 zG%KnYY_RU*WU!Bbc_3%q#~czI{JZ`m4o+^{2D;!`W@%ln|7-H}hl^W(jF>%u!nJ&q z?Ch=*hwY&_Bm+9h&K1K5Pmz)fm0 z@8=?lz(EFYxKd-y#~IODlE=7!z*lIU=dC58RA+5#Wc#^qyXJFKcjSQ9n?L2@n5 zNQ3qNGA1Ma%h-$*m%s8B`CgU3qh|`u8Q#wui0TQ}TX5|;ZR;;SbAy354^K9O`9yzz zU@d3u5*oo}1F*7!dNsEU7Z?2l%W{R>wq-*U$7z`e3QhFqvlpJV!!A#V-6D{oZI*$vB#uPgv)mb^ z+{FG}J6Pl6Iww2V6AY<-C{=BJcs>M*8{CDt@J0WCEi>4G5K{EE7`%!;O0axiUw;8G zesMElD@Sy}YyqHYNjGt#a|h*vMgqoY?r;M@r%Us|x)c?~9d1nGZU)RKLW`duayEHw z5W4++JK<}QGt^}GWbF1&V=+X%^T|^Oy%@=EDKp+b1%NGF+CKpob_iX;`BtKc{n<=2 zp$Do3#&}C0>U*ICflvkS*BG_%dlu$VQbt_D)_5Bt^JVXRD^Bh;NKu8jL zb_?TVzZ)4|C)2re^dZ^>I*fxh~JnlEKGF40O`_SJb(1$0?Jx4hI%l*Aw z??9>h)jrJpC=RQ8I`8a&`-BZXZy~}rREkh6~Ny}HZ1B1qU z`FZjFdHDrgJ#C0_feq!kkBX$nwhFE@*j-sYrVBfAYQ3#jY5lv8uc&|b!s_}_lhm(u z@CPz~Gm)VkJzGr&{QkE#@OztDul`GYST%?Ec=ysHTgL{`gLklk-Cqt@Fsi|{*^akw zu>^3}V*|i%`P_#2Mn078deVCL7YFmu?ihjIeZAX;eWZOXNMLtf?=I)1fRgmGT!qhDD*^J zJ#A^>(sb}Aw?cRdOFQs9^aPwTAc>pJ11NwktCjQac#NH_vgUwbUX}I2od68U?k5=B z@S1@A*utQ`21y4oH{pRmZHajxBptj{P$+h_&~w;=i{ioI{1L7f`i@`HI~Ebq@Vwvm zxgrHS$#5N^?!?y-|1H*$WVnt{|3TpI ziP+=wf|(^Hym!-!tn^M453ToZWTd2UwtItRo(JSJwh#t=Y`-T2GZVijA%E!ilvKYb zfroxi#;4;{WSgLN21)Ozz#1SN;4dq}!DS#0wBbF}bM~$YAI8y`UY$1I<^qa<*sXE+ ztBya$s8$cPcF>-Amlu>W{YaRV3$UjCn2~X^dIe?;XyKq|1bIk-dECk5AN0ae>b}Rmq*qAv#9>Fxc)skt^bc)e+TXW zwwt{#2xZHkv zCqSZWi_fZq1cs)Cqma{-#?x@`%6ye`b`JI0nf2Vx^mYoSfV*IZq+g@>1KZ^HuPMfX zOv%ho6Ep#(+0KT{Ax?I2J|~;`5l10ouTScRJG}S0^oJ;%z*f$Y`5;Fd(2xGp?)1C) zylk<%=)f#<9ji%Z2NQ+t)Uwtdhe?yooF@ls;iYos3<{GOj)Z)7|89WMY8{`8c*xD% ze`J=*tZ`OQ5qOjjbQg<*()`T;6a6CaCMh)}i~=;(7#8YcY-@+bo=(yE#L%dpG1K}I zDPpC}X{4p2eu(YR9>yLx#9@p&nDl#x1DlR~Pe z)Y;J_^x2SE?SSP7V!q5-59>EpBi11t@_``oBOj?Hk@^N_+jFk%>MH6OPGdZe4$9Xu zcgv8h;%0Q@&3`g{pTbYzG3m^iUoiZTtt)*3=~wYd`Qm9*x=`#G>S96X4uABz%n4j$ zr+Gy_be=TApMsT{c5-~(xNqEt__{GU8Bi$S5ZKa6O2s&kp%x`?NjVS(xUjbcfrdW_ zm!zdV!^pyHsTD{##50l~o0`hlxhpM}gf?6$;ls-6M}3|x=}$|^vu(3EzrvlQe+*nX z<=M8SjCx$3ZA+3d8$a825+lMmm&xShlswzEmJwl`%VZLcn*3}V4Oz;Ko^7jIeAF-w z&-OtxC@d^R6yqd4#I?5OZ-NTV-;y5odSd>zo*NLEzxlPOa67`%k;1THSUhEuE)<5_ zO*`jRAQ2fa*)^FhQiaWnRgYegEBEEQ`wG29s^+FIYBjS_pkM~MfI?BA4h8VO?@riG zB73WTwGNj+G)`tW7f?6~)T6-Yr{{S7LTa<}d8dyg?DnM0QPUAZ}=zeYFUI*W6I#9M712AG}I1uM)0EBsFqiB! z=W)SyD`l(q%4*^Qod|R;uzV55R4_I`b$>6>o_ODy4F_o7hjpM5e&s-Y=()Gn$1T5$b3P|x0p{L zjX8L;9ly_eSRSdS7V{a#?AsP%=5w7bX1^3!7b0kY>9M^Q^A#zhEc7|*fn}6O8P)!} z?c8U*YDW1iWv*b9yFFqQ*aIGvY9F#+yi4HbSq6`PL#m7)ywuM=NzYe{@P3gqD*}RR zwk!VhuLwf@>60EJmJn^t9~rSH^rts<$N9WpgspL3Zz0#e!zjlz{l;=m{c-+GhZpl6 zQLkdpn3+aCXT9CU9t6ZDUUW96f6f7~w%CJg`guy0N*FN0r$6jt<7Cf1>8(DwKiHg^ zEtJxX&ZcySkLxi({;h$}}GJPujmfcwT1RvaL_oqvI z9M?w5TTE&eG0L9g^TM14%-frRP#Z*uK^5!OU3=ru>oXquL73cIqPID6| zooV#3gDWu3DI$f!u#JN@s8On&`~ZJ0J)fpo=qx}4&K&PAMJvhfdj;ohuzUan-I{VO zXGkqgo28cHeJ~U`VamR*^2n@OR;)v$dcA~;D$s$@$cvYx#GoXJ+ZM>EtDtx4^Y9Gk z5$+{C#vYJa&Ldb^z}YrRBotSGF62YDQ-s#=S~HGvak-_~jV;v}e@k)2m%VImOH*-` zan`5H#6~urBxTNQNkT{8Q_An`$gMR0!ONGbKQbl4amdPFR3f^P5ct}dX7k?_*lJO# zMuExDSdcy(GZuuIb)|Kmjr5+JJQWsv5(Bo7p7)f6y70JKutKXiTOTS=_8+i9AW5F?0=Ss1Es z5)ij?SOjF7ka^NVa3r^z>T5Dj5Uf-ttr@o?o4G9sIiTmDa^_a{j%6f{Md?p)etS;K zd^Cv}D2u?)Km*Lpx}V70yg6xwc(Xao81tf?wKs!cvM~H!iu`McAmK|wyxAmYQ*Gvx zf=Yh`gGIt<0>DVn43e$4p9%M{qaOLi+AI58`^c}bP58)fGJUi~ll_Dsqep(RIj(g& zJ4?kLgj~Q@tyb(JlfmLzrLrab%YfvY;K^>P2)ZZV0nmI`k@$T_l{x|3fbDChp0{66!CqG=77;f zM5lsNKP5QE$r68)x{{{Alwg*##R6msObL#6h6tilU`nvCdJ0SltOCOB6ln_FLf)d$ z6u2gHP7q_gk<4259_4n!1}1$r`->{;%_pxzVZA-fM-AI89~~crtoK32?7JkyDC>P( ziYyKh5$oM9Wpt651sW0SeL=vtS&p1VZX=cnGYtXcnQUMmJMCP5W;JD(H&LYYZC5Lk+0FOEa%9 zaJaC&Tvp)5%5Vc=GnU@H}9T0$% zO}`j1a^`yhb_N_}kaiI6@JrWazDpoB4%=U`5@x;wr)=Ji+K%S{Aw~^V!8pl0MG(8c z{g;a3RU)h*6k$_IgypUHQm~T@W-z>L5sfxK5Dh>Oy)33F!mI!WV`CBPA_Qz+Wza0D zEkxD8aSorSVAXPO(H^2wctUYIkCsL4R}{8B|HnE9_TdR0?2L_Fq!0Gn#X7SiMcdMR z9}5h;|8rRi13{_F-hC8##&r?hw5$OlsUC=KHQLQs3p#+;FIGB zRKX{kGrwb=keItHm^WvhBp*}Vij8C*XO~l54>Mm&VX*k{aWv}~%|mi~l>QodqsmRx zJYX^pQ$`xqWt{K86Ou2ygTW=*Uv?eC7c>X$$pNr8$4T!|264^2&b~1SeELa%)cCWU7JWT*!4?q^&1v_ zxRKHlh>&A1Eh~RXmttR3(#c0bfJ*OM{c2b3UsLmjDrt-Rw=tw`8PG~;yDmK(m$vDF(XzIGl&rlbb9Jqih>Pd&IrBML z=i-A&ih$Eytj6Z9Wk+T@(~*NUclSFm0_*)GjAzy|_3`2XUVescwNbL0U6%ar+L_MH zkjd7$ckQt@h2@1-QFrYe=XOHpXbpAO&U3!bDUO8au5EOFK*_#=K8}XqUC!z_s?WQS zHE{g%e3;0Lm=^%m;QP`kv+q69iamd)t#PNvTZ2IS(l%`k9!Hq~s@m2d5dZO%60=jh zlTy(bA2!-fuC%3K9^@wb@Q9(bBs)Bca=rzBhTAv=XUDDl)5qg#&d7*l%X^dfP|0~F z;Ae^RBx#LACrW((bI3X_1U1+l6wC^=3HBS2H$!5H%mIufZl9I(+Ih!aQqk!p)tz3_ z;QX3mt^*0Pq3Ot`5FWrC>?{qwgE@5W zr$YlYTZvI#ZFnfpO>|u6Xy?;3KK68sCnKB&=N^K9ZA<)Qh<6e;b)C)TD}ee7@f)f( zP9TEBT+A7~tJ zH6J01NJ~aBAs+<{+M$7;vTDt*!S!~blH37o37aro(CRs4z z#p|zR#7j-ag$vW7djlN$E>ZbY_NvK*gTp+q% ztui5g8)IY|cY2H*-2NB;9G#!Y!O+CLEKr7Vrrv*0*l^ExW7YuF;ukJ_jp3y+(x+YYyIFFL#0XLL zwugl9hp-^QS+g)?rf`c6{nSqOA?PjoTUMCk7x1$f8S z(sr3NPQm}A0PIZhZbMd?Mc%C#pKdJo^i}T@NQ~Iue;*D{*na12ej)Pna4Rj7R8d8O z`b~e|27wahXguY0B(6rVVJ^G_6YaWx2v}I8|S}L9k`hW9zpgzTAt(%j?It`)cg>8 z1+1}T3N6>92T=e9nHB*LJ-m0y7`S=kUY@a!MA+jJ_Tu$NjCnl5%(ECS_p)H0c!od6 z&hdz!+!wy#u4@*Y;~73^zoc*!e@l1xO0W6Ap*GeycnIpiVTzMfkxWb%xq`tnO6vo^ zRhmzqD&#AWfjWquD!?jk3pb^f-Z)b4D55dmF5jIxi}{znP|MK2%_3~ zkT`ipe6JEQ7m{DRsGhGvpoDl){kjq{2Yd3+8;ke^53ld`eBADaI~WyGzDp0RnK!rs z1;S|_d3j$$&5rMDJTk;V51@vta!&F+s)<-B=~J0~dTr-Bc!UGS3-I904h-So%T@jp zEZt91&uczC9zG}mfbm!?}Kw7zPfkHZFS7| zc$dxT-D$5ZrKIA}y(NsK3rj(L)D{D31q_W)E^jfnD8_g-5Zv(xG4ve^-(3U*yX#Kl zt}6nwA%M+zXwZF%hL=bzPC5fSwiOXSTE4FskS1VGt#M$;3$@5wrl51tjM1;rMQX?m zOQ#Bn`<>x5;V^wVMGm~FQ)TCj%BfO&XA@W&Ue4@CLd~V%4z+hK5GXD!1a@F|>eJDr zx@FX)I(GshgrX^1iAWbi?(vH^!&Uhj|rj{kIo*7hij0IBjlaL^z*r z2&c_w8L{Ude|dtMgN!(+i1&=1HhZog&F~GMIEOjc=O+lk@cerC0j^7N|2M{w z*!W3A5lWbck8nk!J149S@8HG5&Lzp$klMmolfS{vLaPaW zjf7U>Tob$mHnLxE+LFH_rjidNe*rd9iz%uzc#!~Xt;C<$ocs~<9OHg~qaX}dl3)<0 zBlrO^2y7=Pl@Gojw^rg#wgpeGq{?yVn1DQx;Sc;5vsUmlcA0#WFjL@L6pmx5STQYR z#DT{YK`cjO!(GKi8Y0h+an8hh1@@dt&5g@r#J_Z7J|=3+i};uDY85kIDWVvPf9YEH zlM}fyq5Db7n~6eV<|~Cl17O6zbgcpKIb0|*0LGg*9^HzN^i^*tynF+bAy`sh%9#}m zg?<7uw5!N5OJdJiz~9xn>=M!AF1vUjCMG~x zOnT^Vm06*tsA5*vndMNA?O51NSUcKchYiQI8TOO zSM%nBjevCK@++ilcd$Xy%WYl3dM*(%`X!uHPEX>MUMkI*gNu>K_YHJO(VpNUNq0y( z7hEXmoTQ7v1xOELD`eZ<8JrJ5{|TDzN}fmQLvOWfvUtE5k`>ELvv zJ34F!JA%^)owNPRCr?I_%>JxUA~hBzOFXo}2^jXB+lmFL+UX2d0)Pcx0fk@%03#8g zBZ=3U(01FF7E0`}iDpXRkVJDKXhOo~Lbc0~ve}$MuoNkq4`Pe0 z#~~}iy9ur%c`Tpgm@AJ7#bEMi+<4Qp85->C?94U`8zqlM-eQjcrLuYmNM2D)A5Yf< z@Bane{KTmKvQff-)TOlNQZO5Z=o`-{8?_aMY3y(BkR6K|X&y%&Xq(kfx|Jj+=BXW__5R)|DbLY=o$%Xs|_wrJab6g%g^xu zTgz=mWw3?A>4+m}<&f7K!};8|&gXr=gX{JAJ3sDxF1X0~9Q9zI2JuwjNwmj4PK2u1 z|C}*qCs(LAoHr{D`Fb4@9p|aV@$Dn>BeZAip`(WOJ^auSPV>-Gc9)vWO-aweLnL0@N9}Hb89yMmp2*dBw2nI=zZSqlQzjw4*V?&%g;fhW`}Tyg0)!JK-MkPuv2dw(|buV{z!W)jh&E_u4SzY%SE=K#DJlNX_f( zIC7kyg7v?!>JXk^=7NVT4sx?nM^+h5GNxDy92yc*_TOK4iMezx?(o`RS@`=$oY=b&_5M>qXUeVA;$#yVTHP6Ys zupJ@aDN{4lSTwO(?RF&7E{4oSGp+&-4gFHkU@44+&Tcksv6N{e0hymd@^N_ik;%t_ ze3l-meFwtvcMLKK?BbxL1sZk-g`yGUT6$Z?8 znw=$7w3sdQ_aPz{#mLHNJ~AhTD%(Z)U&%y|yCOgqM~mv~FLhxl&YE%%R)o4(I2e7w8A*!`?hYhH~1BQ%QX$y@+C_I+Vs1qz|PlUpg z=xBD9OpWDRdn4RQzzq)d20K2hrjz6F0pk%xh9b-iJ8u?X!gKuwlxUO9;46TzvaN~RQa$Jz zwNNIE|0s%KT(fMeM>p;X5-CaD*G!z zsE=ph%}s^2Lvw8NnEW24`6H*JOEU{#wGU3wjS<+=u%-emr(?4OFRk> zPVrzW+?N7+cR4n?i1K~wU-4!RMJh#=Ix7UhRLnN8C$So?`@>mSLlZP&)s)+=C>*WU z+aRf!T-1ot&Z0S(k%`qb!A`KudR%i-tzy%S*#*cPnIa)~VVwYUv7I389Xv;=jLfgRd>7h1^kC+Z1yBX{ABmZ3bCAQS3-fxf|L1M%Xhy2NlR zAXu^Z2_4Fr7`~wHzbMoju_-;7hn=y&*VP}A@FDOc!!7zEDTC>@Efn~rg%7Cwd0jXbN&zX76X>cZCdu504wQ$G6-ljm$lQBmUcC@cy zoQ|d3Llip?@&4du_ZmXFHZrVVU^@u5(rIB>C&S1$qW*a7X>fT#AFrRsp>_Co-Jd8X zY{dd_cvtLpaDtk}z+eR# zF_#MF=mHmUf+Xtd?d-91KXmqW3ZImQ_PWc$Ur;znrHP86Sej^XZor`0p;(&G&7%y((!@OHBZThap;(%j?|g!iv7uO+ zSnAx#uxKcjCRRFMWLPv5b^pNRm$7i#>i?D_8+G9k5AI6+4GGV2x@eKgm3WTU4<~Ta zM}{&E69OqD5`eJaw~!49wngIcy(Bi)Z7^(ix-g$?zKf!&~lSKrRZedb0`Xeb4(4fwFEnsGlv@Dz+HvVgV=hJ zf#G7tHGFuFT8UN9#n!2!#Dxs@aW7#`;sOfActeAN%Zqaayud1gu_y4I;z+qqrSE|@ z#ker$>;;YRI*QrIr4B~8;~)qm)Ml1Zd-Gwj-Zn;zf4?I9@jxI3dp;`%tCain zbMNy>djaRxz~&~mG)ZvXUu%F;9u`Wy^0EEV6y-%*4UOk9eP4p_5p zV)&kCqyXS83@@9H3F4O_VigG1Q#PMwc>q^<^@r z+?ohc#|WA7xWSDOu+OFvikTK+5F`p1T(wK@8X^ol76_wd8Y2v-$7K}N6rpedhUg?( z+v*6>#0V|X8X=(Kr4ou+7h*hg9~uI!YhQ@)mmrW-scYa`9l#Ki!~mj53w%qYJLaGg zEr25hP|HJ9Lxe)3?H#U^YK>4BN~#ds0bAp`2!~;#8Y5g=ggb+q7@@8RQS>Y_L|2Jr zmwc~1LQY`hmKd@-LLzimSC{!L&!KV%cIXPtPU)K>C~6W>oN_;;P&$Lef?NK<2Dc2{ zQ*bH8A=I;YY0VzJ6pJlJikFsJXL|SxVXts)qHwp?;00DqVS_rYIziLe+K}tdTHNWR zczZ|)NfAA2&2;=%T>)d_^@bVX)K=vMB6;EPB`umj#=P8v=$CDa(rb-b}E1ceKremMFSw)?H>A_HCdfMX`omdm+xZQGjl7aDT_ zyNMd(5BK4D5X}SM7ION0>tw9=7}biAfcsx;TqJ(E^rxZ?v;z;@KrPdcjjE3Uv^g@} zSY#9C^DB-_%_=(s*0gq-b8&?4XdM>3B^wI{sGyOU4!egBOMyFV1Nl&1Vnrh+k3R7k4!X=L9 zAs6%x^0D93(b-g$`02K@kxg-QAJ;%@Ie9Fr-(0AM0|E{={{41Ew0HoS9L z?<1+!w~MJvG-lB%6$5Wg7aMRY?+RmK&m2=^755UDB%;lA*OAFG1KarKHo zxG!s5bTq>w<0AE`iwFu)2Ctz5zY%I4IIL84XFKnq`_0f%Dc(E1f~yD(EnQR;LeVV8 z<{^G%-e51klgCd>(v>+A6)KhRP8^-|S=Gi@V6=lc@IJZWLEIT^kLbBO>@9k5*(CH) zG{vsulEi9RT!)l#BSOtjxsTWyKojh+FqC+tf|O^{+Q%d89CF;jV=OW3!4ONkvjPgY z*mBQAm}3c(gTIO$;t-QW8NTuq#ETIE-UO=!q;pdAE`?A=QDCO(?(e(7cE4_} zbf47xFY=Hp%1PE?2y$7%{EjguBuyQLt%EUtU`%U>smCdS$cgTlB%~l-P>XO(P{JI= zm}yG7Wc?JXk1%r>bDd%!Cmvxcp%p#FffmYA{;3e>@C!QI9yulwMI@ad!XB9$fk-+* z&;H0FE7e$hJ+j1U!nfdl#aaOOk!I&4O4Aphj4|nnp(>9UTfT4h|DAlZ_0#s-nTbw= zd3J$+Vts;ueMbyB&o-XgWAKyP`mz`F*zQF^Ajw@@76 z8HF_Tk0SH&o9t8>USFVsy>wf^X}s2)_CyH~HGr)E28@pM_?MOH9^SbjB2YUp6^Zg* zVu3?;(+rZMC5?cGhi)!WFfV7&08gS&)lnPkCsI1<1e$V%GzHh}I6m`j=YY{!sSN03 zu7GBRsYm2MBkBuyk;mbun;4t}0K|eK@>sqQLhO*lR?D?f^il;2h+bTlZZk zjg;}en+O>X@XEpe4wZ}se?#4OC_^~v#Mbo(xpwn6+^{{C;Pp=>mdI^^xs?$nLO|oT z!+eIJ?GY3o8ZlpDXln$;ZNyIVWrj9bXypb+H9CkkiEWSh24__uPB3;+G3nT^%J}=5 zBN68K3x7GT4W2=SPZ^4_!8-$!kc5Dv4+r4~DzYLs}T&tJdHs@JF6p9ot)yEdUGU11mb#n{uTRoVg3o)sNDp8a zSQbFe+lBx~Y=%uAce>pzlz|-FDeavpDHxbDy5ODx0J2+vyT;;e+gmNxCYPaZ)HTS3 zT{0%7qLL!t`z>ZA5de=4LsZdEjucTYEw|mx^9wKKk|e#!m{h~%<>pM}ge$<(-?G^A zCSz6&Lz8nMgWE$egyAq$KbJGORlyS=HwtJJN$eb>4m?N3t@!u^G#3G72MEw>uqNZm*N<`mMPW1D6e?z0%pHte-TPNyWDEgLG1e7> zC{lHb315rR!%8e@@qW&(2s*{cJ2GEkczB9QdN7;7`2pbyq(IwCqC`z55u(0tTPfcU zW$t&R&}A=Z1J2WPU8j+bxoOKs|N3P}@U1hXW6d5)XFl=$3S55xCsfV=;%- zR?+bJ1>A!7`{Y$Jy^u~uH`Oommlc7HEqQP7q_x*s9~tH=g`~Rza2c&PxJ4NYL&xt-hdHm{t3C2_QXmP``IBG$C4Q5mxaSu`E z;P|EdOfH6{Mi?eHWae=ZMPXnXfTMW<+=+twpOst;xJKYYLSHD@pPZ`L7O7Q7DJS?R z&$f7cZ%2q~wA(B5tYEA(L?P7A(*&h{E){OHr5bUIO5B9IOFAX|R!XjW zjU{5b5kz+ie2>ZR)d7mey#9({=i~mACmG=;F>c>yey2DRrus(j5XMag0-K?xfPDNrNP=SVnk@jGfIjax?_ixBCQY=+(&aI zmr)EVs{x9MW417={nec+N5;XLXADbVyvN1xL0;?Pejni!iOqyR`%@S>mhCSBRL_+^ zKPBI~+S-SdF*>~NhX*tQZ|Zkn|^}$kMr5R4dU6?*TRl@a0u=`Dfgv!eUkmO!8(W!-Ic{r za;v4gqOcUKh8Ia^7d>D-V3B{YP60WN=3|)x zk$DpAB+yjss;Fh-Q#M3(?Mwz2vmJRn7;e`?#X|oyF^*nk@#}19;E#>t^A_Kxc-jxE z6sGG8`rFHU<@cU&WP4@2bCQP>XDR;&#b`LRQ@#na+ z>DY_IVhUFrE;)(eVFCI%o%f6M6W#@}t(O|q!W+TvpeRp#2L%s%#E6J(G1O(sr`LPP zWlBmY*zsKil_0|ufro}E@W@9+>@qc#zY%Roye4dhdUBBbP{`AGx4!pt5-}hJwQ>P( zEzjl>3U>UO$qdhuZql60$eR}2!)4%bktEF}>LMypb^E;cvz$TH1B#&}G&F0unBoxg zV3r`I(v6Hg`15l)))!8Ul}7!6L*27>`Az)Ots%isVc#!^eXC(B6wjk6AQHEUZ7lHz zIJ$(V>3C>$NcYdQLz}v7j&mky$%K`Vi2^J^;o!a=8}r(Sk+4&oz6kUD2O}K2L5?fB z`%oGRn@tRDee`vK-iya4xK8_(a_zm)zfqMI&|Qm|Pt*>ZZm&f|D4h4DQCD~;Ghcuy zhM`8s_wMfc9DUCCCpN+kWUxSODVt9Is^T2~q?!;3GsB(FiAEXZz=f7kGA}vUDaCjo^F3IiAnr!7zmMl+-4`9K1H6I| z598Ik>ocDsPyZf9XFedFV}#2La#jRd;nV=9BvH4C^{O%fWi_|MUUxNVI~lQ-5r=*y z{E)eV5QRZF;L-qRE_3MeORBz%RGyGr&6EC$c1@sKfKh+eK62bFH? z8RUCMS&Xz6Ry84NCPJK$=&@yrj>DC4e^=1ljYbNL}QfA)NUcVw}m=HYUs@>$W2 zKL^LmZ9BSfnyb#!W2-yW8H|^zhb2Vy zj>9Ldh3+_LXrs*t))Sm1!yShp!ySk3t>J>a;}Bf5!?a?h3lDz~|{JkMUO&<(T@-ROT(sddFQ!Gn>Yh z#ESW@lve9rU?Ir6x?z@M=!po}I==r~r|~2K3iiMfJBjo@&@r91q?J)5_h>|F9IT2e z)b@Pb34b4&Sb?faPRD{9e-71FX7-HNdd;84y;WVY6}PI|SX-(v`(K6^sgrqSBo%0InueRM~gowga-bKZiXV&+fX*Ne9n$$r9I{ z*_ene-TBz z;hxCYx{Pv0+jiZN5w2k;XU>mw8g0KkbY zwEpGw741WREpTt*BHULN`zaO{RqIWhC+V_H(*0%;F}(!sPXvchTF_3>o4_k6eb<`+ ziBK~1v(iFV&jgW^9p#Ci31E~y_L%@qIdUeD65*Ku#_Dn=5O{bdfJ2R*37+O}L}!BJ zTb&64Jrn$xON3_vShB%jh5Qp=X2ii`)R8y23JW3zyMIue8QQy+EFdBW0fL|*>NgQG zx6!(25O=)LLx#q(IF)i3{{x*z!7*T)M9rpkMqYPq2?b2Ztfb&mpIr~+mL-J zZQ?>)^KCN{V^X1XaICP7s&R;QL>nK!n5ck<35Wul{q29Dz9>UQ;w`}OJdjD@XY5Ud zd~|vUkA6WZ3Z2^6`CVI@Nhwzq+WN#Jyu#v41p#GLkhDH(1xoEBM>`Kg!$}0h(pn3{ zrpG9Wg%$=(&tdyz<;oB6bBoB7rz=E^_jF9eIGeriVR1%49=Xmd|E-1R&oB30yXu;aHkfl$S84I;lfORj(aMv zL;s4E*o8wLC_+D>0u3eYo@wHz=_gho;x65Dn1jfIbB{$pk2nLWRCX+;!tlokT{xk8 z9m56}x>szDXu*^Gy8psSG=MCOU)5UgFW<#ZguTLk#9wGvuQ1<*j>F#JzAh-e!}Z;h zfucLy8Ww!v9j@=T0wFgx(-{@s*x*nLl-$@Xlu~+Q<0s*9MGlM7=E!03FNw%{GS?M} zMI059&{(j;A_&&L;S-{N0755xE5ilb1MkU>>C^l)r*N z$XHxJvNA6O0QMIG^i$z?pbD%gT9u-6Yi%quMXbetkkj<{V2Y;VeMdMIS@DEu%I{zv ze(1NDhjT>ZP3kL($*hyF^&2_~=gf2#ZdHhWiL3yN#iepBLd`_9Qn6mmu#+Q_?}G`eg#B3lmZ_R=mdpg-v;N*k4fEMw{5xt zb#$103~Z>eSucm-DV+X3&rtKE&3ZYq!YK4X$-BYky$p@Z_2)ay*CqEVg(ElMCG$;& zx3^mOrO4kgaBZ{sA;ViAvbA4|`~`ylgyDz2C~$uxbn?h=UIy6PD4A>kyaRus?M2wy`^cKhqlkHJAsdF#-R!A`;C{B=+e;JC$~ zTStYO1yl0R;Sbmzp2O8^f-AR)wIKIkhg7hZJ|pEj{IzI2Xv9f>Efs;)hosJ?+O}G9 zolU5%_Om(fEUIruztmFl&Y~GTVv}9oSya-dy8W}LD9(r6`ZKA$1u0kb&g2G5yPSf5 zCO27<{uxApozj#usQ)|cZ_XsOtwC)=O5SdN4XPWm9rzb zZl_e}6uees&FvhKR^`3Z3A@8$bKdEM-C?m^{%KUzh;7(uly$_m>@>=V=o8dY|5RdG zT$RJtSJFWCmwPmM3VPJvZ`s5@g^)rp?_?C*X^B_xPDVbZbBA{_@+p~f{z>?FKS@sc z!bw2F)lm{BqLxCjXD}yp_fG_p(}G@&0V|Hsl?XR(HLws;Fc_2cDsTnT*kJzu?0tD) zT~)RB8Sc%!8Jeb3nof|mX}B$+O-ourNik_tNF{AUnqq*KG)>YbZQ7=7I$*vpLq*b8@$wD3zmTE=Q@d#wdXPYwcQ~__TK<7pXnPi60=FX zb>q4M&cY*w7&Cm?XfaiUP7pmwBCo?_5NS{bkp^WDF^EsYN9QeQntT4-#ze(LD@&@1 z0i_Fkl&1N(?0(wA>4FhqoGut;-yg=wy`b3sE&&uFupr~K1{B9{5ZoGB0HhIVa9)s% z^ZWqk`2o)J1DvyL76UA!!N>_PzuCw9Ov}Ug;By}4Hz#3!^C-IuQw*P)?#;#a1_BJ` zkx!u30MU=*Ekx^ElkvVK!26Z}?_0unljOiVK=uV6*$T@;vigS}vM(ed`@$%jUUMJW z$d8lJc_|s49|h?AC_v{&8PLfdXf{890jFDD^?QD7(8w8xBUHp(SrD(I>?bjg^AQ20 zSQEhcvEIrZ%JtBIPI*IYXt7mO*Q{$79>l12V8>VZb_}l9RwE) z)B({z*l!QQnHtm-G-!t9HRO%|^cvKZ+@K~jXg9oxeuD-OA}ux_xnI;|zHwhU4IgX3 zUJHNF-7a3p>UFApazBuQ_C+DI%}xtxg4t=oFu3756au!$_b$s^)CBFidslp509XX{ zvTq8Sb(ZBd=isYevu;Xm)=g-{7Wl*bX64+3e!7_u!`=g!Bx5_zo?+RIdAEexDUP-3 z9@Ea7*-n38151+$$pDM(x{!zWaP+~bEpw7fOF?vt$A%~Yi(K6eiE*XL4Tu5QAFb!7NQofN7^@X zyNDz_irAFVOog(cV+~eWT9&u=c8XWSo@lT2;ru!UJsbFh*fs)jGLkp5R+u-q0C=6H zU1_&5R;$8^+ekKV#l_+BE~JpC8w?jv}i;$5sxf>N~L|>rscReRLBe?b=mHr;?l!qJ}$l@ zux^WKga^lUKBb7@#zPa+X>#DIoN|0JWjRi2N+aE^egwbG(#bJ6348^IMi7DJF`OpD zJ+Qo4(d64*I80E0n)H^!S7K4#!|>59g^FQx7>x8a+>0ko#^nGe1{vww^}j-O*t>a! z%TrJ>9c{SL$mH?jkcXcsBqMRV6LtX;(Z7^UB%@)m9#={>sN#V^kq3ApO=!lnljWtJd?(?Fotb7y4T_gOE7}06fjb5?nAY7j?jrc53 zf|>|4B0HaVZks*lN6p@G>>Pj#*dvn%Me0622!Z*J`5*)tC_MkMoHfFd^3@~dNskxb zxWMDd?bz;UcydwngQA{=5if`TU)eLV1#F0GBG+uQR!R%1H>hZfY@Q1K6h?rRxEYQ= z9ecQYIKOV&KuVmD!KblQGsJF{=}kD z^cSF&5-$3Ej$cgUg>cXD1;d9gk!R&)&AN4vbp+T;qYps{bZP8CD!8@lutT8TA~)KL zqF)BcNQEzjMZuTCq9D^qd%_=SSbdh^2LsKk7T@vkhntoA7k50s}^oDv6RT)>FU(JX4n6ns7lY{NCxjA5c+QHk^9PbFVb4P+Ux;?VF!GH zjh8zR@H)!=DqrOe1iX$>(GR_hqvC^c`6=rZvB*nI2V+B?0U*Uz0#38PBl+fV{dbIt^(K1xz~MHgMB2cCg|sxZhYoJwGe-*eVZZ<0NOeoO%t9$!_d;{ zxC2zs1D(*$>1d}moXy1RM2`-zMhmhAo(**HO=TuQ7|l@)hcMkv0?)6c#kjhAowDYl zftAuWER3;Qy!pInb!hhUVrg;RY!4y|5zru|wrdN0WYz@i08 zSGHog(yG?Ts4!PGM@EIXsv)B?e0Z>`8h(PJgPd*sH|olEmzfCc{l*52wHozzjcOXA z+6%hDi<)L-3$HBum5Ix&*$(^TjX9+{QVkY_Khkg^pAJPdS5!jThh+Dx>Sz?Ui$x?-uCUvGNmzPUvJs=A24mj--}~t-!8|kyYI%no!>Zje(gz| zIkH{Hw{FR{mZuaNo?Ip9+3sF^#z&7CR9gRm^+g;txgr9=FDDPq@<6>lXod&+fs1j; z&uZ|?6TFY2h32ak5qUm6Qli|a7=i0EU^z^+USfR>ktY>~uS6J_`-DlgsXIvZxWZVI z=8QbT+f2J~U;73r$^DkTvusne`%MM0Xs@<^HK|axX8VQ$Y5xz_Nmb&YB$;eiC?hVP#Cvq77Ex7;Brvj{058AO6pF%TfOMGYm8}GxIGAQ9x z_Z-g)&)hiVvDFMAQ0i_Y9tk z>Fq5yiJ~7uSIMy$O>yJqtU8&x@HNVh4=XC}=6iQ$@w0Ya-O5i{vuW>iOTk&yD08(0 zqf=Qt8fKbmw?=X4rD?raXBqHcfjjA1I=0e$dJR>fQ`UVB(g>B7L0`j6;+Ir5KyNeF zzA#z_8e+?`T=hi|5ZV$w{WJi3TYEQc#1%GD%F$o)iWQW?1p$r1;U|`FdF4++OjlcL zTW1Hp0nlybOYG4vn0ynVpKzP{`YvmPMm*s~ARA13%8;TT z@T>K1>)q6CO_8)iy}HLE0$%`Wld~woe@k#gMQY?sd0lVIrj4!EEUjR^A;>sZAbPa5 ztxXctX@bbxP;F@ISlHv5fIEQ~Y2*YiGMwAGOe248a4&|cm6EBAyEJaq9ZJDd$QiiH zfHyR4(WvuGnPdDiMONIdv1JC|(O#j(e7{?xfBji4cO%x zUc9$E7Q@uQpDz}f*+e`#5%YV|!^%2dgdLBb>)6=AFqPb8_$py?;haMWl=Sk}w$2HiKD@N>svRLKMD8vT0+RT-@}G z#MSw6V-U9%-%?)*{|CP7!8YMAU#E98ICdJaS-+;ERX(y*{j$R2LxIP7=CWRt^1KK; zK6Ef*dRigBe$J?KYdVTv!Z|2I&J}7T_$ULac8|E-V{V23nFw-XS>aQMDaLav3!LosXc(BrF06Ih)yrU zicOY=(z!v7TeeNN=*I_5L_zDYAwe7C!R`1Ud;td$9sxQ{21MlIrj{V0Cy2neY8U|* zNsslGbm-O~5**dB+SF2axj7&ZA9SW`d#6Es9K2Y3?h{C7+BzNgwoW^8X}iC5I-ZMa z=Wf>897yWrlIqT-Vwq0Xf#&N4r&MZX9wfOI3)pkLb>W5eM8ry ze$L`bF9G*{sw6n($BqVdMa=T1v7ivGwcQC6QrV^R#V9zycjEX zj!-G^G#*{?MM`8Vem0z7JgciV5Ei#hgdIN{A7x?;w&a~6WO~hynmGd%EjK;oyC>sg zfun!$QQPSse2kC5sMHpEhhr7}r+x2cEaT?#xNa^_2nybUxg9r~%V!AK-&`K|H;`-L z!EVjiK={KlEY-(zu}>UuPmK5{`Qo{_NwSMWQH$EM%$$;p55T?Y&|lf=3kym2w~efSXJ znjYH8D>Z797c~r3tr2wz9o{0jw`h{hev%1VZ3{mRWAW<|*{-|Q#9FZ|xB)4prcx4A zdy>G$B}5xrS9D+tj>-Zr#*RC<#1&s8=?)3RI&WlKvE)Lfu$g~)hMQxcTzl_Gnla(lPZmSu~sY> zcP5c^>0Vqg7tXrUYpUJudvW77t}Dlc$r$hOcY3ZoFfU8%rE^;GxHgD7Rij#Ux`EBw zK~$;YfP){Om7ejuhM==S&p3>Al=%+hc*KjwIakT)dxYc8gqSh~tkX6lA@*HjJk4=u z3ab=Xao8x?A0()XVfR++s&MQ9KQ>Yfhi?l@mM_H_3f=3)Td{nDn5jd24@UFEqqzNC z-O&#U&bvL86pxN)47%U?j>KHK-W!Bj%%fkadq$$JzQT)&A!_X=NWmXz#LZqroDuEo zwycGKl&BBgy-JTpTlkihX`UL~L1jpw zrlm>IB`F>ZQt%T5CT_FDHGj&>ed;LmBlVur@52&ZXTPA=w8e*@TWI!}XdQSxK{QUL zcXhRF*?@048=mV8BEdYo>Q;M{yo))Bmu#z-%!+06!n4#R4}6e0&Lt16(O>e2^V8C6 zu>`cy#Qed#UMC(o8*VKg-^cYjnk&!0UI$+m%I<5WEY8oa$x4~Aue{Z*xKoM+n}w3T8!ztSgXU6Lmvx6m1#Z0TU@b8_X#p`iY2#Rq z&35J5kz84T^xm*7O5ya+r3LA=%hPQLO&2#UuD7P8rwJFAS_qq-YmG2f-Uyo!L16GI zesl024r7O1f=Pu-UM*aME)djE$BdJ$c zDmjIK;z_krgGwj^jpQaJ@?LGQju1T(X`EYA&n;hYuNYweLerSvOL|O7^WM;{K~&!_ zZZ4>)NwsH~DXp*3^8D{cWT8jo!&H9JblG24iQU^Uc(wf61HT&?ZQnf#6!TmNSV)Vs zN9idv9;C=QQFZDK$lpojqzBq5E%jdzcbUW4h2JpkViD!N&jtTeKNEy5#E$!B$ z3SX-5Ogi@3hprb57tf{=3rc)Wa(c10Rq#RtKEgh)pcwQlQPK~V2}VaHzxUxed(d-9 z@zbm~O#H{*M>1ojAb)c-)D;xQmglYZ`oxa>Jw)ip_xQ3(C>OaqiWMSt@I`Kmf?crT zmtF6EGKw<>L2r~gP!N5?543_hMqbd^ zzdWI_*GA#~L#%pKey)+*zUf73R`taEP9rP7rjZ|x!a3K|qE3*%YTVcF@!}+-x=vzB zrp@YFaz7M>i*19C&k%`S*6YXetb~WpDH3^jgCB`v5vll0l*ps&P2@G?*$oDtGbOIN z$B&bYiqE-PqwxZ|S4ZXSHVy)Ch&!8`0YU1mZR^%;Xt(MlvGuwk=2g*T&R*hP6;0;s zUiV67?+tPGMOuc(!O3$Zw^!#Q@u4%K_=?nqUYW@(lPq2wyk!|o%WE&bLD@bB_Jf!g zo^5MwknCOpWOwlq(2dJCbhYd4W|2$PB#t|SahKjkPtSW`WQZXH7LHeoKWxtzW{dA2 zo&{)EXU}qLhg9If?ReJE9D5Zbu9Jw~9c$IufK$S_MlaLlZP4QQ4k6Alk;So2?tNt} z&SQ_fyiMW$nP#it22#53(R;n}d7JfdLBSukRA?%^MWp&~yAS7O4)4o)N4O|VEi@FQ zLOl*Jx%#MObm5$u#wMfUJS7~`XZ%o(2iCCPmficXxjjcUT(Y&`p%L{FLfxXlHFMM$ z8bMLJrKsfh{0p)~nsH~jZW4r?(ehcNB35tpg*=pew!6i zH}36OGm-?@zU`4)n83)w4`9yLoI?!cI7$5TmgzwcAIfXeDu z_}{U1&U$xiySP@UxBFziDBpOBzqqSqOtm~Zz2Vbqh;HoA1kko7V%a4gK_3k#Xj#4i zlU~bsQeYrh5E>{y52WouWqZrXS+sh=`IJ3HtxrBaGxT! z;@r;H)*juHd5VpTp)7k1_UCd_=2-KpTQbM%o9x1gl*5ErZ83Eu7yBHySsz6(nlpuh zQ^Iy*G>7c6M&DW^Ig_}3jLC2@8jmJT)$G}@@NiB^io!W#+k?lUEpZcwz~fjrU1fsU zG-Xo9p~2T^DcDfUl4ICzaCk?S`3c`jlQ}+Vdd3d?1eVquYZh+&dN*4U;4Is)a$5^` zMD?Drv7_fCb|ow=_8GSW?h04>@Ka4&!`4_We51KI-+gmwo%V*)I(c)lyT9{Zq} z#z1!OiY@~_V%KU*I-_N0DFDmn1i72v*cly&L|bslO=mC6lP*B9?em~Yb?ohQ0!N2; zX)wOU?)bO+v6#^9elfQawE4aJwINhQ7neIL+a^+jYzB ziWOZQxO5pfcwbh>2iGI=!F3WQ0OP(VTyBOBuJ;IivfYIDx%F5KSEX&~=!Vg%S;~W$ zQp7A@hnL3ocHf+HTV-ryqM4YV=P?MUcA&A1Q4O@7sQX`uE zheFdSR6N6ZXv6hn9d+mp@~t3%XWK$s4*r=he5WxHHgAxmr|Y%8t_37 zbvmNt76wz-wL#Q0M1}YjZs{OyCgRBW%HP@U-XN;RM0qIg^P{raEE9SAWSaC7S+&2jN{xY|fHCe9g zNL|T|4dRLlS8}x)e-bg!D&_h4G9TxPHK|+}C_ZvZ<#OvOgDZZ(V5nxqHQV)pjo%qq7Qw~mav6_)SimwL zHn3w6d;ypj*jSr1$0YOR7N{2eLW#9otMESQVr9+Zg{*0xG>Mf~#)D6q+#s2}&z-=? z3b;EH>*~caPIGMS` z`4eE0JuJg;{g!pzE&M!%H}sBt+#7-qkFu}enZAu3IMz=a`{80AfDP-|BmM9M`=d;; z0vj#F&VG23pW;k0wI81111h)|Jo4{(w0~J{ zN*-9-+%3+UEGF2tmbTXHZt18uaDgEIa2_mZmy*H`+NGqxv9DxO*k}7KS5nyL`T!*b zY8IrVPHFdfm_V#w&o2c^)0amEfkdlUuU2~HVJ_TW-n9x_&lnxagA=(u^orIq+C;*> zM5Me#^DqHfzur#@n&ypCh*s1Z$s>W*YgU}PTAO zOG@)1AQ7B;e^jtrT5uj|jaBe19TJCsufMiiAB+U$hx!SA=PEzcPfFp3`ha7UAL=Xo zEXof{!<~I8d$S#VragEmx|2I&g)iEomtqTIdwaS6it(}$h)Qfnw3&S$FbXa(X$GqW ztP*X;i1Jy5(Hwpr=UkN3{fm>kKhlKxi0OX0a>(!et&t|^EM?VbQ0Q!S$=u;79_)-jPg|;CGq_oqW8t%+Qi&j);X^F6BYWhu*|3NLqVw&M(!Z(e3f;El-AejDrto>H!t< zXkG$KdR(ZGmk3{!HhHevH-rO-PV7=)MgYDA2^bb0a0g4fWX1Uw^#aCz z2vYR`0-~=Dr|KSH$!AhG!DSD#$htbtv9o*MOCl5z2}ek~*^&7%iCdPVamgLwZSKUb zPjrv$`qV43ya?|4M2u{${Gt>T?D`zWJYBlE@~aZ}#!+ua=&)jmlYHNixQ5-IR{wZ> zNP%N-k-DCfn1X-%j2Bai7|C-~VtOvyXJQIb*QU01$;F<-ttrOLw&R5;4{?%DM9ys0&U z26PFMxx%zf{tneBIK4|y94#@2to^2GW6CfWml!QAymytebZ*7fm|*W}n46P%JM>21 zymGlX>@|p0+E=+e;6)_89yc;=7)e#cEZ4@_1TU`-;1Y1CDsL%3E6!9{evdjgaSm6G zsjL^f#uM6}Qn&MNHYXHVQ{D}s@h9KVFyr!C`RWBPND`?!;KOO-aT#FAXJbMFKff zVL=DGW9VSE>??_vlxTUTV*|cl&p$f?{$V`Niee)HjzH=gcL2haj^GQ}1_0|1F6$_* zLoG|-tIUDIE$w^{H9s%gtSTo z2d{#oenk^Jq6tkWl&4gLa{P+?Rzyz=R|c<>M@Q1~r}*Eox~t#a)T|9kZQV&Q)pjzK zekEIqu)LNYflbXn+Z_lqD8m4Z#`7-uOIo4yj<`%{FnZozhH6koZ^bfQzuU=o>pFdR{7b}rWYp~JKBruT6-0K#+heMwCpLJn50jk ziQPQ~->qruJOf!KpVc!Jhi(8nqjGY2%f^kJQ#NjBo6@m%^OW|E<(pP+>h0>DjC=Rz zH_U6PZN=HAZ9N@UWZG>&z(qEE>P({MaJyV&1;O$@cf*Fx*0t^3IBFKTk5GKNCGN-8 zFlRjXCoF`k3&rvt%{mv>UO{|VOwTLD3njyNE5^zfEnM6PUJxp>Wzh#}8bSrOu>4R_Ej>K@gu))WoQ0hm0s7ekSy*EW?i$mQ8e7h*Us%(m z#Wc3mE?hjjey-(csyPeiH`LErqRmM@a&75=2|fg zFP_7QxOvem+2&0O%P}uRCs)IB7A|PQ*1J4?yJ+s5Ch*e$eXBFC`T9B!#A}{gYne9H zdG7@py{M^i@th`WkiKclTD&F=R%k=boC{FG5Pe%b+Zw8&`q|bn6GEd6RSE+Lu_w~Q zJ<$2{=G4?%Mf!RkXd@&ZAsyS;vS4BD+@^~g=33dqA4gy0pAPq^^h0e;Q;kF%$Q~JM z#|CE^-`S(sS>XMFrQpZx(M;})k7Hb}!TrCzxY{>+j1I7ZSl31#Z|lYBgX~ijHZ-=p zbt5!Q_Nn?_G?0QSyI9{w$2Kjuvd41BIpd3C-N8#DhJ6^_EsP$g(d7zZ8Uv|};R}9} zWV{wvEdZt{Q9y01V=Jz`z$cw1Xd!j6ja`>_SlOi--w?y1l6-{2%05j&O#`vH!^%$R zTXU?n8-v@*o~Z9jj5x}kr0>gOaCmgJqr}s-g3cHYEq1lRLy}$Aih=5k?};tP($H$& zznOi8=Gy9mkZkf3sLvh0+m7M%k|Ft&X&|yY{@MVBgyoe2++)Y!vjgEFa;)sBnsTol z+t`7xMP*OBMoQafd*UM+Uxe<9#+fefCOjgpVI7WlZ`?shT;vVAhPjQ4<}GTPyP&B> zl9=%q0!wPwu+zc@;Td=IxhR~Xqp@XCUCn}8j9hohA;9uSV0P7#6tTyhG7xoJ?o?vr z@s>Ny@YX;?S?-xitb&1O^Q}VPhD!Ii)Ag-LIIeYV8`f_@4fiYskB+qojO&>Aupsu4 zyOkPK9K%&Fy;vBx+?fg~iD54%KR4o5DIg)7ZMn1dp;~8rS!|=_o=auqj4vOUM^tJw zVKw?5g<0<0$0TLlz!t`yr?Cy-G+%OCuy&p z(&%-{(s_X8=U@t=o#I6tc9&|Wv?O)PvZPLF)z+C#S*~xUQ`+>ch!pEkilHYU4=@Nx z3$+M9(dC;~Snf)tT6v5k!|l|(l|lb>DWpnizDD1wV;F6gyY9b*jRcH;j_^eYWZEn>79a zN)+z3+>a>aAV$3D@Q*6wL0)rNfCjm6(QdHptbEokLkv1){^A8t08~|b+$%(CJF~SD zt=L-Zv8mP8#0PEzqd0T*EpK20-_Co2&+!FHS<`uzbN(B^)fry|8Qiv6WIX!Ra_SU3 zI#yFVudNr8pLt5gVj+qOGiUy3@OC)k6S0*W*5OE)vtXsXqvO|MHM7M)7b>(;bGEI+ z>3FAst#Za=pi#Ctjf!cVhyZ7izSWxya#Y7@()t@>5Rlj$tiZ+32=dJ_92LQKX|7wh zcm}C+kruOzVgOf;`S6Pm3L)A>Upbd(s?HcX7vDg|m6n&$9&*Na$6DLF<^bC{Z2k(v zMZgIgN^oDZvvQU+mYlR^O$)dYR9mC0VpvDd@;U3spX49(Y!QM5e?i-IKr;mBbPU^Q z{8xA>Am;>egIFt~vH;CzTZIwMZ(O*z!K!p($^r2(2V`q=3E|!t~=HO=I>7Ew;llnA@Q z43PTzg$;`=XX=H3MdKg9(^NTUp+@0z$74xLe#cainZw?b``QYe&1lB@O&w4=bW$yc zE^&-Bv9y=<2%EE2xi{|B>lfi{TZ4kL3i2(hD61saxz0P#nKeO$lm)Y;qis`fD{tYG z4boYq8WWH8K-y&)TcyAh-O#vjPVL-9bF8eyzoX<}MxxRo?#fDianeM^iMeLlVnm2Z z#7T@3)tQ*gi;{B1V?)>l`2(P$NtxP~3+L8biP%)MT;x23aZF}}(CRVVDsIJ$9*^)1 zH;%0KA@Nu@rk7UCsP?=V-ZX)M6vSk}#HO=4N}nF=0*KAvc!0TxzWXpp$X-=6VrTI^ zs~(99VrN5U@^naSCf|unck9O99vqu)l=nEY4?!pzmv}8?@!Z9jFI0^OJnJ?*ieu-B z3hC)+qoEtCZkD`OtOtEYK#c;lBY;I6W<9altC&idZ4t>6yXap5$Zsz2xJjVpv5R8u z%Ud?8#Ia({)Z4@pKv5~Niwy%20!w2hoX#;Lhzb-2>RzgYX($2IPF8G*3ZWuGmT!X@ z4+Xmt7sJJtYSLmxC}CTO6GStpKoqlX#4C!9ZCu~diEYqUYy}}i3J~0S*$w)w{Fs19 zzb_(BG%iU@Yn6bVmobTeIB+(>)zr$}R`x_nwxL4@L3&B-Y#8~gd)ATX><*iFdyWjx zu>p`ZOqNpcl_g#ZY1uu@4=38EUO{2_%Pzq?^UAzAZWT(=HQn7pMz8XXmR-*AY{O@N zZQ&ed)P(rHXPb;P%Pw0>%(C5OrfBF`FjPvi7MVfVV#*_Jr%9`+#7%T%ff!D^aXk}X^fyg>)KBcf{WXMK7f!qZ*nS{^7&L63 zpL8;lQe}pdwxQH!-cf_3ulY$YW>WG-Qc}ylc!#Du;-|cdDgPyfTHvfpzMv_e@KfH$ zl(c~@>^T}0ACl|FC&UY~Ff2-}+}v~V3OPO5J}39=+?lyEa*K1P<<1*&TAmvpgoTjz zLHR@~ERCFowDX2I=>F(PlfDY+2*^rJ!;CT8&PG|56(4Jj8!!dU${uX7kX(q(oXMtC zRv4}>*TW?>A}_fP%NhVclvoFd+uoRB(H^29ZGe$^`hdeQru@-P`UbtVA2VWZLPcgZx@-B%F z#)u9L-c+7H*=C>$A*CA+Dv9?su(Fd0&mPW624QIy+$be_;(|jt)LY7p1JDry48~1< zKv67qDi;)ZgiIq%n2KSE;`XP9(|aY$t1;%)7!T0tf91&qzZ-EH)Sh8TBvTYL@2kVo zXb(Xeh`jtjLJv&swG>gQy*4Pl*9Hfm3L^lAgt1BH@S$4ch#YE#VM1!~&vPMmo%P%Hp>y^*3jL9u`fQuHQp57{{V@456|N$32aIl6~?%luI@W5KyZ5m2L*55-4Rx!?A;HmfAo0C)z*Z5t3<~294>1 zn^=8{=*QHpZ}Nl$ozaD=!!u~ZaNQm$wSlO!|9u-2;}w$9yRg)gX)NL>=j}^KQdp7H2!S$FBe~Lk56OUt{SYBxrU~<9 z$~=|5liq`=WJ(cwI)Y;XJ{j~}DjiaKj`dQ4XB@VfrXhj+>_4-n(mAD}#G#*Vl;btE z|MTPZQ&|^OQ@LXDNq=QC~P`r{kQW+DIVZo=6&4$r8|;XJVq4pWcaS zjScwz1P!M&CQb$r-E>WmR(+pBEW=0&K%R2Vq==HyI2q9!2%-#H)Ba!%@C`TT7$#9k=&>KCtG^4{~VDRo|p$DNn*>ePRbzf``@OZ-}|;m-laYR`F%4u z$v2+d4;gI9_plkB2n-37_r`JH38Mbvn#@LN2E;!N(_rZJ%}U9*5tU5-o`5O)-|GG_ z8fp*q4{JZZqr#hE%$7V zxgemUryd6NwH|dGQ9Izhq%g!Nu}`#vH^{+umn0W?MMs;P-w#r03srIy(LgO zf086IhYA-r1eo55y10Ro(kRr&G%1W~CVyc1aHcENuRWZdj!=mRX04eVp+PE7%O%k+ zS$ZGOl=YN{(2n~?#8-%!f57g#3Jm(Dk)yADB}sG0aO?U>91kg34TfVhAbUCrp(Uzt zO>}>S`n*4Dl@Ool9d+Vsl^*i`ILkXZb$miiO)*CQ8TQ)=;S(Y~M<($JfilbJWa6L9 zl>NOTeV;p+PKXAfJ^=+%rQ=EH?{wWq=TN8`lG@W#a80C4AVfr_cEpLeFHWfSq3-rL zAO+JD3cNRy+^}3tmV*76TlBw$soj|};?mc?0wECVOKkSP_H<52t3Pdw^_#xlC<^v~ zos9f_M-=c_7dNGv=xj`&xkkQb|33@MsBlAQE;?0RYGQhW-#xAIJc*tzk%H!=c(IY%A0KH%08ynIQkSVSt;wbKVG0f^NW$~FK#*i!jSDfr@wTRc zErsO*JF{QAg@CSP^K9!Bm$sto?d#3NAbrv%^Ee5$CUXy^(l2F{oQ&rn==3BW4$F&o z=HSfMWVrRoW1^pf*%Quzb?NO=b>rSH)px~@$)f^eB9*{tMlyv=cyY@^(H|fE*+ZNn zs@c~kB&-8=_9jFjDP{Ok_e=~922lSA^^VM$COkxlr_$~OnG;0t`}u!6u9!L=Z=UJt zj(63JRC2zftn^qhI2Dn~-We?DcZDL#4{7rLsCEpVWTePB{geiQq{^V$13M_m$WInK zp&hZ_vReP!pN#i=Gsy`?XL!LNef&{iq$r2}Bc5K|duTrgo${XU-X&Y4Z_vPy=!ZV` zM&ICmYy}9bsIba==dGZ`@V!tM$vyi|Fk;X|AzHfYum3ERiex4RN|je9p*q8;hI=E^ zHY=c%BzxXPV^T3c2}zqi#xls-{vMsky!e^Q{FxoSKt#wASi1cuOnM_y`uU%t_cOVk z`y7`4ml!df5`FhwI>q}lx9ESbq&4~7vupn=PbWkQONbauMe#jwY`ljkf@=dUm3;UL zwnsAVY|eYWbvNJ;&s;aBq0~nARv+F2M@x#0kRr(X?Q!xf$zW0w5b$_*Z(s5|!&ayi zdzlK1WMOZQuyr&E>+^EZJ^_1G@Ula zR7~^7^tCf2y@b9zI`1eAGE>)MCq3_oJ~^p1u9K`hRa&OaKS;z3&ZQ8?r*cq+>H9yO zhGC7EJgIpv7VT17n4-Zrj*_NTVdE^V=>g@EJW9z}zq3z?m8RH`nYg_#UQO-yG`+=s z4=DyVqX6GW9Ar-GX8ALC2r^cog+r#x`_Rcq@je`yWhSQNB@ETLtYKJ%k1q*c z7`(nOj{xg&-soWciKMsx5y`>RmOCFNTh=CiCjsAFv!1*8`rD(&9Rt7(yCU-zf$ZjT;1#en(!Ob@uy> z>{n)0CY)2x1DY`i@>N|>lEYZjAX^qJEr)#Pj8 zC~_v7^LLwt4RqfCt|Q#h#4>6>=v+$NAHw%aZ0B6i?AnpeCe{~ouXk)`i2L>q+gV5o z=DR!W#np%eUr_^FZ5e=PHNz3~(pe&LH=Lw&M`xd|)xOa3Wq@ zd+4~5l4@rMYdr(6<@a6aG~wlN!$fB-Ys+E&n7i37Lh=|cdq*h=KtY5E(aUFn4vUU4 zbQ(We-bc4z~Q!CWSG}1`@5BXO_8*knzW`*Xieb9AMLcI zowi-oOr%f^ns~d$f6jKlj|<3FgR(<2QV1;u(Q}w3;%>1)P0&lI5Mf7xyNQhM`&xCs?T2kzO1g)CpegiEmb{|JLrj?-77-@+yHS?Fo&^4@Slb{li=NVEYP+$VLArs;bK0u5qf6W@1%! zRieJ?Zj|`}5;2=u!9`JbwLJ!z^4&uq$3Tve0u1ts>4RrXEKVd66|<_G`-qLx#s?|k zydR;2j=?OI7w8fN)-aI_%xw3+LH0P}6H_sqfn_$+3cgWyJx6mV5y`SA0*MA9JlsZw z&NZy9s=FBI?!9`y)4^6oDUr@~-v%89Lul03C90iUnXaPBnakw*)0|i`uEM#SJT9*NOaOR8$hC5&j-u0F=mfmjim8c}ymd17LNq^Y~c`8uQbf;*9D zB_2zvsw!tC>YtacgpdMwBavj>qx1J(1Ij!MTHY)|nAkybAN{;aZfGt1w+b@cvChOZ zS(RC>8`{?KL$KCQ?|~+H(bHq+&s}I)qQ!26$_q*({Xp2!eB`jbW5GO#ul_=~w*Qpc zcBI$Fk0Ic~_qDyOQHsAlnxvyF(S^Q_k}LnH&=l?~G}VzNv8N+FeX8I?rx0%sFWZ@n zQTE!c&Xd60c4{DlpO{?q>avmDPBp^8?;0>8nze)Mnt;rIqz?b8ogsN%fgr8?y84B@_4NQCQ|QdjN#*7xo)KWjMgSNW?R=Y%d7$CjP+on{4ML z$9)qL=2U9xi<$RA9Tq$7vC}a+@B@ZNMe`6ha&%#*7zRP0PDaVdrlcPoGb59KYJm`q ziWG2iqS1v-n#dGrVv~zceltlr6@zP&5HW8iuF3f`wN+t>^A#b?wKAOlW{89~zHtiM zPR1Am{@-a&6#_WF97s_ORf4g%U!H5oJ9jhqYM+13SeiWg|t9K?Qx#9$7YWblE9okbJ0I#O0Nuo<6|R9%EYy ztDNsRY=VmN$aY#7g<*#Bu9r5qK%+o39JFg7 z2t*b@zFy^0G%S_Z@U+3gEt;D`7-6h^{%CVQ$>_Uff7gH;?O zRa}O$8KR|p$l1n*2y5KNZf|-6Mgt&uY{UXuv7+fNLR9UMI_GI&`d18tpoc%kkpc4+ zefLR;JCA*NKJD{-=FX>{bp3K-4Bc=#IA#fE12#zhUCH$mc@8Cg=TmCble4}_;M>g| zUv%zZ2y&nWKYv={wBhGIAcjU96Gh%dBo-2h^@wsRDV?Q=!Q`<#e1gc?%-AcWSJu%G zt8ho!&M=@;I#in|sLf$^*v)uW<8d`oU`WjXF{-Ma!veovM#{f1T!f;*$Y-(q0ykm1 z&31{i2oY74&Rs$n+WglnNf?Fx8ENHbr5Lup+_{ku*q%R@n3p8aZiW-iRs0#L>>PPK=D3of&Dh}Mx^XF>113E2+HPvK)0 z8#4=ipuoov1~F&BY#{(lVN$_Vy3}1ns|JFJ+%l}BYTW2v&=LeIavy_kh@+IP4WJAs zce(BWyUO{?Bw*{j505hEdxGC<@+{DvNAZtjvo9Nf+99<@d)pJ2IG<-KFu+p$ytzb7 zoK2_-{YWbhCK$RQkBCx9IXn4S%OWr11JjCK9EL|$g@@rmT=xkLZKs+%(9pPVySEE> z|6ktG!VjnGDEs)IJwqbnB!1EC#(A~p&ov78=dL$SGtcca&bWPRCS`h_QQ6~$?>P(b zVF^>=s~&Qgv(LkA{$f@f85qI>W|HqVC^2x)B+?3f7em;PFey>pqInBFC&Bez!RMVf zZ*D#O3{u^m9Futdyan^-TlPyI`|aN&zxPbWMGf`yn&#re0GjxGnqOXz&<-zfZ$QTv zxcf2ZECf^477jfC31r*#kM5<$uIE*2?3*e?==&SIn; zCc=4yi0nUrH6WCln0l%^kd@?M?7EZ<5wg349ES3tXA&hP#j^kdGm?X$MN>R~!1-d{W;@%|F$ZkG%?2-9f?gYpOx z=2KUZrKv<6m`R=5I1GKqzA-a!kBpa(i===-kGvlxdw144Hwf$_0c=S^fHc_}G+75c*E(GnH(lq^JPnJW}?QvjR=!?<#jG?ctd;T3{G1r1R(^B6_I{Yo?u# z_qo^M{h!JHH^5Id8IHE5tBZ9;%F!~rOw6zHS24rH{PeQz-~luv#u4LtG1P2osz^9X zh;;B^2{P!MI?`nTa#d8o&?;=IMHS0g1k5uIEl4S*2tQE6<;)Kk5NKH7)mWZ0VRlg` zrsNoabUQh_ki8l~bi^?-T4J0`EygVyhfI?>R4=Bd2+=OfkkHR0;WX*$ad2^AKtj>( zvP&jIq2Z&PcY*w1w_i$kvK8anSsE<47&$hno}O`#BIx@9wndEH9O4$kfG?_?-3fxB zbiyk}pnHJ2+WPJ8>f`_VEan}BX=0-ubg+Cu?3D7FOD!jL8TCyqcefW@~V#&I^8Z6qt-E37^n z1+Rr;mbHv)9;bHBkkt5bx0cqIE}4m$E}9x-Y)p*1LnBIip9P;8ndun_T{01 z^VlVW++yO4w8VbGq>|2(5+J(MCZ0R(lJf2v;EIGXboE$J28j@Z^rUZ9@#I8<$xu{S zQqp~*nNdHA8q89sl|Y8G(1|$-=NZ@C2V(xvCeiT(^**EmQ(VtN{01rvK*3@&G2kCV zKa|4}#{Qg!XI3a2HDUAy&7YsLs1h^-ok<(0s7NX?S2@Q4R-I5DqnQ$d*tsSsQD4< z1V(G=fEJ2y?o~Bi*k>5i42|mq@|F)7>|P_qzwOxjE3VxS_QPl% z?*0dQXRvz+)D|0~w;E)N+Lu&d)J0I&J<^IJ)He+!^^nvkuMks*^Xg_Ja};JQnRPla z03(eCJDgiF8NX5U8-dJXPxU&7r697@R;LEf(K5E{OaIvPM%6nf!6?V*pzpq@s8)5C zO7D8EnT#j1$h@==p+Eld#WKnrQ2%^BC~d1ImpNAo$a^~rWtEi{m5H4Mr#*UL2(6?B z_hyKkneO|T8^uBwbD~18p**Tk(NGUC2vViAYRPV8io((A3A&T!LKPH*V~pdABY1Nvk840!$?NqObF9$GDe^xciM@O zcLEJid?3os3?F7UG&JBPb(o-`55-$Gkcx#XP_LqXxRE)bDn0`|m4Hm2 zjGjFz+_?|5S%*v&=zv!QvLBG2lQ8G~xv1ehB>a(pzX0%Wu(BX8U&IU7a=tCB-ejn# zVFqaYfMk3&HSKiL;vR{6(W|RkbKEV^pCsh~`{I4D2npAH24Rp%i+&z28_C?~xCbQX zk2N-8KjoBDfL&wb$#8EPBpj>Zm!*iurObQ5$2HV~XSs{*N8SVuJM{-vS^3w%doT#U zrf#SCD7*p+>J!L9I7|}o=;d4{Je%VCY`4)wtabke?xEkl?}xavV4G*de^BV|5tM!p zlqd+=oqxy_om_oCC?Yx!IEqXYo&5vxFU&^TX6J7~+Ggiw7t3i-#g{+{!9&Z182Nz~ z0>;OAJh@%`i975^$H7cOb7p}m-xbw?_q8_7X{--CQvQhZC2`oz;m~TJxjTmq&1aem zNrDDEO7O&}&7rV3i#F>Vl4+#-HMAnnoyC|Q%Jjhut%c!|#aRx6l-!sD99F}nREl%t{5guzRlLswvq zhE@?aoUbU)UX3Qzbvy1gXEeBO9GtqKIY1WBt3!mvu`V{*?o3rQ_&l5)b8#?O_-i8fbri{ z-QAraGS!Kqva<5(_N@o5sA{g1QS`*5X86SDOih$mP5ym3Cgn5nYGR+B+zclX_+3`h zBkWI70lx`!Yymm90fDHk{T36dVzv==KeWq!31bb4394q7{fw3ESe3KIbE?Z!Uq{%n z#-+PX*R=Mo+0-4lPCo@7Ymk}KeAsrf(49@pxQ4oC(!t5!octCvHvm}x>R!|2y z0FDNwO$HQVfEtQYdq^x3A~RyM2+Kwnq4wgLVbtTNio40l;BLZqaN6-*!i_C+7S;If zrZ*n&R=zU2oBG%@(uWtS4?j=(4v~zTOES2FQk^-TmuTMnxl@gU=kK{5u&!}#jprkJ z-1Ae-p92q(xQ%Wr_S{DNh^&CV?KzDyZbAW>Ou8TYZnjK2SmrOD<0U-kCCu!w>dW&s zAKw{PjGl`aBs1-_>F)v^J1vtNt}kESZ0rE4h0{)GGS47TJG*9)ht)M6oo3f8xWJ@) z*rR*07mnk><4D@QdG^GyHLdfM=Q%xrK@73Zc}GX5dW@Q#S4IDD%^Cw10tapq$nHie zh2ao0#TX*nF<;9i|6e)6y$h;wGR5lG==O4Mm)zm!T>?pe?j!tZ=YIZFIiKRsIIN(D z5*|8q=vesOgzph$`FY9EP=e`d+5BV2K8|4sc_}N=B6VdZNsmD16L3-3_Pz4d$0k~X z3Y7J9Yybf*wjfnC*Cr7DH+d>tpKF*$Qp@8)q^c-S#|{o`A_mzEJu$&uNhOWfQ6y)a zB+Fu`RzuJWwJdfiAE$CR(fOQ}%3^-_f!Jqlh@=~vxIe(L*PtlOgep(D=~1|lP`oT> z$#i4@rmocuVt(pU9oOrsIgfYngQj3V4$NQ7Y-HPy&Qx?41J`v>)@(fXl$OAQMauZqru^PiWu|(}vc#-(A&<=dV)B1a=F#EU%K_8dz2jK(h|s}b1N3^tMcvbA30(-iHjLKR6!)rp8oy9+ zUls}uCZe*y_D8aBHx~;r`7hn;{AUCKp+Tbb6=VSy=P~iKczBdQXefW%p+nB2q4W=h z(tjx{VqKlO!_feBLi>8TyA^8vJfMhQ5IHhZ)}pCP!;Y z9?t!|Cp~UxMk;j)Mhzj7VhIrGE+cin>+~J>yyHFsi(-^Jjxq^F(DemZJSX8C_KC!9 zndsdy^~HV8XJq{C=krlVew;4|DEtgbnY}XbbsG)0MFqnKFmSAv7kbuDs+v`yB|rM; zfy9Btqx?HCt)lnQ^u%GvR*@f%KB0Llrth!VkCsdZnxWEflf^yENL>34{yqAj3Yli$ z1#BYj9uO<$zG1;A|B*Pbm#woStn2x(2?{a4136^0buufNJ%(FWx+%=0EOmn0E9+}&`H)xoF=$G!pIl_ zQ?_p3KIcv$w#ajp>W(gc_Vo;>)NnXuDE9T&UpEDYfMH0rbAWuitaB!}Hc)7gnU~1Y z9sJWbecj4r8d<{ZG_1 z**(LqJ8iG>-EVZYfD5CI&kzfE&;hFoIw_e3z6D3H35G zfRAuUG6M#E8KX%eyCYo)X)U$Rc|D3L-r{lX+FY!(VN(Ob5E7#5HzCyBq}!bqLD*D? z?t@c^0))F?u`j`sDqJE$$8X07dLNS3i0=tqkFsVm(c`3jRgd#WR#^+#0s1N(`u%KI z_57Cfl$b$~G}vn)qpw|_=q&D{{uUSm<%@fl`=uwga|PY8ch@#Lw=w&XMCruRs*dU= z(TsOg?U<(1$UB5>WIb~vd*KfvDTa{pvi8_Skvjx5p9^OQErZ<-nsbHI#gV_9ITrIV zm=3%}TpFASiu?%!A6+1e4^Us|unWnD!`$0Z*l_p1pkKF-8G3N zLO?{N!u^9qMxyILZNLRE6LP9uJbt?!F&dX)|A1qU-Cc(r6x;}>Iuxs-D4H8Us^#hY zRP^jfO2s1Cp)}aN3&KUTRfR5n!8HikkVQE5`;ap~$KF9(j{!c`y%X>Q(i3^^&j5)D zqzOcOlb&bLj^h*rd|8UQ8_72Uf%Y=4E8^w1@)Wg9>H7z?1qsh1O3XNYs&K}wyI*Q} zNq3cqmpL)1wzSs|?LhI!bP+n%EP|+)wzL}kgcgg{$ZmtbqHG#ob0IN*;=*kA|BRRGs6d5TXTtpM)a^e)o--X)^>_iUARS34ghkt8=J zDM%w@S461*zbc)>aAS?*)N_W}qjj$4eCaY$8C(ZzjBi1@uA#LdmKs=1&5kn9ec z1qaSBvU-7CKDM|i;gr%9#?1+PoiE6ed%|tCx%UM*p2FUEpv{dqKiyOOGSyJ>yh~ zY_XQvQR6rkB*zyRLkHGsdjVGwp2b+3LK@0|dyGFQa5Gg(uRER_%8{GAGzJcEEO05o zu@wQ}$pEy&nG1n2+z)Sq21_cQVW1v@H~h8vWsQyB3a(g5SMxpfl|a0-b`x9 z%w#4D-HgW{x%&ah*$)gN{kiUg$U2yNx9U(~4W2u}=(2R5@7@8SJ`GhbgI12%cYqV1 zd?U0d*sEvYNWwl;GMJP6KgcMhIr6&GM*7IShPx+qE8tJce!{sXu#>^gS8P>@z>uW+ zLbFiv`AiMc_!%kFVLA`%o&oRMj!kOwWney%CB zzFX@;;m9W|L^%7y39g_}=g6BZi~X>y?7?MMt4~n6>?Vg4&m#>l#^ZSq7C}x>FknEp z7UKJ`@ExAp;C-J$6Sm+Q}6_`ldc9OmAwIT}G_)38_t=PixKPpj_1~OrK!T&H~pbRSLbZ z6MFvv+x-@*E7xKC85x{$OgXqYWfGofV=H+~=3M!HNY>8Fc7roukwqv<)zBZo28?!> zag4wFVjciyg>*r=ToP~@`l}85sRTn2OC>u=laI-8{J1=CBxO3NAAq*Hk5sbi6E+nx zh;kCY6~+^=t)aw}G1kItt7)%oVHe02&Q1wdCrwYSnCyiK zh-74!!3*;?W{)e!3x;461GRi9#N$?w`&{=MD0u{m`$H!Z{FE5I`ShFLJMyOUv<&`H z6q`_t+4h6`j#kyHVJADZ>Vea=L|GkIzhT;qW!b-?m*P#Z6`COD_j=jFYg}R?dwI&) z!g7x3^C>&T(iOcaPL6VSKavjtUFUgIFaI~}1Yj7)CJpG*LhI0cGBqj649BKVMEqDD zBM3)p#9dN>PFrC+pg0XLXR`*$xy9q_hXbJTaGIr`7Rl#V*EeF1-db4F^Ds_=T@j(? z9p)Ye$>h|ToFFOX@Q^c(;$Q-6MeVUj1<^6o{RwQ5Q#i15Nn+V(F5Ag!$V8Vzag@NS zTFJ=>&{vy;#}k%f+@N!I3$s$oZbwJaveVsy*lDbk5sR3%an)C`75nGH!`K#P+fBP= zl+x68?8bWMzX^odD2}Bo;0?gAJ)2yDBO|~B<{YY%eURsnHc-WYwv#t_W&#t-*U^wT zy=b&Bmq50m(NP48$}tfG?N;$2VwR!8@=9SLT_+4eD+ziqFEQN&#;ascsiP|bOqs88o&`|}{|ZW)yDw$c$qPs{P1 z4q`izMty;8=-<@Tglu8wj^d-6^_fuAt^wikehT}WCVyjz_?(=N18UD`m@yHC6w1Cq zNXx!2`}C8}BYtEM3a99ljA@W+L2;7vf^^>+7WP~MR&*Oe^!dRkT{hA=ltbRX(yOA{ z)J-8&b|p&&oEGM`}0UAR-xZ0umh%hKR zgWEkSoLj|Uz-c)o`w|%tN_9VYBbNrBsEtR2y0e)83r;r9J=6r@@;^Q#N(_SqBdEgt z0a9`ECs$h_0A)#9=38BU)N*r(_jnAkX4 zb$uuPHJ^dK?mO(!=Zdy1(E}PkS?oN?0)MjjVzCCx#d?N~14MXsU6JK$707^D%m7#i zRh<~No9qUTNSkZnyT4Z(TE^dB#I^7tc80a^p4JU(xE}7WgMZ|hw_@DKB6eSEw|$+O z$aIWh(VRI8y^9S#5i<*|i{>;g^sY+ypn+vxKF+vm-p5jW`kH(4`aaibJ!+|QcB}I> zcEBlR?Y{tVA=$IIR<{!Mn5w{7!u-g#Z~llbQPOkid`EOKgNMYG zsn4(O8(AiO{Vc5>Ffa6B4p>5FA9sn&{27b-rkTnz{}Ylw{Crv<`uv_aS>LbjRp>^V z?64;YfL^46ze0fK8e()K&zV^EJAq9Ag_ z=E%alZxz=G=g>0~Eb$uGF-R^h(>9j#Eg5H`oR7F1lH!8;vdacQ-(#5lMN<4pAkPQ{ zVT^r*AqNn~kVY7#A`E>GH!h0#4cqHH7GXK(u^0rANt~kyBF}luf*`WoA~mlkN90pf zucEOth(^I0&Upr5voa5XpgbkfjiV<6_~24k-;y;e2=K5x!Yu5tIFMT6X*g3-I&&q(-Z2(Lxonh}`A4i$e~ zjH8+tao~aB6XRIDggbvHakh7Ny4Al{s6NI=b zi<>RarVypuSVhKehuVvh`&pdB`!OgbMvxru5pLyS+a`M`r1aue9orDjd)s8yIZ+va;88Am%=okpc|h0sFhWxo-o zTF%;@lXg82VVFBcyJwN*h_;_>64->${VYixom@Ehxz=~_RA`ais-w# zfThGK0Y3Ow_J9~21AA9_I<-ELXzn1=z{gb(@O*U>z&&f8b6UX`Z^&TJR zoSb>@U`g%TN-nM3ZOzm2QOxK02* zG-{UPLnfuANr$AD^KIGzJEWTVVxf(|U<227f@^{D(`G!p3D6+-qi9jH`+EuRL0HZ# zEpa~wLEhj#dpTAyxQgODAOfR;8tzq|7$>;Ie&v-{@S6)~mKYF6M1*#_Q+%reg1(a; z<*GiV1-1%tU ztVyG1V`Bbgk*pt;beToEI5@cgz6*X*E-K8rm3O$<_5&5b0IR&Pqq3xd@Gxq-Ve%kM z6?zz&jBW){=yIVK5AA`Qo z&S>hz+|Y>|@=#{X{YsWSlnjb&+{$uPvAB%ydXz?=P#(ys&wphl)v7Tblq+MzAqh)M zY)M#SvdTTFR)2AzZ9hpdGNBt~M=tSykSI}-!FCUvnVa*el2E~9MP`-w&)OC3b_X?(BS?K z=EnDIE^+?5Y@X|M|BkWNsbhZ(u2K-G7J42z(9~X9f1tGNo26wpmX_TlGUE*Ah+r7F zL(nFSz=?FZ4WqGlCI&Cf#lN8)4elSI7b>|!awJ`Cr8vF(74fZ{&Ra8Ib}?h$<2)=S z&St~G_E=v7919vRFrgVt98nKyv(%JF@wI$fo}!$%xLB>O853b#UCaV9r(i|lw z_k~?=>EZ8T9S%sL`ZKVF`gB|=@V{hYz{FOeV_p=-A6D= z8n`cyjRjlERZFJXc=eSRqaosz6|{Ck7p#Ia)vsQ1uCg&9OlN6~RB$X*Cy+^P8gE90 z?_)XdXQb1bLj=kECo<9%onGk884Gnj$GuOL$1Wj1VziFLI{Nk3Uyq_UWGLf)q0H}G zdIcfkF$vH;7F=&bmTC5jAwXZ@ABmYEr-)(9)9j^VD0oLfHR6xK6a*f5=vc1iBs~)8 z)rV_C39o=A4ep!ZmSXo(!;!u(0)|Efw`v!=|3Jmcjw#RYiAi$+9q4zc7n&n-a|`<4 zL;=HM-rFgT5Sh?+xi3TMHMn! zQGxkBxvg5tLL5pITMEH2_DEkr-YJ%=It@xdMnXH?SK&X2@Vo|ZpP=Wx3-=Q7533fo z{af7f>{y9R>l7|sHY{=(|S@;NNZYB46a~+l%|kk3IT#E5=wD(16NpeWlwe0 zm90A5imQ9TfkUi{iVPh(bl6o_d||i;9b@RwG5mkN-|IdnX`4Eq|DIL3bDjI;dih-T>BuDN7&mGSSxk1SbgMQMmDb1|Dm*no(NFJK(M(=!qJ=ZT44Nm$n;&0Z`+lDUvQ z;OC15{I+O7NePu%{@7}e$vPJ_y57`XrVp-ss<366BC)EKQE?{wa#DX*8{S@;UZwBB zO20Z$G*WId2v{5~Xo0zq3@3wbfPAlx&&Cx8!i_UMjGa?89X}3jMDhgh;`pnS6*83x zl!7pVAj^19R&9K3;wryHafH}C_-2`ee{$b2hW`~Y;1qHa3-DYvS~oS~&1nn)eoHQ= zUfv8(KW;lF+=0*^Z1SCoP|G{$23T|Zw&?kvp;5n!D892QVG&Xok_~({?r7-rK@ zjepJrO4WF^xwkntM3<*T7uWN&R>{VQd5|78Z$)1Mj=mn~8$DmFZ3>Ik0dLfvq8c5w zy|P%^5;Ukf+6JS?CpsHFLsZpn@a~Rw^tWlaV?&H6Nrb7Mdh8|!5u$&rM#>c+$Z*E#bw?*=HM$u^}!jby#wynwMdA2=j z?Fd1-srxKV2bQ8Oj^8DYSjubqefef)jIJHA@wGu+eIbh9LpL}vAgWCVYo>OPJ!|Q> zc4}?5OX@A0Y?%Z+OB+In-r(*lkv5+C&eYIsl=H}IHHP_`oLWGCFr7V}-+lCf zjwo$C%a+!hbhbwt*y-`NKu(QqIe20Q|E_2{LqrU(64*|oq`%G!db;u>2`T9s70M%Z zXJcts_dr(zW1%8D5oFQ(@LX+^sK(*0?QkuNq56O}FWOL}}ef}abbP*Ia3B8}Ky3z_xVXo~Yw{=?a zAJ+bscKI%UuF%LfjQoQg08A3JSL47wSD>U4XHO2{Gm4XWWl`@(dhP70H8R4E5*y8+ z$JP{fSFhmJb=lmBx2|iN-`rHdMNdPwXnD(46@uy%PnX)ng-$7`nm-rv=UN~E@MLt) zT}IyehP6x?sVVB~#Pb-lPCsa|3e}Zg#!{{!)?rG#M$w+CsPzaP zY|m=Lt^3m!TQu6K0t*jQbgp2%Oyu}Y0;)EDjkvVxX%CkpVBYrR$_-x9G?&ahGbTHQWP z7yxM!8qt}EEKT)S7Z#;asOhsqJO9zl%_j3iY`86&-ot1``D`a#5#FV)ughIrVrfDr z+mI>f>%cEZ_H_ZdG*V-}d~#p6ZXBp|^G|0bBJEm|ON3p8mc{dOF8So$QS;81rSVWj<#?A$(uZ*Wc}6olLP=y(6T01*`a3Uw&zha%D!m_I zGrzZjiH-0q$;HdWNK!0ei3YQSnc($Zb&`}*(elRhwoAh|Hv{h8-esaORndou!r}E* ziLv1t5!gSmE;U|6ks|O%C_xS^$iT$vxRJZF}q}OFucq2^_dImGo|_U^Cja_htmOyoi;5`{hjFJ>#6rC zJZ3q8LbtF@W>UOS4Gn?v*TDC51H!1FM!93X-;n*670&oY3R%rmODq z*8;ZEL3Qp^mKX8mpJY>HNon!o7PS}c&zf+ETG7ys=4iLelOpd z4u3o9vKwAq)Cs-5ods*rUJSEC*>?HVEX^*j3pMv$>XWQ=YK_OvFE%rjAQAhk^^)Z& zKgRe)56y0G5C%vd;wO|=_Qo!1qWA%Bg6P#E;Yz>*1RJs=;r|s+_PUcNn**6PUEjM| zv+YA9eo@ZoGU}o|ae-^9$_g4yA} zNDE(XL-2Lvs%^csT_MFIXEGoUz+F%Ny;JL!aTC(CSc#GNyD0o+NIY>2k2ZI~BBh_@ znj0EAnm}jd?tV?Sjany^Zjfa>BlO2Q>Sj@dk82)}$gj9xO8t5A91Vbs{yO=ftUDTI z#)~j$=W~6&jIu*f%iMW+W{4N%Jgcv5m}eYq;L3WlQle~ZnRyKjtiGXW$?DpcuI7f$ z2T7f5d$4rf*)+91%Gb3?BH%MG2+Ko~qUZ3NX|DoH>&wNVNG%vtw?%W6f!6@N%AuD4 z=nfM~r=S}K(+NLs)`3ozSgoFi;frcU(Z#@;3MEOFBoM0$EIe1B3ka59ITFDhG_~qI z3BgE$KDcG;mg}yOY0K2=rHd03>l!V`Q+c_ZkVyP^=h^c#$S}hUU#$A3u>w~@!!TdWhLyD=+Cha5D@`wI3|z2TNcx(&(~A>idr6A} zDqDf*EV|bj;@S8sk@+fDs-RrCe#7NcT=T=P(w~{}3(Q@Ww%Y=@-R~GVZ!2)&$7{SL?TSBF{pPMg)`^Z)LUz0Dpm* zSr8_pEFHqy%Ebe2(oDtkG#ptrBVHv0CqHE#z5roy2)uWDTf=G4bcxMj5mFFwmTsog z`84`WnH*n6v%PC?WWNhmDV-Pc=)-U{$asy&xD6gNRZG2WXN|GK0P3`?yp}}hp1H+r zc{O)<=4{Q@2;L-U$rzAs1Uq47MGeSQ#?Oz~*yW;mw@d#nh5wORAP*?!{YEX~8UOu$ z*G4!0h#?Vqx`BCz$c__^YP@qtOztCwbajP`{Xjxif!CN~>%Y}f6RWh3hzQAY(XK+C zZ_=YV-uJ=o%-S{p#VDM#u^z;j-C**{i*yVJ~g?SR&Y-aT?b^wdb~dh^K(0#4a~{icoml|}LUA1KTJ z^yxXElt+2|bku$|OESfZkzUoXd$P7*silPAi2v z{FI+9`l-BCL1{K;__RXr-d7JBc)j~++0M$%j^BPoPN?5}6%8AS(ge=OK? zPxWw)x?HQJV}A4|&5}#!#ZLl*A+GJo?8qLPpp z9|>cddYx#8ZIhCv=;$=zeP05%@uI{FN4x@%otA!`)@@=w0lp#-3sOH8Fh5qmt|9fX zO55u(XDg}83ff~O`mtgCgdZ!^T@RhL(GQQ*lj;8fJ^Y$V%{*Srs2F~-7q5y|zJ7cw z_tYa|Yj1thiXVSVpWlCSD}H#2R)CeHmO`PVgv>|@4Y}g3ZQDxw4K()T)JwzwFY>v9 ztY;uYR_-_3IpxL#$f3*?P;v((q0Agr?nCs$eXf=Jha$02pAY1Xwl#6LMtnvjL3NG< z)han(bOsZOBCA2iEK!0|I(MuSz0T2$c={$+N_C>1v(=D~+4BaAy2{UmS`Tx=PnO4< zR7!r%mXzEd^)xnQLjJ2h4cDPh-iGl{0`2ql%W|oGDqS3cGV1f0)Gzh>hSc}bR!lwaNKHv-^$oS%nbh6YJa4Yw`1rPMgAO#`rg#H8FMJLl@+4>lkiccGlmQ`& zZMIf;fF}NhITGQ4!mJ8BUa)q2hmCpOg!*oMP$Nk}kx#-Vqd(NniQ#-;O|wRBxcKM7 z3Lw0H**0{;#dOCR7R(Esgh;uGd#-H=JF>21P$|RaNnz!k32ZVNww8sDB6*jn%~$kj z@!d>1kBYU$ZT#EVOz*&TTedCC+jLpM7eEn4jwzW{Iz3=QS|ejj<6sQp5K}4)!q!ip zp*mLkP^#or8!!J_m5f^BwaBYvE*vjUL6wZ6<7H`#1L=6DN?_gC3f9#M%3}p@|M@!>}`zwGAi(!H6~KZ~t( z*XDN&9xX1U9+)^?146G`212%krP^|ACt;0DIOD(!VMv`Y#M*M5q|>qDp_3~mPpeG_ zaDRd)c>)^`X%{NxGrEjcEw53s8{-cHljCyR-NY}oE zlX7>o{#v52P1XnVYBxx&GM+&K95;6r3Nr3A`( zQKqfKJI%Y%AV6t(R2Q&G+BS$4_CDUvlP-mb=7kZRs$q!`<*l;DQ<|yLIMUY9;kQWz zESIV&Wk4MkhN-y(w!*^=A-Jg#)1r3D7VLTGwt!8CK&0*JM=HKh5QVB&>#|s?$$ZhE zMe(bs5tHLr7~oRT@^L}yqY(@7XX@T+AhD;fFL<)*^7n_Va`zI}hJ4MWoTWZ(q{N-8 zRQ{&1%_iJYinRTCGZTCLMkz8`bsKrc9`5NIBLGW zl&%x3K5vbJD{c1*4i-%>Q}w^P=JJqm@|W8?zDPIOq%edp(@JumNODs77I6W7F417E zGUQacL|{JY@~-GHZf+;0*Q;x|2UrzeV$Ps8>Z9cMigBk$Y1>78)$5eGj$ zcYoPna0)Bue~ZVLy@QdhtQGIzC}{#tI6pBFFh zH@;xEc$PRbY#QF?vPo~u6~j1NO2574gTZbEMG&Vx8nTEyO*fDjYowfx-k1B6cxHz- z-%P!o&FvR#Jg!rAz^haBN3_~c?$*G_Zb|%s2BT$rlirBV^f*w0um%%Ke5CTwHiQg# zjUAaMvhe;kjcd6$(fOi0l&V#l6n_rMVw}UG#*HY~aQM=^z=+4`y=r|i4YIT*q~btZ ziJ~tRn)@%<2%kU}s*9JJWXVZ-zItk4d*jIWHol6*=|ZunWx!8~NwV!alZ6$mv)_*P zgrp;*cl^&hBY#gXtKyGSo*b)O?eat$*T=;l<^DLAC%aq|e|yYu_w`k^zX}6*I#U0f zDM2UlmIv`kUYi#`P34}8*MncVHB8Sgee+!~=Jfah-fM75A2JbXC>#T*VIZ$*3;h|f zw$LYRvW@$V=uNOFkryBX{rS9h$3C0IyrW~T)+u*3y;mOXiSa9xtKwahPt)1v^LU^i zll@Xiwq4`0hVu51A3DrMcXRy(8~c;KALAaM?I`zJ+1#iKt|Bey$EiQD`9|xf>0w8m zttdQG9>yF8r&Y(l9CaA_{+p>Uc!RI}YYX>hcV8U1R(1Su%xHD|e%hK6{|n`b+PPLi zqww@@o`!k&OZ9Ge9z1}dWB|{20IZ9h$q;@Jx-Zq}izB97JunWY%1Yye}!r3?zh6t>*GBDWI9W{uw;66Uf91x zUd3Xm_;q0sB*-q!kXh>BUEeFE2zx*@!qg&*Pxn*Bu$>~Ss7*zMZAfhj&%I?@&XCf) z>w<4}n@$L&IU{>rVW^l38D$TJgN`frvEe@M7eA%z+yZe;4uIB9YO67gxg@nEEb<*} z2gzgk_$pVRa4u8uxMvaq4Cc>JNKsb0lJg!4lrJN301pQuZ&S&KWSjdtf^hh!oFXqj z397-YZT@|yUSBHtbh;FG!Dl*GZb}S>(vhIr%3Ptdw49?nq?H!4{k zWaFZ|((}eqv7?B53?RR#iEqkt`uHWfU9#%zKRmQS^n;JP-~-zT0sb)RJ%g8(|!F% zNYzr<^wR;?Y=hX&yD#8Xh0m9g!7W9-`zc8Ho2Pg&81y&Op~X+Im+N+N&%RqNdh;fo z-yVG~^}UEY&)@ud@X_^vlSmGroUzyxBrjLQGFcLndt23AFUTR#T~aw{yqr;J^T;hu zM|VS|e4e$-GiBiX4GHnHH3QzXIxcR|y6K5#4{TY4K~KP(UytR0RA9~hi}Q=>>n>?6 zDA^z2$Lz*+zvW$TT5vqY(o*ofutySS3k%W$4x%uWC1jx3;qUCoXS*+fh@CQ@Q574; zxQfpaTMP$fwv-N6rxu>(>-OmR?|qM$dH!;R>fWweSIbB=Efy1>C>EU2VF6H~A_9ZB z_Qd$8Zr&$^S7<9tVCBa1i1mnSc}qgRqxK{rS&#gyS8P-{2W!{dQgOCSD-Di6#+5CKPVVi#Y{K}0y2CTP7JC86#&_r}0i9(+xjeQ(jyNR^B zzoTJ8XZF(k`e2gNK=yh#ACw5p1_$H}HWDBe^0|@+Y!22;r%wc@jkP?ILWD$qxOa`M zkfu)h>v{K zC?KAGN1fTWAus(-C8CU?6%Dz@eCiQlu&gF5X2+OncXn-FseGwPo!h5v4JjM|Z7FXD z-^Lag9!dR&V1Ldl;CHg)1zLnPa0hTr(X zuYCH%W7+17!D{6YI9+y#iqiieHn^Fre83#Wvsg|87J!T=gO{5CP_^jqSf?CrQ}KLW;*zZC5haUo8>#e5PkCwk52kymHb+?+{(?&f0}LrYi{Xz# zLs`%7Kq@;T6-WWf{JAZ9;)nzvFj^-oop|}0p=K%0+WwdA!tk3sqCQI`aKiHU;V##0 zS{*&_AGtcF*hv4w(N+iXOvE(3dvnn3k9^=KuUGxaU;p3h_Q#*AmMpDNSIwyu@llQa z$Hz(~)t4xSXYsU__WheiB=e?OH94Gk= zclTCH{y#h3C=UH85V;2G@N|g)dS|{7O-|2jf0V`;zu0$Lq4m|#!w;Tt3-(kGw>&V= zl18qgdp=cjNVI00EDR0u1dOGzwAS}_OV&5@a-}=$H_WK*r!Qwnd(LE z+gpyi{X>?}blFX2iI#c;ixT#?@9S&ih>oCZ7%OJQe+#FzSErU{L&-m<;hX7z=K@=u zpPXG*Kb?#Qj?(g+$v~3LHWrGF_qHvTqRopAm9fuTbN^99i)wWDxy)g8G_*%SK@ke| z8X01BE{(RL+~Vs55onzpJ5dp8XT{&4Q=HGloD&lcLQJ$E<4q>+_T+d)^qtwIT!1vD zq9OAcV2Mytmv0aWMb67D;42m~WFKr?!^8QZR&%gQtr?Nm+Y#bGvE+|x)Jj}kM?}QO zR9S6qRi!eJLjj9folDQOdWWUM>}>WIGn)g%k)Ll6f;{ByKlYywCcjzw6SeZ{rC#Jv4V{nqEOI z_uwDHX9UN@B<&UKeJVv8&{CUPa(`BUyf3eVrg2pt~sqsqz zNG22u@n7*G%Z`txx;)XP_Dzwy;LTGmj@ ztCgQ61Y{7*XJ-%4pSsdxC3H`)(Q&D>H8(|>fHsQIt+Wp?_Nh(HF0bU(yx%>50RC;J z5920Z*TjEcF892WC-9R)B47I19T-#JkZc#TePA6iF0beykgDjl*RYuIrL7Pp5f_KJ z-Y&Rw#rJ>_ljBb)3mZPuC|XJAmJI>t>zmSu%h>28g6PiT#SiJlvS3DOKoKu~UzgWX zzdundCw>aT)}@WO@;$rG?cS5V!gRk%!LTm6WN6!Y1AsiWGY{ zcVBZ8uffH+@e_-?Z&L<|H|vXc$M?{YH#+fVyDhm69xTOw3bfp|^`k#^&uywr&Yv22 z=ePWHh33stf+03sGB8HFS9zr_A2uN|9@N`6$3LV`vlSb#T#mcH5#dRFL*fI^G>sR; z_fq~nZd+((YS=vl&f1-rDAYrO$|_Bp!_QU;ahAtT68u*sP%mnhQ;$wiHBZ&(b~4xe zwxoleVLW)r0~BP6pd4^-kpSVD3#TZU$EBV#a9{Pypb+{+L&)x&`jFLOofHy)df4xL z$=3~{JgY=`-m2*<35*5pF%22vL)+hq^unKrLWm7v0)8zd!XY8NcLgkg%%s^Y6_G}? zB#npH8x@FEQl&Cwgp)YVjSqufMrZdQ69uEipF`KKp!m|)N(>BG`sw+)?UV1WRD|WACt{f`~499nMw&=PnU0D=K2U&Ba` zHn+@il>-fHLaw$t>uLj%7s*#`{zJA^cg+B#(y)v>CR z1?abF2CRH`gv=OnXw_|au`b^`{9Ye8AT8D?Ro8B-l5f;ybzW|$tXN(lv$1b6ZhXaq zGNZY4p*LNeV`;D^mYXJad92ILcG(1j=TdD{C;=;w^DVSl9}Itl4h#y$Q^e=9fw9%F z-CovEhRz@qwm;bI?fn4Of~dWr-q3r6Flu?YP?gD? z&b@h^B2th~>8KG8QDtHN#ieTBd{-EOc}Z=@J!x?ksV>~h#(ad;eE+<@F` z$%2Zt36RYR3a6WGz+YZVsNz%rweMiqrJ2U+h@B1OFT_9hVx1mwI-ep>HH|V>8Kobd z11dvM7Cc;^`ajZ4mcUYZUqFWfLRlL%9k%_vCH@po&QzdfN^m$sT+JC@9Y3hcQ@PYP z9X#%o%Q48(ZA1VG##_nHU2G*cNHlMmH3kR%yptswHpOio7HB?sf3+0kp5$8zD|doQ zTQz%jp(v=hlr>FkM;v{g`?c{O(pNuqLI9V1VFGx*z4EcEv5}r|DxmU=pZiq-GzCFs zlDDhq3%~hZU)@{2%kOZPZ|T@S_>FL<((YOvNk|3XUk+xxX|gj_&Tkdv*bexh>}*?rCISh4x8*(?KkP-swBMIM(_0J;hrB1UmSPw zUiV@6W>R9o)QZT~N_;utsgp_i;s?V&Pg(K=Zmjfel=s$pIfQE~K?WR$I1@Hj7v;A= z(Ll-%dE%|X$#AwXD}T_F$Wj_;pA%emh2b0c^WuNy*(?PgYzrdupc0%!{KC-%XwW{n ze$dk={KE(Oif-)@gXc-O&XUsU@c6$q846e9s}B|Q0(XN4#`4uldk|Ne{I2`Xnw8m9 zD|{z=Z5D+>N_Y8Ja7^viCo8_Q2I&cm{QLc2aQcdr*4g1m8?$k zS4Yvh7uNB*QH7L2EYv$Z*d~W(bj6P%g4mz!-B>P7m1uF1Do9FT##FJ<IY!!+qKXou2?m$1aRQq?e(3FGxl7mLTw^$!h-aQ&3` zYkb3GjcWx^Zc`)Qm)axtkBtC^=98agh65{EPt)k!{+J10-*RwUOX~j^a|uL_qW+fM zE&F_mwm*gCC!Zp6O+&B_-_PKC_j?G*phB#j0bB7Utzje8j`V>P`w68J9TOta72cKE zU|~kVB_C4cxICR$TK|~qtoR@4>K}WMTDJ#usy+7~^fgd(QT|Ww-`=+TJ8XD?gGZI{F zrVuN9{09oeQC1l0oF`^yq_r+2F=^#oCEf{` zYr~Xad5o|k{J<7yBs}I}Pq_7r7C>bTrsp2dzLbZc*YtefIR0dg@8I9N9)I#>4R>t< zN^GMkW)YkizURINa@!3FCEaxv>1jGAK<*5?n+8)RPlL$X0AG2m@_QBn4NQ`~(BEyT zSE_{JxtS|6lVwOW%vHtYhL?|icZV1J)~|87#}$3IQr(GP4>Kd5 zt|G4sD2d@Nm`n_k3b`2Zaj18=1Ev#BS>${00QgWEZCfLJN($ooT$*q=fZ*L?O5~Am zl|TRi_d&MOp==T0HdD#)(*Reig#CqUF|xDobVm{|GMB|X!1E!lQY2f8M@v8$L&-Fx z`=^+Zzlh==j^VJ`KN&Ip|8V)8yx+fz&S+R`gVgP#%0l8>$Q)$U6w{KR*4o)iPM_)V(7bb*H{iw<56gAV7tPK#Op5ZB~Qe`K7^OC#omG}1gBvEP^#Ngp34bD9cH$5|3HA=^NXgmAdfFJ$n zYsp$KnzU_89dq6HSSs-6=`^2#Yf4NFJ$sO|;iz5`i}tLrb0wEsm|0j{SnLEH<7n62 z&9)EK)$8~J`rqA`X1APpipuE(-XfS(U3Z^#0E1a;l zL;2hJ+=^-E5JJNJ{F-c^gIr_T-9^N$bm+oR>M6f$wk!vFXh&c{^qPs;I~&qtZ`+d( zukPivHN(v7)4j?koogX)fM7^-$^CGOuR@~_^yRzw4w+%545h3^-rC`J72ts#1YrFS zHbsDC6=~KToq*gQk<>o4&Xw(>mV9hnKRA@#My}7-4VD@aG$F@P_}WY{w;O)-^gKPl z>_8NL=JCDYN=8h_&}#>E5dGK2M0=hFTkxga{m7uQyQn`h73%YvXj?w@dq&cVY&#HQ z(_Qx>;vT!0*1;&-4SwZQKTW1EA-*!L5m0wWn1tS;p#<83^Bw?=lTevuiaJ@lG6@Gf z75XrF8&Q^r<=Z$qZBJP&>Pvb=IViy#Xo=Rv?iZ3@moq3v?@a$k4bulPzp_5wj`6LF zk&mU>>9S9Xuak-egu76y6h8^Sr^*$CT0tt@ogMwV^Ql9I!tW%oC^HvpXq|0geBs)u zKVXoiZUi`-W>kcsAeZ&L=-}Rbf1zbxep}lG4A47ekkt=NyOzaR^FX$$>@+D4z zJsf^Wi-?qU0AaTYLGs1Fd73;~{rzqGis6v1a2=%fgC0h>R&<>MVy*!8|0F%VMitMA zUb#Q@q^C^-zMsm9L077%N+`8;NOdo?<`)*Fv(*vfp(C>8z4Y!sMOtsm?g_@8mh`^x zr3l8b)`lH+CTO-0Gw2g{c8xHh-a$DvW|RyIGMF=_1n5GSj~yA-idW+>?uRAe*JA=qioJP#eT2jqrU|7GNcsB zjF-1dOQ1@n`-M$AJH5>%1THQu$W;c4^-28a06< zzp-QPgl|ffZ*Ed)p1zqbmBr_6T%*;eVB@vH8@K_)R0=n`fzZPBYIVbbhH|fr=ulDJ zXjhdNs!FRcA^BVKy&MZo;wduF_eexAZXdlNybkcIog}>ndlz22g#dC-mLF; zdn!KW>$CP-_o!)I+T{(R$13Lu`C;}JQ7nE5TmuVwc%}rnOpS0QoA#e32FM*{Nd6Xq zI)e$=`8EOj4GKLCXVCMWZ!VLUTH6h9y!{lZTuF}CV>o0`?drWV&R8s}u4HbsQTjP| z+fR}UXlD1{455w0l~V9=u?Lsh?C<=#ihUu|vYpE`g6~W5FbI%+fycLJS9*XMvIH*@<9?go`>`~RTL=$E1LUXX{c&GkA$Q@c*viJVhGZ6&GE|JVc92=*nX zN-D_nlEg45$7#?;T)JNEY6HPXeZ9|{g6SJA+$=!I!mXTkyw%EEtL^v2H5f;a&>x0T z(5u=t)*j&MjV6wTnZkyr{X2H?uX{(IBMO*k0Cx6W}0>*Hs0iqaEpn zN&n5LPuY9>NS}?dvD~GVs(+eXii+;l4{uv@G@ubhbbF)0f0qvPPDTI98@%So=B2_| z?fU$bZ zW{eKBALzZRBFpT)y)22W>bj&e5jYOklm(oN)^%NcQAcvSvLpOd!Q`Vxo{zfKdz5|Z zrx0aEky}QUq)rr>fXUU1`o^Sof9Akvs-9j~9#HEEN5qstE~JIeQ5V=&8OFz?b?4H6s+2*00>7cyyYoi4pz4!90BK=a)GppCD z*;|T*zD(CDMet%9FLo@?dOzmcY=|lmF@Mb~axnW!ODTK!wU+iwVU>3g`Ry0hW)B=V zYzp4LO?gr9eTP^|laURyxxS~=H#k_@kqt!rLSAX_+?n;Z!9a1m;^k$@WlMdtb3-k& z!EWg~X76w310`q%2D8?HWnMR%i8Of(*+hFiWqOSw+wW2?3N)HqxbIo z?ho$n9mwwN*&I5siMy-2yU`-5Ffj9lTqNEj*;rrqW z+P#8k{4^Hp`o8SLEv>$^oP*#rE85y-t5I9(gLZTgKs+wmvFbwuA1FN-X6MDnz0)YQ zS!11sa@Yo#uum$UfCwZE;q7hD?&x^r2IczWm5mIxzb*Jc7QMPi&RGb9WS*b<3d!fl z&9*&l{feR^;_B5!U%5Qjgl&0R#B}s=tEF@2!Qio4pWT06=gvo=<_2_fd3@*NJKJz( zVcOx4wU(^Ihzqo;GE<&F1?KmY!(O z%`yetHFPu>?!?~uawrI&=om@3eqepBh3iSG)WGH&w+2nhn#}{JmDgo^>*{r5LdxC) zj+8l+RH+E0=|pfTV|T-|FD(Vo@RnvVM{^`{g=44$dJbkrj$^hzIzcy_2`4WH!EC96 zO;nHxCu64}^@O;yEzc(7U=o&(Ae~;{(3B1@o%n1X5vm>m%jF*r(9>MkSu7qO_+VmdEc0lIm9OvAEzQ#-C)2njF<;?(A45iv#d_ z!n|%h0O-gT3q{G-VD4AF(C22CwnCethytupi+h~FsdH7w>CK^@G~>rYxj za*gI&8s;~oz94z(iLkA7@DdEAtTJ)HrpBhaws69F*sI#SRj;!X4o~9BOeusE6v^40 zm4tDr1o}bA5ATqWsi;7Wu7Biwym`Flqi+<3IcBg=jIYA=4&7DWYjp}8c+|;gTiN=y zRS7SAZ@Gd~%}`hS#j9G|lDEH{O7Q%G3s$e{DBs;(#{N@aL^~C%x;Uv~Nm9cpX8!oS zSmjj(`))nI>uu$Ql}YZ8a&+6MJazTD3oc5U|IhM)1S2`O5iFSkt+F>rhC%{&)+d$P zi_I`j?pV{e`?j(%XL|j>(H9!jEWTd%h$=Z^=>2zZ1iR7T#^q>~t+; ziUp^g8ehF4BWGU1U88rf_~+=?AB7Idw1d<_1;pQ_F~q4zqP~HTUwx1 zrhrsUSbhyj3fguB2H70^9cGq|?F<&;iO9f?ZM*z?~7F6yrS)sFvY!YB&MUo4HllNNUe=Y8#tK@qXfn)^k5_vO9eNp_57WI# zqfF9t(46yx?TG{&sj26TxRxcElkNhcw}){v8Rf2U4gy_ap4(*HSSz+Ih7`^;q@V?LA@Y3tbn^6YHrv;ElkeR_v_w4h{1@)NB^| ztvZ-RW}{3Xe^`hZ^1sL|dk&fmK(mSI4VpzCyV=QytY}|u#d9}axt*3PLpUjod0j2d zdj+6CJ!)|3!RpQs+oxkP4Pu0DrG@)be`bB^$Em-v0ckalI-xf7Y@xWS({gIh$bK7A^TG>-m(xUX z;|hAfY{xRWvYOex^z+90T+%8Ge|t0u{GoI6=~w+gN6%8YVjQiMVg-m|(HZoh+oOrg zZf*lluhG3a2kC>)-mKrCv7Dw2KWD`YqW&zTP-a=D2b~68;w!+Y4Oe}9uuc`cN%%^s zT7lTC4W{@d^<^nlT%_AeA{ksS5Hw%F_*(_#eMKhP1JLgfQwI;!S zD@SN(8?rbzHCl(eM@4N^20`k9P-ft2CJTt@AdFIJ5F%hh#4CIkJO$0G>Mr-n>)UxV z++}Q3e#}WrDDrjwFQk8eMM)t zg#7^y1!D`kT=m(|4u7->x8ENAK&KNIOxV9;`b;yX+?;^q4OsmCsH!gUZ4Fnd83{V-!ob8QS>4+NGx3Jh4>Yv5-F9=Rdce; zqnr7H(8c;?wr|qB6Q;>sf-$+;&+-)}s(jCuWgq%>_gFPxp96ql#LN+kqElcwJHC%+E;_q| z6Zc>e<|bEG(YfLra+K_ADCX)QxK(T!m(<&sFOayNy}q*XUa3-X&W{UVkFFr<#H~)eg669;UoW> z9%uCWUpje%J^Rf=eN+jDeNFS+ysZy$gacy&6EODIHrSI;+mS2=yKfS%Ul6ATRojIi zg5y{%2p@RzWkCT6dQF^{j6F_0gYVrxG=$d2c&YF-|P<(DiSJA(|&*%^GJ5!-UZ+3|lvCt(bZq`~CP= zYwM#Z;HR=9jH;NAYMziOV>E656ef<5ihQ}Zqv-qRx1Qf#HhR3LY{nRAl$S72hLTtV z_8{-VCJ+d;_%rE?9kxmL<$^wLrQDYXcow{Y_d>ZrbC%^~2@)&}kzX!g+Egu7CF`(? z9L(FYb?y&KTf2onqc5rIR+oM7-6|FeJNIck+u`Ix%cN7s(RFPr(if*ue{Po=I+dno zLH2Rn5}Wr4Rnm^^vQCvj!5Dx<{hrX$dn5@iOBX!8Tz>;JnA{=#jYZZzU36!ap`=MI z@u?$>=V|Sm#$G9P>MX4}X-ZruiE!B=zY}Dv6GdI4pq6n`f9y-w>TlvVcDEA7ly}pE zY>=*ia|)f2A2O5hyk75(jT)>sH5FTyTUy!HnT6Z{3k_rmi-3-GbJ@I1q4;t1Q*w-P z3@yz&am71Tnj(8%I{q0;#VOpXG=^BJ^#qlwW$3AqmE}y`t3m$&kT-F@Pq!M9pLIcA z!~!5n=WMdUKlP8kfw7j2Wev3rZ6PADe^-d{R|xroA@FG#G8N>>J7|0s(|GOVTM-`v zeoEI;O8tiqi`Z{f<+~aM8Y{DD>CO3uB(N0M%LU1BiD~6JN#tdPWEeB)MRy;CW^q5G zZT7NdytJ?xiOH%R(ToQyshwu6vrYuPCca#kIuUt#SFKT3BZun~MmXt1Zpe+3K`b=e)n z4LcJ)9vmdV7HS2VWcXb`PZ5}H2xN-AV+zxfR#6ki1-XzeS3%u3=-g|%wjo}r(VR}j zk7!2LgdT&qSXDa3tN_hhg{N;s1kYr6_sa-qv*WLGtCtq;%OIBB&gVXMexh)Dt%h3@ zKS-Ao4BsAo3GQ%d)ZW(YJ>Gx;?EqLYax41-^o5-{4!;-*s(GE_=PY}Ax6m1Ukqa`? zcZ@)j1bsPLj%1HWbEBWynfw`F!$A~20qnL=45mH3EuYk-4$Ri=)PEqngn$zaorpNmwd&dk@rS&8(o_qj*8R| zqmIe70ZuW?qNK(8HMxM#Y=N0s3*1o=telMpES2}i3t<*W4R~aNWXPE! zLDecLp28LUYV{A#8VpPb`|GObce$8kR4 ze4ZYEJ=1r>b-{?IX9;f|1T|lhV10aq+NUrJoeeGg<#05nCWVgTLqNv~vNBn>>;}{_ zRj#D{Ijr~{AgNA_Hyy1{^E&-@+BsXW=snD;tB+{`D{PIG-;lR?P3Gat>xg!B<{z}t zYAobaq2dNj<43;$&p!Lh}yNYPvaQd}{x9M~XuK zj+ZVq<|~$rPKcM>x~U=w?fB=4pX8!T)~&9%A|9Muc2OMX_&c?KV(s~5A>R;>JX=n~u)JNOA-k4tMh5Mm}~& zL4BF|mH*K>aVp`>hG3N{b(cto@m1BZA<(DSKf0d&%+Np>ftKC;B19i7R=@yRtJ_HH z`yqX>^hX^#_UddH#(OKjU$;0@DPBf$haP;AH}gFFJtNW%*BW{-iO#kIB(PSVgQmrd zm9iZ1ZTS^gp>K`WwCARGt-!c;W=Q7o@P<%HkA6mM@p(2MMQ6I-O zg!Fup4VhD%*<;6a^}-ZJ3Dz>1C5_p3#-m8A9OADdSQt?i+^aIvDOoqtJ6Fh5dw~8U z4-z%X^-1cQD)J}%=+H*N1sd2ph=rdjozpuC4|^CJ7)!B#etzk4W(BskLE#p}90ccZ z>i4B$6!{ibH(ASbv&J4iRpr|>=iJfU9$0;ucj**^F3tPO7A@W#1faYU;qa~|YggL? zhV4PHiCf;b5`2+eL6l`8`EH(IHE zdT3`BlCw;P`!@@^;_gUll(f8M7H7`iEK($$Vy|u>!P=zww2+r`2Xz7t)2Onh_r)mw zG!w_(1TfD+uGxyg?eJ0?D(1#Jx0lbnAC$RPQBSJ<0n}8vQ56;z`*7k?keLEyswHZ#wKkt!3YTy ziqsv>rn`5wYI++t8c7$kUSBx|dY)u$$!r~|O?=apt<7MXLf&o37>?gfe-~*N;xo6H z3R|bp6k@Ty`~|;ZBLF4<{(rNNLci-I);H#=>#ys*a_jZ)^2zScef*BQ#{T6Q2}_g4 z98Ry^Rpy96i9g|hbZO<`)?bb&47V$sQ#OQ9;|CkWy2^bN>zWcZ>X96**CCv~)1$xy3gPnQ(hv@$(E zyGrLJS=y6iE|RCE=Un@mr#v50uZ_(v=~8U(?*}E!AjX2qVnijKwL>>VBYPVf*o~ge zU*3^C`leTy9zEM_^}QIfPt+Egi_^&=#jfsK#H)D$i`FK6>m$;S^^8QkIT)T&W0-c3aHPydROi(<-Exy$G_rPV7+RL?_jB`nx{wk}`q8pua5MaYU76BC4lgly&~ z5HOS|{Q$M#71Na7Ts}rR-g(VP0Nn>@Qe%{G@&o|+ETt=N+H_^_7Lt-zd|7{3j=%|$ zV6qlRTDi(=RzNDZrL`~_ZslF3;!A-++qwEUQxBV~VgX&M>;q|a@}(^!JNbL=Mj>0o8+&nR@^iDS;+{=BHM9b0{J|W&E zxx7LGvGW)z_ zqQDHX-=`21v~cF|_D0bIsz8!N7q(eqnS7i&P*$-Fs1M32yTL5GMcL+{6~XL@u1(+U zR(F7^SDCq`4?TXPIN%$od)2qWTsXAT+p4l-JChoy2VY)S4_qQ9Ajz3#fXwq>4rpy`hE%uN3>taf;sCd%p{s}}}S#y%7E>q#I3oFy|p z`IXRTZEH=Z+rt?O!EB*z$F=pQ?uEtkm4uPKJPkV1g=%!3g4qHWq^DcNUXeIYjC-#0p;WSnZ14Q;JtLRsA6V#^ck&YLy>{cK>#wR%jORFbetfF@t)#KjSRPY^ zEOHuyi%?*1J_*UVJ}KIubOq3cGleLa0O3SS0Ob{mUDoVg!?n2$qDCcV>C<_;A;dA9 zDFiu#O6L^h_N!77@JS&+l%ZY3yj+m)t=}I!(R15Y)iuLO6L+#zo3zw~hAq+-smvo?@>125(-B}PFZI&d^L3U-H zb28%lFNy%eJmxE2O5ejT2Va???`tR>#Km~6MC7?%guISu$%~y~&k(NH*FD1xjSUY5 zR96}o#SbhOOj~5nv#MvA3KLd~RvJ$>39PMZ|79(+j&Pi5+i44m&FR|03wMHCJkw^8 z9CB!NbZzkO$qqO@WCTpTN858dKpX6cQu#0K0L@Or6DV}HE(;uJ%5D;Cq0-j&r1pmI z-U>%(`CKutf9dp4dM7hc73~b7 z5_kj(Nzrdf7n^qOMVOzi!*BAe{f0Y5a3;&g%&Sg}RV0HBLjt6eA?#dU4D%uN9sVaKBqqk=tGz0x&U?+E2MNVm?^a}ainR_z50k7+_ zbuD$p6%BKr8}X97)aUi>;Lb`pX33g-9Yt*kOuf5gSN*X zRT(-pjg_1qeEKNApbyej_Yd+eR8n)p?tqEpy(#q$?F2HnMf~mD$xU|i7NcBmDV=^V zxjdUf_pxsj_YVziy&r62hhfM4Lqq4aW&Sb)XCeX16Zv!t1ga`p()R3-dt-xWkT@TB z_=v}U+rf_FQ$za?C7wS;`5k0fEaEzFdH-$uOrRfskb9R4ijC-nGPplb*mh`n=CRDZ znO!Z9KB`X`j6CW2Aw?A2&v5GEBV#n4KJqc;@v|$2=c!LE-<7(GM)&~8$zlY9SAt*} zlx(g~dj|pqEq__Wtqlfo|*yuiP zeus+R5x~GP?j5&u-PuJ0|Jw}|yE}2*kR_K|I3lbQR{D4Tp|rXP-}LHl-OE`@OTkM- zwLLWm%$`v?Z+~-a+rXZIo}E3k;t7}(6PU#LjSBcSMK@PEqZjCxZZWWJ&8@F*oq?hW?;KxytyZDEFi6sqB zqHo8*3n5&$ZPmU#$VpN3!oGoG@y_0%-ePYE><`8{S?GE@UK;EroA$ZoN->ll*wyn2 zNw!2N_Grw2SE+hrt>2*GH$xSmCNvkWZrRYSyvvjWByG^x1_;Uk#v#ed-W_Jb#@OU5 zz~eMt+WNz%L>;45#qkqkqSnHWhCA6&rhl2)xrIZVFk>RC6_su;^KR_wZvr(sz_&Ph zKc2%OBp7={or$`ZjtmX75B(rhV9x`*E{>M(9oWGVnP^50#kk4Ld*GF0Pcu{KdK%PW znnG@?L!#Jc&K*a4dlNn!;8F*o51zBnEErP5n%VE`1SwTYY_j~$$IM`0oAaXO$VgXe zsC7|G5eBze%F|fXo_R=7y;wtpn4jl;*&t_YMig1N<3L#^KtxlvmJB01jipv$e?Q#& z6E`9*4wV%{?*Qii4ysR!f0tA+3z<6RgXvlhL~q&s$9|_++_gr><(yPz#e2eeXi?s&-i4yv1IYy%y|%lCEfA42E@Xl6PV^awGLd-m*qxPN)ej<%uYgW+sgo*lwhazh_yv!3yWM-idl7gvK$Ig-WWij1G&P1{z zpt{sUYHr76t}gdwuFA-GiRCo65F7FMsBbqYJqva=71-y}yLN3;s0@Mf#Xt*99Yhdm zg8T{|I>_oKS`H<*UiO3k7;!auQ6^Hj*qLhPyq&uIkDvm42jV=Zh$oXg8;+r1>h+2zz8@Z0AM=?puaRg zTNW~DIoN~LhFobaddDqjxRRIKgO^mH%TS81(H&)Sw0)-1EdV=3t?p~h>2S^J=&4LSD@wVF=a}D? zrvxjdc6o$(|EU`ZlPuqWC&wZJDx<}s@Wv6(^YsB#EF_^w%Pg4Qq^R`lA*)BoK(NGO zzIB7?%D_PBS?jZQfY<$ry6)Qwycb@FH?ffcli8CH-&-kYiQ#cRGlkF)Eg^l7FJY>L~l?SzPhB7lah^JzV^lW%h!gpor zQefWaPOJFk52O0Mv!NE)hcur068Lrt^WGQ60-jpG7j_lPH|e_5 z3DA7i!I8~ZIX&0UPHKM9m@%8L8yp#Y`{~b?9c-uADmyZGHL*koQ+j#(d2(}Txp*FULP2#mQ?r2s43^|E4!w3U9%9@gbx$oQyLF$ESb zsPJ66r6>}Nt@QY}wK`sBi^a$?`4e?=6t_&AZGFxsxdg?#y`{=(5Z^%4eT>I60zj>l4J(wUew z*j}&WEAo&o!caRlTC+aAL}3<)1VnB$YY;X>Dlmm6tB#8~v2WcOmK+Y|T?ra@LtF5H z5KtnEl>$n#jVSH+8Td1FJkSJ%XNVFP2r&F(_wim`MYU*ihA7WuN}1Hx^-;!QBy8q| z9PMRNBuXUC0O#vEEm$*g9v+&;>xkNL#Sno@T}-y8!;WN^hQmxY(+lMXdk14{O?_q< zJv6_dM=9V(DR_Ec$Eq5`jvoxzq92xZ^AEvACzYGb<@PwFr7pUwyGV=^^QiQU!KiF} zg`eFXeX^9~NS_#ggDy724@amnnm%UfFxT1f=b_c9_%V{crcot+6hZ41uNu-SFiKv! zUz24WMRpd(ei|L=ZzdPLYHD7%qGA5*OH*IaqXWCco;6_1hrgxi%qJ3`<6o!{NkIEv zld80M?o1KD7a@Eo++m-_!edo^X!A-hF>EfzH0@)76VVxkuRe$h&x;0h2zcoU7MK4N zFdBQp=@{NQApw-Q7rVil9VgNw3I1$Uu@VvY+7H)+i7XX;Y{_g!2WBW}!#u3%JQmd= ztlrGLa*pyCDPscm9U<{286`M}$r2X+J$_uIP}p^PWujj8geblQ32Bh^#UpyJj7*1h z7aj9=G}&&et|u3b)<+P1njDNmrQHuj+~ZO4)8 zVA^-cG)pkdH$mubJ+tW?>1#hPGmDs;C&{iZXcpVqVKBi*Qe7TD%DWR#%GEuTLkGze z)M>fY-05oxxGZMx$$k~QzG66Rh8pX%-)>F(Z@m3R6kH-(G5{`)F5a^$6yft-A&@;8 z$jzkoXv{dMo_Hz8y7PlBdUvQ)-lBFe0$$w0K%x@UQ$~r01->?D7XdZJ!h$;%Kp16y zfc3W4B$3EJl($B$Y+d)(rJ9$4BGOKP9(ycWv**nRsMWaV8k)k?Pm)en4V!Mlr63BB z1-vX1CCF5gMW~my_Gas$0jIHsJQ?P_mQ+k2tK%;i2Qos0KVikz#Q%YiwSf5-{X8vx ziN~q;z6yryD+SKNiA1b z-f9QYCPX_Lv+HpWD+`7l{&rB<86Wh}H(;feS)8FM2)U^q$sOLBA5b8{*y!Rk9!n+e z2rlM#Qu{z~&hFP@U(u67U|_dNPe||={#uZ%ih2gkUfNSHOi-t6zwcKGroh!285KD8 zxcqm1&tWXFoq?h(SU8xdULkty@BAH|g(&4ZAf-8pCsp1;FqS|HD_GJ&w27H6Yxyp) ze8VGzrrKxSA|~(#u5~RTM?!Ku(dXTPkyqE$pCV~# zicb`i0T_`h72$N(J#9+E3=hgFBa>Jsm*Y7*6Cw?dm@c*` zvCMZzMsyq?z=fIGM5XN^r3`h4tlAbsHWHLwnVat~Vmo8q;JKmM}TJzA~-f$noYJ&Tc?Nf$b`7D zsa;k?rOwyk=0NC%sI9k<;TT8{UcFvaJmRtSfB{~u&}O+sfHi8kSl}In{b2)H%hHCW z*`xL_-k*Apuz2w|Q@?P>orTpGw~thbP4R27?4Se(oHr+Bf_e%k*`Mv#{Pj1D0CNWpGKk~yR8wQAP`XhgdfJ%qu(qHOGX1vKEpm{Kf zAy>}~){RZ+wl?sZpAI2XF!?zSjn3%A8j{>PEjq9X!kxFCD5xfELQ!Hs`!x)I)O#jK zPSMl{jk1;WPUu5^!e*dk!`-OWnQEjSwQ?n2AcA?lSRRTOonf=1R0+CzpRSD$0iihh z(a-7mYt%k9{$08?UXC(5?@cZK!~H-%Ohu1>k$eyOkeNbknefqDoh?s*m18Z22)F;|Hve8S%lP=;%>^1f%!X`QgiT z!UyeJ5GOzablMWEdysf&8&}Fyl$QW4nY6L6q_!o{o)6aA54VC1JPi0v@h78b6@BPu z@nH~aW`T?)g}&`xR!e;}tky9US-z?zL!R`&0)k!Y6oeG6AlX6NBsGc;-yVG%g$I~j zs>RldpFbTE>0XKf9+G{lZqHM%EUjHBGUk1*YqZ$fH6ZDcj2P;Kip?;u()%6Ufo(o zb_teut8PqI+~^Pk42YlPHz>b(uAH79iKJv>pw*_uNeFFU0>&`A31-E=n5fF%Do4{) z+x(Xy(BGWesLGv6*~;OwAtX(>vhnc%^PhSf^dg$RtzAbxLpLXgS8q~%?}(o>M5tuG z50zUT|B@SX=UG>u!5IXN*z2PdX31ZFQ>x;B}Ic|$ZD=YjdcEYg%i79-*l*fQLc~4OPwr z&5}rbOeQPkML1WovGK;Ud#=LK@A9CWyx}6%a>50Z>FxSf9|KH34fkA8cmV307ylG2 z@fPMdh~X%cEa-S2lj%(#T&ELtA62kNu{M)^#dwl=3=tK^I_a)NbjMKCcNw{p|zW1OMp9+`hzm>6i6;%Ns- zE&AfzFdRhLrc$vjsr@CRv!m%6dmd+9F|1i~IJao6d~&j^V!s`0(u(mOMsp@Ba|sKH zMw@B$(T1?cptOhOITpA`WQDeEjS7doc6!J@N5>c|Q&tuAFV#*YK0ZT>T|rVvj-XPs zXG4(f+Tr%%P;H0lmN}kqgEjy)1jdw!C-c~hPI;Cjd0uKb7LR70qBSLMqx;)ig z9xH6|jsfG1OBz|~D{g29!+|8v(vtl1$;z?v=}GZ3JT|B6(g0`1p9NKB>$SANs-)?I zNtSuGOEIV6;5B=%OesIQyeDPF;BpX)Z(+U6*Jr)l!WCrj)`A^ZUM91H_7d>_XU0ky z{<43LG(3#ibkoL4jN`v|o}kE{uxID^kp1$zrwETfADubG##eOaQFZ}XjSjC>)acPR z8SwyC^M#l%w-nXOBO{F80B*fs++CsiTTFm1Iz$c>6u{b*28<-vmpvq zc{V#=N{%ywMgx4m{ZV8Zmf%`VW2+WGL0GPR2=Gi0B2BByGL6|G^MuD!eDwsvHQ{YQcb$j|tfrUY8dOZm!jx;Z++r6Tk{T$7{iQawb-63qK6j%tzWXE{*4JFc`KkvsPQFv6?`7F4?w?AjmST%sofEM9l@jgtVcevR-crS4|-YHUEn9M z9u~gL+?U;WOW5|=g9gbARLS&sn^$g>m=JK%qv8vA2w$KlU?Y$!O%fAm>%TV|C|r zyMu+IHH3L8PdC=M{r8z0Q=};8J85x{7a5~6IZj{`-khKWCKeSJ^L$@&PGP{hU}=3- zQ(0TTJSw0P8v>sgP#aG4! zK)iFtYg?a}oQG6_?a2}wZ`Nn$sf;f+F1q5M+Vu+Gu;J>c_nXzxz@av9SJebYF?FbJF*Y?FE58gS4_*H4UI*mkR32OO=WM5+B2O` zwIta(unL)a?|#sU-*P}vrB`LH7PlIyYKMpk_~OMK#ndQy<6j%UU)mnchbFG~4^r!C z(aKsI{KadvR<@EQ4$#7PiFS7l#nY2#q#?;6=+E>H8KMmoRT#L^b(Mf#s{=H^ zxEF@Gs#U8iRNcj*HtoFr@kua6#C8R<-=3LWSGh91WXvgP#xfE4Ijiy}x{9E4j>>bno4vm1!7@EyuIP;A!@JE8=87vIc3@&1 z-Z&pT-#W2J(L(^UMI{3F@a>n(Eae)q6PNdeq7ER|DNd;FNY0#;&{u8CC#4ou@G5Qj zMDL=a*3F%GSPep@_y4AtQSI`|SLZ;C>hiVgF81+s4k-L>Wu6uMX^Spm5c#IdnM>$R z2Q|V?nNW^8OI}*hP6hKFlcXQ8L*s@?=vJCix{L)~txEes- z3OM;OmcyV&M2|G|_h<*US*46G-pDjqZsoy>Bp4ju4aN+G;lwW>;Hu+2{4Dc*9Dkns zlK3H>kBr~V{SU-29618tSOMDA*XGVnX2J=94w>h8BdQ!}hKmail0tU-P%$3`?V+V@g_qlaLHEKUwfejjC+~bszxH5G38(bx zWofj_+V;G3Eu@fq-WK$8KL1MLbM2f-KIe$K+s*MLcu#3~X>NlIi4z0_*z*v19lhM+ z!w|Nsece6aYcLJ{W)+a(88UO~>%2qDgaQ27t6e3LGe@dl@13_nJID!B>g>b`=;&=< z)}d3hSn*)|^Ba`k0D<33EzG%@f$r`Pza zU7=4u;(&lT|lS7)7@vy!g=q@ z;fXU>u!OWwP_?u2O^ROn9~>SlTrD(lKt?e0)F3td0b-+|9jS8f(()|`m@p~kOW1^u z;o9iMmej3a8#ZUx);ki91d!oFu6$zVD%UT(Qp`AHxUy2<94zp;y|7JG!SKdbukd*- zSk3Sq4@*!J6>!~w_f%&s+}4CXf*CzlD}1NQiz)tHnfkWdR7fW%$>kK`mclK3OaL&a zQz#o*IbAkt<_>xi!_^+54RXLFca-;G2pa{HJBZz2%<^7ptB*o`?AsniHSKBgg32TE z0s@Wt<$rw;-|J1(Ipr#WoGl-|8#K1G*x(fHJbapl=&w6vZpcM<~jPxXAiI_<25|~ z`qaH8ok@JBoLPsyj)F&Y-|~C&5e=4C8gSh%sp5GJc<^81zY6XbpIx3A)X*a%-R$g(tk2de&3FyFEF(T`ufT5Y_{L z{~)-1`w&8r0Xho%T&5K) zS`Y`oNa2zbvkY|VuP#)+tto=H$MSun(S=Y}ZB4K~O`2Zm7HPg%M3tsb0xPNC0fFR5 z1LD1-Csrelnge>8B1{`vqa+%cK{{u(cALz|)MWzlgu+hO;v${!huSgsVfg2n>p!`J z;VR{4cL!`0IG7nI?Ctr~H~TPyEAEChAFpM3YGI$v1~P6sjDXGlaAT6TetpkgF^#IRPz?SriKX=8h}x_Pk%@)?i8 zfqGhQPu&fi64olm(2E)YthM_tnxoC*;_&I#!V< zdW+!ES0vA9)i6Zf3hQ)3h*xB>#Up2|PB`->{e%Gdt^9YXAD4<~ujIG8Xb!HUp)ObV z#4$o2J5+NHU_1qw;Rru1)%hK>nXlU14UIZ&jgsD9xs>tlom5#JPS%+UssODDHRAF8 zhho~Yzz~PDyLPH@{qrTjKzWTWmCS~j57J$U?%q|RZa(6%D)K*^oQaab#APHW{-7kq zw=!(reZ$G9H^wh;ug$$E8T4CtUg>K~rxM3epB~*>q>*SLDgezYgBp6NEA?ZZMmyK< z3adjX8z`of^AW&`oeEmAPsC#BoxVJk0)GzF9jHG*-A{pJ&QLQ(f>GmU3a$cR0aFAm zAeZ0)A1?xOw`e6o`cUd)9`VVc6&&OSmXzew^HzyB#P2kM3}Vw^74X6tIfYoGw)(0X z%uP^jEVHGgG92HS%hEi&>?~Sntf7GUgZFZuBW%(3k|!V(zB*L|b%yr)`eb(pf_foK z7UFo?VHD0{TPdwJCCwt%o$}x^2b)Q)Si=+T(9joBY^b&B$iAFIUs4xpF0=uB`XUOt z>dn&n=u^FZIED40N*x=Q0t0hrdTW-rlvbc(y?WHOw> z&w~D_eUw4(8?Pjw^PzHCrw$?nwh;abBET z4Z$^XgXt4OD~To=g{tdn>i0RI>fcvi$hNk{0)w%mRLja2h|F`E>~qzAvD9UfH;RSG zG0p{^AU4B=!cJ)ABl(O_UGnTxigOsQCTt7#SvtC#Y2cystPAKRI#})2aAqCgGw?{&5 zvi&ZTC*|%q*CH7HDD$X2#E^SWd)V2Yy2(iFvqlz(joMw`CT5$)ID+eWF=`I@*|Qon zEs3V3(>FABP7Yy(|0z|ZwldKT-fkUKbX&phYkQ5ZGv2Nja=LSpJn2MO5ep#?&3{Ra zK#II%#Y}s*ZeW}+F>Q%UE8i`z+getBF!i8rA5Pt=aGfA-6ht=}-RNvBJi#>Qi?~MX z4776DM&m>ZR)Ch%lma%m`nQC3SoWB$AoxTZS|Mc`E^8-cv$D69#qXxtviRpPZJ@b4 z)vPWUro0`>;ZE&gi6q33uTv*h(8{L0sjqlkEvW~Szt}3g4CS^+G1$TH7Z0?qeASX# zgn9A6%GUmcoC{B^gTuqLQwXH3nPZ`k$L*oZv!)0+(1R^1i6%%!- z;1P02d#_Kx&+5N>Xmh;&(CV{s={fPK^JH*F)oX@cN{fwL5ye zH|mRB-ZS*HCo7YB5-?(yOjP%aG3zORs@TzSdew_tMzB1V!OZ);38=@l_|?5(AxHWA z65OP~_UJy4@G4(xit2fl!l3fenhUk9R{;d3Y56=g=bk2%0N?kboY#P|5|U8#Ee6D% z)W?B?Gb%wj7m9q=NS>^b07;03xM({3<^t8swh=ryYSxaRF(OA&4V+sG#2Nb#SV~*F zPLrfoXAdMs#?E~l)}6~3Ud&McHRbEDkDuxzJgO4(7lg~_H}mNdalA! z;=atv_~ncqU_^z6F`W3{*MnPofLK}l3%WcYZoP-sL*t+G`lR?q?#tts`r=kP^&bLf zQ?MVjr{Oelt)+c&>%W-C^7tL#_Bbtp6U(feg998L`U;Yryn_sO>T66DX4@LY4J1>w zrZ7pQS7QchH{pS^7dSd)bUJs3T^ZKOtr`(sv@6+eK5=jhVdEZI=rptYtZ^p@!V-hP6 zKa`Tt9H2GL&5oIgWOm-p>xTG;Fvmpx@Tx5SOGYqAsRJg9o-ijyQ*WRrbbRHsKPo-- zr5_~f0x8S`&<|E;fqq6s`&Kh{W}N1JLT3iWe@kYUUYY-=lhNN9+|LXEZXTT&f7syu zH-mex!T968;7F(5rWK*}j&~!&IXs@riCv|VB9-(oKurT-tGgK@M-sWEZ!IKRS z>QAw~bUNjaqtmqGZyDG5@n>i)x;kp^i8R!X0_DJEBpY9se_ZD35Q3|BQ}5 z4=6{(2iW8`DYJ5GMce55igYFW3mK&;S7u%j<^CT&EsLL{C;cfm#>Q4u-X~A1s!U>9 zuD7(2KALW8UP+S|NK^bNQ(qq6N9$L`e@%5m<6lwT=gQ-U3orHzQQFKm#czmGzmc9i zKRvd#hmRg~iTg=vh*Nn4@hIp;v6j zZ?ZAPmOeYAMk@nHk;=TeFmgGFibnnzZI{KLrrZ5T<w`d+aO?Yev*v0OISZ^|P+^ z;Q?wr5}r9FGhozJ@jrMPzhr29pe$(}ekZ0&e|Yc#Je=3?a9(HPpK?DeeqR~j ze31^>s@SK+RWp@;)8D!@34RABUPGSV|EYRo8#|udz?<}907vXpPk-Rm_g^V zkVreN2odh|z@Hdk;5tzHb&$Zw_$8R(sQ3mbyUF+E@yEG8F1{6V7!f~R8rA1;tq@6?sy)8$O2BYb34*eX{sVsgEBRCR7$i83jdT6|d*O~Z7 z+z*RCFr+V8RB7SxY?gtW_KK>1;152;2jk=Ky6!u;zfokATt91N%hxt7Gy{m>#|nY< zrnrm`Qm)qe9;{<@{AFq?kN=qrb)Ri0=6>s`wze(V$<${6jrQHbL@kHEly4sb8l^=F zXOJ5a-{;l}8P8C*Uf`-apgvL8v-Qhf}cu1f5RTJOjKEBwuj~^VkQ@_RdDUYuo`e*9YPh8#K zq6~ThL#Oyv6aR=eL*ow&JrZy_l@G=kw8xKmxc}l+yKg9?I`a*?eXC3cduMJlG>?3U zN;W!v#LeGJgG1wkzQ2ciN%)(yH)oFu^zMOy{zL-wJn+93$M?C?uTrU9MvU+K?y7%j zU$$rI9dZ0A7yKFpKa@P&A4{LCiSOpk(D?Bq00Hv+sl$H18~d?`{kOjV(VutN*Spf+ zz4oyGfM2gXejD~f-(jB^zs#GV@m~##4)xkOo4lR<5$2!4BcP!i2pgWG1q~h40b{G| zOT7t0YO4$++*H|r>R#|VrBk#ybAtB>I+Fdk_;L5)?qPj#aI#vjihl@(ogLpw1J18% zHuDDgHd10ZrSUG_=j>rhtSY#2&|p93-6~x|R_7^7-q#ky@{s5;TpTzlD7hu#mXf|q zm$N=89tw?cq0M~@O)C_lCpv!jNtU5mIH5W$LC0zNl9O(c(-LV?XW!!Y4P3m}PSm-G z4e`x@fSQ%t%`t4nm$wZ3Y&tWAYju?_zPq4Mjt&-EsmZo7R56-(OVrjxx`q%RUXY-` zb&R1sI{rP`kqQM^qlheG`8XNh7v0B(X#H&nlFp;o_IU<2IzBL9ZQw*w+hTQkN~nwh zBu^3BP4Q_cca{wFSXOD4N0@!l%8tfNNa+cgHU|!SIX`zSln$T6T8u)}Qp*vyCzqBS@ zpL*GX*aqU%_+NQFD*k(3D`2cCb+3%vtxx@uV5Z}wAK%Y=JhHsc#P@PPEdH0$Vnu-E z)AJ00HyC8+YxIx^F<$`q1G=`6_yFD?p0Ev&=W^=yd%)Tceqg4cOJX`FQLUF)H|gB3TaDW zW3+j?s(PP0uE;tt+3qICf#i5MCff!BJ5!-E$*e)JEM6cdnq(Fz9_JvAook8eI8RF^ zS@|l@vwJMdg3VotKOucr>b~Glm>}}YYGt-kMTcs&R=dT7nsgr$x{&*vPaw#~|3^_o zJ<>x@cBJ+SV4{*h&*;0B+McBJcokUcu4Hxl*NjcRQyJi1m_YAk^UaIlX?h9u#G3sm(Sfv+)uj~%15KU?pJca4Z{KvA&G zWkJ%`jP18de$E7@kjEkoiB(U4bCE7=UlC+;z)06CqbKiU0r9*r@QXyPpi%)?Cu+=# z4XX3=@L@2k5^k5%sV#Z;{vPWr(~~J$DCnc@8u)y2X+OYj%ENTJ!r`BSV4q{|*DFM$ zQr=VL!@ltwEy0xiM9%|XVAzr0fB5+W6PMHF~A%F+n{~75k3UvjLcT%4zZjaMYAwEyQ94!;SdxK@~o0D zyh8D3+5?zaIbbXI#Efx$MAK0BQhUoD7#FkSVqu46;N78^XR9h#)wU-P%ovrOCWwF3 zx?K{z#vJ>uMU+51Xa0BZ>ox?45^gAeVP{{MeK>*H&H-RH-7o_y1}hstG0fnzvG{Ct z9%AWR;AX_nROX&CRO(pqr#Fj4RwnkqmBQ%4)uXGszrE!P0SHGF>j#8=p(1VlCy4H7 zKv=j(OM(2z zbRM8b#u(_i+$q<;uO;=UMAOdo7-4aA<5}6%gQ{JY1+_b?JbUCo--leUj6nJU3e1oi zHAulxWkmF3fE%~YN#aF2C({^96E}W5X<~QJK46Ko8A}JdQ}&z41kdAFz8crjxam9m;WpaB+ykPQ_`E(^dOm7$ZWf zQa#lc(2!-NmG^f%(UJOu8m)VrBZ{}8Opnrtn0_z4I5~VQd8kF0yE;<;qO!Yh21fAP z{gDI&SKe3Bz(IH{lh7`>JK^qNg#hrL-WFe(HcA}u)zYjk{wJ#I49;@8XP#BSw4>4= zvp86Cs+j(!3ii;n=&z@uGTlpdO4RlL9*TpFKN2~K(Esn*&Trr&$FcZRiJ&7ij_E|a zYTv8^-xZ6JQMsU=%ilivB@^L&Q-qn)om2GK!z94E*9 zQJ58^;s3`mi&PK0EYQ#ddX<1zBdGr^!~Sb%d=%JHJ!Z@pWwY15^Hv?&vXd}0?<5!} z&a3sPpM}8w5F4)4fD}EfYhC@WT{xLro*XU&5U@pWgqN4 zQCP8pE}@<0Q1jr($wQc~BZ1!;Aw^cRLO?yLY*{`;h-OJnewyzBVpGp(CyqQ&jt78Tx}Q|fz2Az*Gcq5j zWBIq3?*2SS=s3)9g5+OT2Bg!xmC2|bBy?~v_((Lu?r=`hca3(6`*KyAn0m*`Fjh1&4RP|Eo3ZNl1d4cRlav1}Wu432@E_tcQB^=a2>?`z;1 z>TPXxLw8rGN1IeC>YGC%<)sSEERpG5qSIhYv^iDL!rJ&#>MIo9peb$8>}?WCY}RFy z=CK79cK~A=tBNUY)NH=+i{ja=at^Y8Jz_S=RkOIgu#x}32lFAjN7;3M*1W|n$ArU9 z9v+?q=;q^#!{d7i9+`>Np6rEqlwtWHZujnvbR+?!M^Q?Mg`oWl@%* z2khP;-2Hn`+eb=8=U$Q9B=;TXaClo|x36u}wFd=UQPPsEA1&|jpQX$F$1gU3KSQG_ zr%b6m_xaR+njd;g(#o(`3OtOWUwtx@ny4AAm0qc|LkF-|sJT@}d5Mg=a(h@u%U~KM zgmYp+=g9T45grL8$aDtGJt;9@v8?*Zi`_cIgC96Si0-P+oq2C&f{yA2WkDuyaH-av zMV!cmns{qqDGjF*=}weizE*v4nowGyZzo9H$>lO-QpTJLlvhyx)@(liQ_C(tsLBws z=p8;1&r`7LbTv#<_-#v~x~l34)mNnMH-zxs5Zkh)dQNqqW89_0g1kS;jo@E&9g{`5 z5xCIxOLb}1&)GWUcaqquhwUZ#Rhwj+GcKeF*SD$uK2L(TualSCHp$SY5aN?79uSJk z=@&e8wzF*{e%3hhkA5!@oO^FBb+?}N++bT^LZ)J+JuJ0bQy1xbU)Jbujo5`l2Cd>~ z$5DL~Q$|bLWTVsI6CMPx!HY9At}`^ktMzl1WUtPkhtY$vP4V|BJ(j7cWs>vUs1RmD zmB4!96P^cxvA^MQfq1FtGt4S{?L+~qTs5DrGn~CQ$Dccxv{4+pJpLZ79|!(5SaVRK z*HWi@CF^f(dPIvb{+RWYuibDeX+Zr33kgV4)Nt)AQ-pg>E*?SE)i8qk{2m6RGL zsp6hY5`c8q21+p0xg zwe{(Yb*`=uvR9|DI_*~XVwVZnUdv}wf1@^UxtT$NDoe!uXA4tu!Yp#6Kw36eT0~ji zLYjpNHdDWrKFX+38k#cR!Gt56%uD$?hu?B&RFe)ih=OxmzDIz0i;K60^`Kew@fwO> zDdkyFoO0p7L(}1!xV9yzrJ{y!|gQHg!zR5qNvdrY##UDQIYS zJ`-6qCZ9_8ohHIzjLGIDPAU&4^DFp+2I9ISpkOrqJ0X<`R5i1|>0#MJHP zf;NNN#GsDX5WPEfl%S|teGYcWkaWnlsaYMM*CsO(|Qfi*6^Ql*Z+Eds9mEYJD6q>@urlaUn zM@i5(fBwRGZF!|=&(NgFzUct1bthnvfUh72TO-Mg5M8pOouoj7ro47#QR|((FE>2W zelua6Z0u}EJ*Co_#;IV!_GqHTJrg`M%C$&bLXRI2F5KU~KKyLYv?K`(?ij4Mqr@S` zuGt5%uCIFkQaH`1C`28V!pU2E zjEAY;iS%2;mevXI7(yd6sRswg*C7Yqh-9kdAGm^Fw*>Wj_CATH?Wo~9MeUs=+n3kg zqOT!^y#R?jWwmz>8i6TDr*vSO>M`O$6!_jbraB~KZ$$3V<$D!0(NI}gQ#ny3(Zm$_ zn;oA4sn1fi(-Wk%F;Jpq1LLrlvEumTkRl`-Qc!9SWLt<;Rw|OSYF?R@%hmhXld9~h zASnBl0cJ?(QfRTb><8hbTbx-Crn*S|T%gOTXp)DyMSrz}$@xBpSx$O)a^lQ507Jbc z@I}W>J1vS1eVw0SkLqPojWq^s3*YAYnCdchBOJl)s$!k$K80DaB$ouAIgw7qEWZ)s z4Qxvg5~nFEwm;r#Y%Gl?w1Wj(@yCEM{0VWpiU@ZZ!rYKzTFp-OI9g6m76jYV65`oAA(7GJSxrQbk|& z-jC7_xEckXI+LRJwo1X8*@PsDw5#SX_|wup54r%^Jg_ne=U9XFlDdAT~usU4yrmw zPwR@FGFHz7susk8a2dtsy@w!Pfc0ew!;X}58g>J9rtcrj1A?}Du5!?RB*k@gNPr7m z^G^cnKR*68GvT}z;b@!St&&WcO|ZZMHKOdh4VBq|{>ro0=)GOqf{vW97_DeZ{$@OL z!QTF`dlIf6_x*Z}#C{q(A&IvEV}!(Ym?rf74wrIn#-aijQ(!JA`mu=Z(qXx)CjK`7 zKOz466zg~1YPI%JR{4*Ozr*8__)dELBimIvhocjSJ-{eW)eM{(-@~M!T#&nY7nOdU z4`Ri*lxj<49DjmO@qMG)QyH~pR0@!tXgK5;6+RH})fmV0S;)sz?yJd_N_H(>+s5|x7yjIYq zft>oC)h+ky4$W2x`Cz>Hij_n-$9O?^X#98deQ5jxI#{a2uC(y)Tqng(Z;$3yHet+= z?qeJSpq@9AO~`&DM_(9Hr7 z4mYEq8{|K}(SG-lxK{ge-Y#;BeW%412 z7BK9SMOXOGU{0o#c7cy?6dHAFlB?oTb6!5p%mng-)=&-_xzp&+{|jX;>vX{g5&8hjDaT?HG_|xOn*Gs4-3;^+jV~ z;kqrlxuYANYDog@L(GeP&B+C<(s79OsaLd;k@}4sHM!JXBJV2pUi_18mP7k!e8fsI zlLx#^^o-R>o}i|DPMT2h{?xfbx2#@mk(Tvy1xyqe1zbTfc0AvtM9%94gx*Vw!XZEw zpq8X5!P{X!u+NNQJ2;=i;edfpz4^S=-W&YDDPVT!)s^b5Ke#IXphXMfYKSG>X1zaM z@SYWaYdgt{JW=zdnr!CM_cvX`kmkx79oOOsHsPxW7gR@2Y((GOCEQLA4Z&GoJ$3NK7N+sQPdtr3`H4bOKg#SJ zRZ)HYQ~2k=YWs~-?;k4m(oa#XLqya2zp~V^#(7w~D~mCF%WDzkkr-Y?m4Q0{1U*|+ zS%xL6W{xY%^44bQlkGe!ebd#qv$^MP4Qyr6R;@ zQc-hI2qx*^&$p%DAVNBUi~I{h`e1a zQs0~xLWgnhTOI`+2hG>+$a{jej>Nj#qP`5pWw)ECt8M(?=5@e!1%0v=!_ zXpJQ~aHLQvg?(s|qb7XvMoPM#8p_c;>pq)9uzO;)$RP@-b)LAE#%Rz^A;rdqW!oAZ zHaa+3#QB2CRizU-Y{9u#Tccc>^WepwXHTlesK!B6E)R@SKIG^-aPVR6EWbq2_(Gd2 z=*VoEL(z5Qixxj;Ojbo#Ml4vB#eYLbO5$Gvh0>z?HxqHe>*;ZG_`@>Jr1Ydol%I(e z7916IRGmq)GvCK%X7w}*FB+Ntq($qWf;gLsA!<(?X0_+w2TT~4=>Re zM+k?@Som%aqFJ6q$Y)2?psy|w5XJ`kdqxARxF$^NPfD5J$(ID)l!1Fc3!bdP=X0_d zBJ@6Liup_=hvuO84Z>%t_hm6{%*{<@kI36KoQlS!f)eh$L2~E0o}$X8aC-F4P!8s^ z*;Z1_CYw`v_AAz?z>`zM46hVb;J%KP2XK%==E$%&mSa?BYVXw`8Qc9U&orDZTMV>0 zPMb0YX@3p=aB#^aGeTKHhmyETp-B{a(XO(8bZ=Tx>@}rvvPVGjgH#CSN+F%#nCvLW z=>SW@@EXpBk#eW;FmFj_=@Hyb-g^s9a)=Nezn>@A>Qp-{{uECpiW4caj|L9mjRu{4 zdhBFbGROPG)e^mR6kJLC@G+?8_%)ebJ9vaB7_GIL#$X}ZOgt0t&q-I*a}3*FJ0)Dh zV6`*`Hu?$+eIpep!Hy%w?xqjZEo09euh%)z0T6caIq(pxow*5pN{))g%yIw$fR0nV zoEG5lT6mR>M9F=;7OdN4AdpLgyJEJT7U9|`Zv`16E)#!*iWbqpL9O<{eeN{cS^GWu zun`A47^mGTeQOvD`DwZM_rB6+rf-XQ>1J``D_#|tN2%3eoLihFV`QuuKi%6kN5)#C z_=(Lfu1x0-HCG7ZyAt&JsKot?2`2rgmzfL2nHuh4M|oVNFwej@h^)9Q3Iy_LfyCoO z@;yQ@lsiM95&;SMLAEdWmFd7IMx3D`x2aR!Ua){Veu-z3&#m;bqku}r#QSJ$q&68n z6FFniQq_fPi0vtvCh zaIaG(^2E#yzbzm)>!F+E}O^HnV=9#k}uCL2AfQz6h z8X2|NS7#W>Pzun}dKGt6-+OnGMD*(|JV^*I-WB2&~L1fwy5gbIJ{ak_2SO8l8TGX{hESct$OQ(npsovkuFs!`BNN^AK}aVuXEd}>?NFcwPFftL8y+BafYp$40KT`C?|_6?yX^i_v*SQedLSn=3%k}Y zZZgINOTFLqnuu5-rz$>Hq$q@czGe6BR$v4?+q1&(gDfbJY0Cg zPiKw&p57>@F(9rbhUA}pqS<}EJ`yS0QsR6;8+)f2h!y7iEl6+vGfSGsCQZjFYTiJ^ zr3uuJyj}q69U?OmLpeu_wKzK&ngRpr!yIorm{Q%5!o?MH2bEq?(mphnT>w*ni z0kia5ftJBJpSyruSvmRD>Y_$Ps&+HaOhkEJUbHf6t*kgPZ51dd+46Rs3MWVjE2h)N zHfHP+b<~U04#1UPV-he-@K4xdpQ}6M0G28ZI;l*%eQ>35+sflRt^#Z zIajZC^JKLW%Ba2=`rz5B=r>#6jwG9xNFe}4f&96W1o??V4ki;x3$rAjuhvAVrh@~_ zQJA$0g@gw{5> zcvDebPFq(g%@wU@mLTYpVHRl3 zi_7F86ZT%UBM9ig7Q;b_%?S|#s3YTNDRCr{=K-h`1X;76`#mW~UOT00`(f)r(vhhVpr$$7%_Q>9bO1k7Kc{FC{FG0>Ug zc-!iA@SoLoGzKi{wOT5x>g#iC5CIc`kD@n^)Z&wag{W&>`~@KJMohrgOklU^F}KYp z(n(Op2T;KOsVf2FX11}?2k?JuTOVlHlLmQ0)EIcoR4+7)@i4|g(Za0|27@0aT<}aQ zTB^NqM$_nw7uh&e6-05b=~}`p_`oLvd*LlNu}kO-ZBP&_RYV4&l}{9r)5>t;=vf^` z#1o^*Ue>R0xH-Jlu~~*-nPBM*drKJ(^;p-i>U69+H%Ou=B|F(-TOvh(mo%bV)Lj~P zL^YM5$q=-LEqNqb57@3$!K>7*s}vblj4a{)^`VT>p%;Vt%)czIHmogKtpr&+uE-*B z2^cf0vLchw{KH4-sA7cXyo{uWG;GF6(K+Z;*x`3&d>cG?n($pASv#|!A@k=YE$R4n zbfAw}kF=A+=Tjw7={PxRGd%;al_J&z;>WUJ1|1i>&#V5hzk7tZ^ik-^V)QM3|OAlf<=^Nw?O5po7@tXUB<{ z+YA>NovUfRIz&SjIoe_w_h0rY$@;cO1xmniEDa`8@tVXf*aPrIokaod7&Uc-2o5=2U4Fjz2#X51oSgVQepnHq-V_d39QYch^n-MQHi~ zQQQ>}4B(PO6{n)kxCEtq07eD}1Yc_tSn6Fg5xP%gOup+si{l@ma~Fj}nrS8>h`?Ks z!qaV$CU$rd4M^WMLWDGm#o&AoUK)RWEEW=PkADOdYe15wtR-)-B4tWKJUS?=5Z0*i z&g@*B4{5ZwTtU#A71s#lydBaGVeb^P19u29+lLPyCStqhs*4CzcC0dIHhhOr?9?$6 z{j<-mx(iotTz%2nLd^D;ysIw%t+Okv)ksT(dCrC*?RoDDb=Vnbot&6)ZJ*1;?I4Fm`Ji%G8Rh-l(W?1+qE@e1bR<$_8(;{gS z%V46X;O;GpC#cJ7qE05@T4Bt`BuY+c4Vu%F`teBW59&(ev@ys{TK>04oc4`^jE)=K zooHdE_(S?&Mh#tno=wF=xT^`ra5TEGF$~cNUmPJeZqelZ(D~>Hif(N? zJ9WTk=}8BK*8TH!KV^Q#lGV$ljR{osx=Pii8ivlP+o#0z5`L*+>zqA4 zb6d+&*~-ivwzDMnSIVZNxhzgF`md1t$J8tOKU6|>jC8mWg3KH{QEl^EI%^y5!?-lD zRg)d(LzO^i7~n5IrFvHw+Jw8>GT5^f!k)n3Bh%$5nkcG0QE~ZJ;|s_baBqW)V=kc!9R>tQPHp zT7IhI+Z{#PR@;cw;<01VOF<}|s+Sd$@Jg?84^HKju@}{LIDlmf+pVbh?S3MAEr~c& ziZ;H4#BF<=U=P>0fGy~q%E*x0Q)87j9V`=Mi}mm(H~=G>3_R-Y&IJ)83J7=Zo^voE z0%_Pwt=dGpEQPm@Qr@PvLBOm6OV^kpw29`b=)eJu1tPHpEB?z?Ft7AgwJB3P8$J#P zAN;9-psD_nFbwa)zyJ5e2zky>36*D$K*(d(tY5=`v;?aVWp+me3WenQfLCC!WHy(QmSAK{cAetZxp zpQM>|0;vIZ|jMZWFbi_)p5B@-t@ z8rvc)UngSp>oE(ps=OoW&LW7wt}EokIM$ix90KBas!76~YA7&Q(~*|lye;ZzBDh~W zhxjE2vo*;O4#+|VgYg~t!V$1o+y~d1OOKF%vK>AcIhc5s<&&sK?qi7DOl|T= z%JfWU3CT>I zTHzV5ZwsN9nN!lK2R&l0c~7OY*)E{E=YrGnTJb53ir&F37RHaFA85^fQ@|ekt7Jh# z%hm=w3&>NTMn{HA9gL_78R zJ8KYBla&QAHvTw08qYL0WEUojAv#B~Wi6g!aP=H2uhan$NZ{kuI7%IlMF1~nLsH}J zrdx>f;UV@Y*JrH&%B9|x`gbpx+o_(cid=>M_BBt(L0xq`9>^)D`XN7MCkvfC=p>Zd zSS#m^@zNLAy$l>QcPK__Zw^CU+?wQ+ntxk1it7>YD(AjJjteC9+t#qyy zFw<6yyfGc=kZiD`I>}5KR>i_KxZaAd+U3mgkD5sST&OljOFL60&DIIssF)?trA`b7 zuLng{T@z*_xuh~qm{?a+UBj!ZqMC^l=olpKqy$yt`Fl;&RO5m*^Y{Zn_~1!dq&oay zP&A>sj=$8ZA01WA)ooiFLvoWY^+DNws;AYq)J(5GAIv&Ob|<8FqM}07nYJX`&=v|m zXv-5F0{j~b{$;~TfL&9<@!(%vt4a1x-&q&YO6L2~Qo)%;bia}nPQ*<6O$Sq zKKkp?67S5W``N5J+Y1;^WS8A~1I&S1j3_ywlwMA1_|2;nDvj>fLK7Vcl*hu1QbXD- zDH9hxUV|Sc&eQgEaJ>u>Nh!~mGE?!P;pmGOoee#^5qt0C;Cnwqq^gBNgN*m~#l+$21xM1}MV)oJVXX*WNjmyDgvTM4MxQ5*x0!u(qw3z6wQmuXt zmJ7fswQWQwPtgG#@&>&rn(=$RKj4C13Y#bDuYhoVhcG~B>A2vB`J#jeo-9}7WXVp) zTztMKKK7F}K5g}3Olz!PD!ND~9ix$+ES_|-nTI0`d_ZW64kMe(uzs#=*Nm?BQd~DL zE?{C067ojnouZ23*Pe2h!Ma(aYJ34HxMfn z7yj(ftbS5lYoAtYdBPTw9nmw-VRli~Tu2D#z%lRdLXqTO6!E|J+tzuHe-^uyWA zakJq%mB$oqd{|A_vp>wN-gTeU%2br=Y+TvY2Co?rt(u%}Qc_xaaf>LhHY4k3N7Oph z8$T=3O2Lbaw1jO6FSJYQ!Zc`1Oxf{TOq{22OW97XR*t$_jy9ZBIX(4)rGG|AE4~@Y zdLJ(P%$wkcDZYnhheash=gLsW$R|WK&2%??xfnTL87#YJz!VRcUv$BS%dT7_%(Uh6 zpI<5@t+MG8aHwGV44g|LSR$q=fNTsD2ud`-Z3To;eNgp5$3*3n~swO2Uv|=&}EvG zN+wF%#bF#}Qv58^<*4tyQ)Mvt5X?+CvVxp@|M4=8I+j+aC&`maIoZ^;=~ZK=e=$>= zM!&edM7qTw1uqPZPgIO^;U8ro)-n*L@Q9o6^o?2_yYCJ00eI{%tv*@Jw3~L2q`(Mk z&YVyJVGI{z0OpZD{hEDBU7=SE8?LSJ&s7b zh5<`yRJXpazN$T2S6@AqI9RD@_2U~GXDc1)!o=uk5lgaQgODNh(PBq3B*LW`Yv$XQ z-{IOT0}lp2i#2*jP0NL+a0afk=oyd(kKdx7UTPE%LdTe*HLp8(Lkug7-%6dFfwj4o zTu9w-rc`hPFt1wlKQX?E&y{a4IG!A}HBKm7&3a)AM>mw<+0px#b&wXtK5O3SyjX3* zdIeCuz!k!2h5#~bC(ej-o2cZ39H%%12%!aRzalx(;jfe7c#%$l^$LduK&Q%?@gZk* zC{d({H%Zt5oe=gIl&RX9$LT#2<@m+1fJ48PjC?|k&3n@+FyMo3)q*6$dE>j@i%zu#M=|qwhY^u%O|6~ z9Zv?0!SWr*t4vKxZALJDq=7wM~)z%(-I_`p)8m=%I}-uvKa051r7 z#i_vS%yZy?a&-FsIDN2Dm(l7c{Hd7d@tAZRIijxUZ7)74tag485;X##T)Xl?XmL0H zkBjyY7$b7rqo{hj2a3w=AFv#NkUwoqWs8n#Wa>rl zl_5fG*WThsDDH!z8*a!cB!Ibg>a1-NFwU|t1g2J*dRk2It00(u+^7Xo|6u}Kc!8P* zen?5@(mlX42vf%VxEW1!ipiQMf2y90WqZhb)PI%=-sW*+mmiX52$En|L*!UPR_QN` zwrd6CB%urzwfqfZ(kYx^{`Pa>+qH)(^)a2{v+yw(crvIlnr{ghhWL2!%m@WLwMyFJ ztO1X$B;J~_X)qS5uSa?jZpx;je;Ppp>k+%~2CdMVF;9nu?_h1sw08sXQ_N4fhV-%% zDbn^8QqQxOuCaC=)bm~T{N8kgdVb9M%Pv~IKBzz!Co0hOU(c&R1G#SpatIIL`9&pK zeCFBnjtR?&@5-mn>g%_aVxI4(xbYj~T8v85^?1!^tq?(8h4Jtu1g3eF-9+FbZ{#MN?OC7#a(+Wt-lqp6C^wUnSnXrES~Fj& z6fYvMc@yxluyG=a=4cxaYX48g;+F55g~*-)5yrzEew1pCk6ePmy}y5mNbL+Czuf%&Xa&cP}J9tk52Sf-KG7GMES5 zk*}L`;Jg1Uqm)Pj`?bGRi)Az|Pk2{-jW z+2a-*exA59G&fzKPFGiY6`#S6jd>1>(PIo4d) z=4v5M04vQR$!_HEJgrq70zpY2Op&0Jg5&3#zvcRwps#~ z+WR64ZBfvsnz`k(vtLI&UAX`Ouj9EMnSo1!@nApdR7v+71fp!IbSEo9aDwx!XeGG= zK^DdL@Om`e4`1JE6`(`J2Wq;3Ukj6K`#fU(8+>;@P{&7f1odM^@88=+ywLcz=yRU~ z0F-vHP&U4u$Hybv+SAO_b6!W&-l%NABK-exw5=BNY-FSYYk{*|KQJEUM_jHv-o(i@ z=FFXEu+zgdK=sQMm%3ezs=Ae-AbaBMz_o!ajt|{#CCpCR`UbTE@hD3$te{iA%}%i+ zNv&*HQsDcGG%fmm#jGCJ3R*rP20zj@4Jmh(CjHhOye9eQKy|9B~_W5g*X zsTyh3>JJ#DH>f;~CD^%d7g#H0f5H1)y^Z}bbdc1Fh$4pK z_(gjfY$l8a6w@U|c_rzj*hvt5gq(xzihUoeEw|@rh+{!1MRBeb(p{oH_~J%GEdD7x zVc6Q>&jr$1CUfBI_*puAoW$lhVaO0Ee?z4*PN@NPm@REengH~GhvE`CfCk-}tlv7X z3B!!>*j{jAPfadVS&FLZ$nQ_M_h>~R|6ql{I*eJHbgS#M35(M93d^PW#Dx0XjG9`C zz|K>=Y6mG$UxE>aes}*1#d>Jhaq`6d{s=u3H}SfS-50Ii(%rRY%epHI?zn$`Ca;SQ z=m8$U6E=WH`DmWFzW%YqX*QrQ?=5GXac17<_P)G#?kJADzG>u>TKnd&m)@I)izMqf zftY!-yG72JE9~)T#}x_{IT~AH?M0AaThyAZsaX$;0p1eKFDHRh(v21PZoFfLZ10+h zd4sdjiRNQ@26yV{o56qg%j26} zVBg%=Q(H|)XYU|2hmEo4iEicI%V1H`CJQv)vN{SaVl7G|0O<`y_nkeDpEjs^lO}7< zfdDxSYqVgxjqL!HhDGD-rRcrXV!~9?=$kwDC0qT&DlL10z#PF%K}b}iNH%%yQ1E;x zj3c>*$a-|x;jyxjOC`9xr2hBri3L_zB+#tA`{owU|EeSk?gkfPtjvRoX5X=U?s%7w zK1!Rx9CIzGZabov-o0sFfP4Nmg+@zCXw^F)yJCVFE1mZeqmNKX(uIRE4wSgv?OF;2 zjSwFgT{s_Xn|oF@29u}Odk~pgV>Or1Te}8Y)j47E4A%0vEh=@j%2O-#Ee)l%MdRo8 zfCW5}&{Sd8fAB#qkP^CDf{M;&MR=C1S#k2IdgjY{e0cAngI`3O*%m#3OhngQp~|#q zcR!@OgOgf%*Y5oO0wTum=kqvv-~s;ph1B#pvV*GysqN8lWRqeHwZn3JYNE70bO<_N zEHX~mr)MHfKR1Tk-PzBi0(>+fx~4Bd1}2Oa8PVO%6ts?b3DbyV~OcHK~C8N384@^0kTO@ujnz?}X5{Byn*@v2_TL41@-t#J+&A8l76)pEFe!KGrTIs_{q&AT+0Mu7SC zXVuST`1H@rxMl)pO)t0dn3mT!bdD8md~{HeC=)m&aR>x+ZI#EFj5vUMdt_*NMGI0=a`9-N6l-^UNk7QeLHz zH$qHjmb#!Ot5>{UMx!yz03@%%X#Ut%z^E~#U&1c`SB6s>e+H?Z2t|bVYWjHZBL|Ua z^fd?LeAMDExL$HV>0A77VrRv?KJY3q;g|tyyPd_`|AG6=uB#PY~)i8?tNz?S|)w@p&P`>B=N8%hg z9^-3{$&N{HVfH$JS1ILNKVqEe;O^cazP&A4NJ^Tw(taNHiiQFh2E73NSO+e}@XTJc zTv&XtmRpm=Aqj@lL36?8+|;LgC&KP-cV8K7!ZK%=qTYd7hql$N$y#0qDI}An!)%zG zOEoVZm=hTl2KF@S`f3>q=US^rx0iB{aht=t^t_kHTdR>#?G?9 z5n~U}lCfV*X({@eWG0`&LDZk`v0ssTpm*$n3_N%rogK2)`*)9O@twlWf<~ypcO+}= z!qjD9@ZE*M_s**J?;b*cdGMfX@py9zj?KW8U>A;G3_L?ufCJH6qT%%dB8uBM46EUm z2fRz9MEET(pp5+gvlXe8(3>uL^JMblAPm?~pJZ@7us99ni(mYrW!#Y;C|J|Z<8w94 zB(o`Won#Cy(r?owg=)$|~0dGkCrDk&{ z;EYL}X!HKI2tkKGY0t~7-|AnaaLh9Y9fP0k3IFUDj(K_aWf!fzc+0wr3Qo3zZ+lfI z+tJ)-M;^b}*1TlFyt5ZBnYMoQ#!IqEeEHKk)3cQu0VO;8EWfrV{gtDj_itNZ%Ri0gm zrVKIsO1msRh_UfJYo(>}yP433oc>Q*i#&=SYbbl`1 z`rs{M+B>R1sS>)Pbg5)^6-#QYtEtC*3dVbHz!qVR{HQx|Kk&Wmf16b<=M(j8(wI-T z--<3~*9wK~gcfSeTSmId{}A#_LrzyIig3Kt zm-Sh5SksiN{{6*JGs_E5`wv6y7QopHH3sB!AOGOJDV1849TnfoaITSZ-YjlM8u=pV zvBKJ;-zRJI?1j;W3^M!q2^VBN&u2>;YJrIWbS^V>d2{?*0DpqmiyU7&S9)+~!!tM{ zT(KT>${~C5iQmm=EIi3WHz7TPU7O`m_nxr9y|#W9PC>G){su&%Vhv|*3ekx!ks zWZdi}Y}BwjlekuSABLl2>|M2}dT;7`BFKvBTJm)U=aRM#&TpiC&~IeiuG&tCHtf9F zj?vo8CpNq<+5Ym9cIt%txtTjm?~8?iO>*l$z{n=ZkXfh>4T+~JY}oiJ6J%vBoX?A; zs#T6fY!o?61w*36Dg->nv#wGoBv(mtjMd^f%O~Kw1)vJ13I0h!7wL!M%XtVIjbbhG z_lxJOpMX1)pI+LiRWIxU(EbUdubus%a7nbgXZ5UxDrP5&&d;n&M#pwXYBjhfHC()` z$0R4E4C+%I59*nJT+A%06`x@25KP%}}S@3sV$K zMAsaqj*k$?p%lQMmWb?1wWvKuKOL6*Y*o9u|x?X zrP2}pYmX2q$Gmmj#x>pRF1ld-n#->a2L(Ek`svDq#fO!fetSp@LM1#eoOp*&Ip(@> zrmt9hz6&zz#|Q=+OzXgl0VtLx!>B3r@VE|za1|zUSz4e`YZ(ITEKRBTC*!E zVYORn6E;PAw|n}vT3^M?GV(LjhL`Y5#ZzztAtMQ_#es5-+-gp&_61>zEJ3)znYvuW z@5B5CPM?fKLBbO0JiJ>Gc*J(&##P0*QEhdj`$*i_aM^}68@n%8whAM~b!R3>F+j*z z(bWG@m}5Lix+8WwE~o-i=Qm{7sc+w|k|vUV_lg@YPL9=}1C7>WZqxA-s7Z<2lVrcZliUT32|%%nN7( zzr;B9zBZ}rM|=s)yiZdeoqnxBo;t(Y&Yt|MN(OZ(5ohvr=4xBGD#t@ z`?dguCU|s&6l2pWX9BEuZ>aeR+RTY~*J?%nG$*)QBLRhZh%(!#``F>A#wEwn!?iO($t**mmo{g!Wu+e3c4~o)}<*t zc_@5-b)X~IdW{5kC&E-7o!Yj#`iekN`%F;_3j%>kHHQ-jCIjNE0JtVKcrforpv4KfIr`xv-!Q+<9qvU3j;WczVC9eSAi`c1%U} zi~weZ`Le=2n7|lmA+AFi6EcUJk}q0ncV%j4RIga}8dZ6ZU7wboo{^qWXsJn&9ZZ^+ z&_)xLaoe7d&-uyF)Jy87mknufMlM7fSFflZZwzv0(*YOwpm#Ls6+L}h0pr=u{whUi z1DqZW(cgy7335n0rYBn3DUe&5Ztpc$gUADKf-?#wnNB_&89*$6%ICt6lRIdjnV+@y zWo9I~sU=b|bmUH(*$w+vB4X9eaA??TB5kURR;Ap;~2_!WfZNq3&N46g>Hb8Y-lUY#zb z{BbkO)1|zguB~DaCBr=#Tl~SsdmXO3T#GnSbgvG3<}0PvKgugFEGTjsQA}RS{f+m& z(y-t6joj;Ol&e@tl9O`f{uFu2sm(jPWsdUXIoEGrgjT8$J}5i;;fwmyC^F&$tY5Bd zTg|$!U?rZRQBnI^h=YzhqS`8=aAz9HjSSc`^rL0QGQ)Xhhq73KQnk5`zV99F4XL41 zISkc)B2t75jvCjud4Xruogu@bml8B-w`aqH&B)R=oGvlj=kwRnXlXklnr>N{70O-> zZk-?myNIv~Q+?_YlYsohQv@PLq;Rh*XD$!&#;R>t!L=`0^jDRg!9-H8Nv*d66K8k{ z{7k726>87FoSBUI_15V?*8X*Emy+*?2i$;j4XETMFR-*XCP&6NCm_xg=4=TauMNUq zYx=ol2*&yT#dhl@L%>{u7M}LibmvOecp9@aHYmGbo>u(E-vJl)3-G*ut>Era>*O6H zl6x@3vPtah$=0Oyni{2)XI_!0YF5SiSql}xDx}cvUTJ2DQpMLkn&CtV^wRj3Oy=o| zR#9=>)FXqmZtDki4CkZ8@TG|943F@ zC5+|82p`?OPwj_6(VcC*w?JL%vQH`3q*(}~x~lhepOSnJbKyV6d~I(T`lc5sT}_+h zp0SpN&t@dLOzN1${#m>RaLnabY`J)K_hlOjIV5kqEK!99*zlG2#RvW9o(a;A^6lvG z@>Apc@l}d-O@ZrxASQP2yL1du?`3{SZ8KfkD}3eHcrQrfG`EAj>2$C(=8;MyH(pzU zOXNBptOObInOD*To)%|>u{V7vQ^!2fppzw@46^JEkt(9#`i_;(X}vNi5TR2(BE3XH zMH{fBkZ>!}J3d!EyQL*mu0Wm!g~3yEA;za24UX33X3vEK-;%IX+mBa?&U}%x4(|#Z z#_H?qFzk=#wynOt%|E=Jyf3U{dR6sUZJS-JQ@L?O?1$7oYqVAN7-W0?;w&mXkb%x# z!WO{0iQ26gNYn|u;_bS$G75B$ZP9%k-g~-!%++z~rtKksX8k?&$<`Y72hzu*UH{5& zwb@8JG|Hpfx|0JtG>v4sxlQk1xg*KC;{A+^fz*@mSNeZCEj`^DRuAQgB3_-#8eKLp zT{$bAlyiWc*4&>BeA&C_>l!<83;=cKGe&drEp|qwrl}p!&t|??2x4$Qt<3=hF3vGF zNBY5Knj`11Xb=Qo$h`K(4KE`ul%4FvITi*AUK(S>o#{CtHLN0od;fUjk-XX-5P1PS z8u4zDsA(;qKkL-XWF3jdwcmiz!CIx5V))X1r8H86Bz(*PNu_$|r8_ST$$Zmm#-xxw zGT!oo3e-Sr9--;OY+e#+Ut{pJR8E+n|4*kZfxm2}^N`>jQPhDlYBre;J#paWC>%=F z)pd2V>5lu02|f-D%0)Rxo? z?%EmYpr~ullw0hIs+r03@XCP(TKnwa{r0H6u8o9h@>O}Q;6XlhTRPxnar~E2^ul^T zP#WFWO)uc}cISE$&QQTI0II&ShQ$%Yf=}|BM}`Qkg_f}CUY_7__)aju zlda45EDOJ9%OA=Z1;RGjgW~K0+E)ez!B0-t1-q6mdWHNBi4L%1SahE<2N}g#DUg5l zx(@U%d|68Ut#=S1dNQIxxEI!`LsZH_og>DGK@@MaFwYvqicZ^PFt#IFU!O5GPhwMx zoQ?HCwKlhCv@&05@LDOMBz-d?Iw(P@B(q5%y!YHM)EBBJ8G zict}{UiDUgcz>t}|L=FLnSJJ*vv(5Ed;NX>1I<3OXJ*Zswbrazv*xkUNMx382gK>b z5m+lZvy01x7N?LJ>qsw-xd8offLKSqjpJ1anJ9at__WE>Jl3E)pMe3kw+8y@ZMafx z89U~t*hf)c93PkXI*dwwdqZwho4~qd4Jh=_l|X9o7B0C#Yt4)OGj1yS+0Ssq=^FYW z5>L8A;*}nU#MuEu;#<@KA(sw)^adH^Oi3QhsesI#v*~$!<8T#tUeny!!Upo&xx8zm zhC>NDzS!Y%^;04WUVFPZFf0l+$j}AAK%tyVj&kKzy^qW-QDF0IQv%*m;?wZiMBSXamWKL8 zjpsZuRq**nQ^VoO&DHgfH`U|fmlm#i(K&q1rXioqXcu}7*FfT&egcnmz$1_5(dMISRCQ)58RVHnyjofJzZ%A8p z4emq{1~1k<%|5f?7OSRP>^L4|k z?m{i4(dxzn7)u~6vZoN<3)DUXh_pfD^#9J)IKM8X#(AJv<6Lp=&K=vY=<;pwyEYjc zym%Sx)H6?7XD(70h?!jWYAE%3e#~CYyLAJL%Tn7@N$DQkr$Rz!MPkFYZ>w@B2KC#?OlFhIMTG{&x<-KSOUCM_quyUyfB>!_4qO;IBBm zY#g7ZLzjTPFo`Oeo>mNE;8gCHIZlZ|YdvMY0dO1D4qUwY7Z_@hnO)`4NAY`#LT_$r zURaC!ODK8?J)7CISnV5FnW*fyaytHv@+Ir0Knn$Hgd{?&#=}>yKz2!Gh<~DHsBfiQTL1K>cAdRG~rX9kK zX9O2p^j&J-Mj?7r7lIawWaOjE|JFe(Ws3 zn}_5#KEQ0@|MEmsaR3!$J_6Eo(wj?6*P~40WhiW`ghb`13Jo9_>!U&#i@ed)4+iqp~fibP3LzH%$h;FDP2UkJaAyQZR;0?8MoV4|Y4VFd?& zap&#+=u@xipBcdta49kw?u=7_0MxZX~pdTrULlzYUOo;Mf3= z(Lpm7j1F42KRU>Wqwo9?=gsT4Zf-kygW1*jbBn#d&StMUr0r~J!rk~wqb-}ebfX=V zFs_p8giVJ23CV^xxIDUgdF`{JaGzC$DpN=Kvx|(FMUL$NGhUv%Np8-^{zNFDXte)! z^d*?RWfUE`D(-qNhtK4VKF~!a(cKNOXHW|#h)wvugvlhJ+?!Y)`w8Y~ z@{KO}YHXSnGwpUP6uIPjHZS<2YXsu>eUy(Lfs+XPc-zEu`i7o5=v8+sksd7h zBl8ZH{E3ePgC#Gs(4hKJ;J>*UUq@Jnzr1M^cJPJX*4S8y1 z+v5jB(^O+B`yIVR0@(I2zXCcRfDV>CCNEe^pHoX?HOzU?W%$%;ogkbO?T&8*%mvZ? zt>vZs{Zm9jWX}!K%cH7Vykl2P3Ex@Ld_A7@!xwdR2CVr@ymnAK1 zHd&mqu))UDn3gH>bPmMSHpq@&v(V2MZrUc-BCgqucfUaj9EV)-tB8H)M%jJ)2!L0_ zzAI{Kv$$&La#D{|?w9N>n-cp129e3JFCphqL8Je*Fb5luLPSu}A5p9nBCkA*KX9#Eor|;Nq+|)d^wQ2FRmgcsF^YI5*VB93f>KDxc zOyJc(7I1&yrY3(1opOM(1`}Z{=5|pti|K;mx$ut1h z&N2DznM4r|{}Oq}eaX-(T_Xs#GJF)uDmV(SXE1 zMah-{LFIA#7d7LJ{rlf=gaMx*m$hFyuc>Tmxy(Dpmg_PW@Aq3!p|P%Ss=zlp~9 zoLClr$Hsn-G?DVR(pe;zf zyp>MKPpomz3>ppDqf%YhS@IbfEjZbDRwf%iMDsB3o}}*IuR;*YVxKLIK762LKyvER zdL1CFPH;Mbky<>NmrFOq;MFY9MMsM;0hwj(mg*P4pPh1 zR8AtCMf&b$$qSVSKte8g+`$A{6~sV|3N+SkTT1nXDSp?TpcxyHQeL!iNBCa_l)s$Sl0+Fczq|e||1IFlA9#HbKce{tR}k zQ#fj4qy(KWW-pO_qT;e>+9y^!XhLsGQ+vq=1YJz4G3tm7%3BWb{xlYr*{|4dvM45I zlU#rxn*L0RpsZNQ2QTIJ$mx7X&n(16D#k>+T)Bi_>zTmMb1z=1oGgvD%*R9=t)peJ zW@CwbHLpc*q^gGc;+I6v*rpCJIGzB2Z^S#Vd;LIO#AWs*Um2qp;Z(o_{*{FMU72^u z*;ehmvdkrI6_17x$JT{HPEI-Q%PzfyrXyG5c zFP`C?s6L=-CUby7W!s6>cJ?Ln3$w$MV5sUvz3Rf(-8S6N{3?_tNDA8+omGw14z774ytJGnXJ%M_$`rZqk8z12R0YA-8v>+aPmN$g0rhjcUr^Ksi zgJDY*avc$3`@e0u8`ze$&~HaL5y5X+#21hz2|3Y_8wEd}3nASB*!kJY1w}CHh32<| zTQE@fDyz?)N2N*ON2phK(^mr#61{-RirXVOH>N1vu=mF^lFL7rQU=V5mKsn

    2XV&5{_#dg$aQRyeA#9zWq5Mze*A5RC(Idc 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 Zt61EbyLn< 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 u@1d7 Probably bug; should also handle itype(i+2) + & .or. itype(i+3).eq.21 + & .or. itype(i+4).eq.21) cycle + diff --git a/source/unres/src_MD-M-newcorr/CMakeLists.txt b/source/unres/src_MD-M-newcorr/CMakeLists.txt new file mode 100644 index 0000000..b65d077 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/CMakeLists.txt @@ -0,0 +1,361 @@ +# +# CMake project file for UNRES with MD for single chains +# + +enable_language (Fortran) + +#================================ +# build the xdrf library +#================================ +#add_subdirectory(xdrf) + +#================================ +# Set source file lists +#================================ +set(UNRES_MDM_SRC0 + add.f + arcos.f + banach.f + bank.F + blas.f + bond_move.f + cartder.F + cartprint.f + chainbuild.F + check_bond.f + checkder_p.F + check_sc_distr.f + compare_s1.F + contact.f + convert.f + cored.f + csa.f + dihed_cons.F + diff12.f + distfit.f + djacob.f + econstr_local.F + elecont.f + energy_split-sep.F + entmcm.F + fitsq.f + gauss.f + gen_rand_conf.F + geomout.F + gnmr1.f + indexx.f + initialize_p.F + intcartderiv.F + intcor.f + intlocal.f + int_to_cart.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_jlee.F + minim_mcmf.F + misc.f + moments.f + MP.F + MREMD.F + muca_md.f + newconf.f + parmread.F + permut.F + pinorm.f + printmat.f + q_measure.F + ran.f + randgens.f + rattle.F + readpdb.F + readrtns_CSA.F + refsys.f + regularize.F + rescode.f + rmdd.f + rmsd.F + sc_move.F + shift.F + sort.f + stochfric.F + sumsld.f + surfatom.f + test.F + thread.F + timing.F + together.F + unres.F +) + +if (Fortran_COMPILER_NAME STREQUAL "ifort") + set(UNRES_MDM_SRC0 ${UNRES_MDM_SRC0} prng.f ) +elseif(Fortran_COMPILER_NAME STREQUAL "mpif90") + set(UNRES_MDM_SRC0 ${UNRES_MDM_SRC0} prng.f ) +else() + set(UNRES_MDM_SRC0 ${UNRES_MDM_SRC0} prng_32.F ) +endif (Fortran_COMPILER_NAME STREQUAL "ifort") + +set(UNRES_MDM_SRC2 eigen.f) +set(UNRES_MDM_SRC3 energy_p_new_barrier.F energy_p_new-sep_barrier.F gradient_p.F ) + +set(UNRES_MDM_PP_SRC + bank.F + cartder.F + chainbuild.F + checkder_p.F + compare_s1.F + cored.f + csa.f + dihed_cons.F + diff12.f + econstr_local.F + energy_p_new.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 + intcor.f + initialize_p.F + intcartderiv.F + lagrangian_lesyng.F + matmult.f + mc.F + mcm.F + MD_A-MTS.F + minimize_p.F + minim_jlee.F + minim_mcmf.F + MP.F + MREMD.F + newconf.f + parmread.F + permut.F + q_measure1.F + q_measure3.F + q_measure.F + ran.f + rattle.F + readpdb.F + readrtns_CSA.F + regularize.F + rmdd.f + rmsd.F + sc_move.F + shift.F + stochfric.F + sumsld.f + test.F + thread.F + timing.F + together.F + unres.F + proc_proc.c +) + + +if(NOT Fortran_COMPILER_NAME STREQUAL "ifort") + set(UNRES_MDM_PP_SRC "${UNRES_MDM_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 "-CB -g -ip -w" ) + set(FFLAGS1 "-w -g " ) + set(FFLAGS2 "-w -g -00 ") + set(FFLAGS3 "-CB -g -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 "-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_MDM_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_MDM_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 -DSCCORPDB -DNEWCORR" ) + +#========================================= +# Settings for E0LL2Y force field +#========================================= +elseif(UNRES_MD_FF STREQUAL "E0LL2Y") + # set preprocesor flags + set(CPPFLAGS "PROCOR -DUNRES -DISNAN -DSPLITELE -DLANG0 -DSCCORPDB -DNEWCORR" ) +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") +else (Fortran_COMPILER_NAME STREQUAL "ifort") + # Default preprocessor flags + set(CPPFLAGS "${CPPFLAGS} -DPGI") +endif (Fortran_COMPILER_NAME STREQUAL "ifort") + + +#========================================= +# Add MPI preprocessor flags +#========================================= +if (UNRES_WITH_MPI) + set(CPPFLAGS "${CPPFLAGS} -DMP -DMPI") +endif(UNRES_WITH_MPI) + + +# add 64-bit specific preprocessor flags +if (architektura STREQUAL "64") + set(CPPFLAGS "${CPPFLAGS} -DAMD64") +endif (architektura STREQUAL "64") + + + +# Apply preprocesor flags to *.F files +set_property(SOURCE ${UNRES_MDM_PP_SRC} PROPERTY COMPILE_DEFINITIONS ${CPPFLAGS} ) + +# Apply preprocesor flags to proc_proc.c +set_property(SOURCE proc_proc.c PROPERTY COMPILE_DEFINITIONS "SGI" ) + + +#======================================== +# Setting binary name +#======================================== +if(UNRES_WITH_MPI) + # binary with mpi + set(UNRES_BIN "unres_${Fortran_COMPILER_NAME}_MPICH_${UNRES_FF}.exe") +else(UNRES_WITH_MPI) + # binary without mpi + set(UNRES_BIN "unres_${Fortran_COMPILER_NAME}_single_${UNRES_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-M sources +#========================================= +set(UNRES_MDM_SRCS ${UNRES_MDM_SRC0} ${UNRES_MDM_SRC2} ${UNRES_MDM_SRC3} ${CMAKE_CURRENT_BINARY_DIR}/cinfo.f proc_proc.c ) + +#========================================= +# Build the binary +#========================================= +add_executable(UNRES_BIN-MD-M ${UNRES_MDM_SRCS} ) +set_target_properties(UNRES_BIN-MD-M 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-M ${MPIF_LIBRARIES} ) +endif(UNRES_WITH_MPI) +# link libxdrf.a +#message("UNRES_XDRFLIB=${UNRES_XDRFLIB}") +target_link_libraries( UNRES_BIN-MD-M 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 +#========================================= + +#if(NOT UNRES_WITH_MPI) + +# add_test(NAME UNRES_MD_Ala10 COMMAND sh ${CMAKE_CURRENT_BINARY_DIR}/test_single_ala.sh ) + +#endif(NOT UNRES_WITH_MPI) + diff --git a/source/unres/src_MD-M-newcorr/COMMON.BANK b/source/unres/src_MD-M-newcorr/COMMON.BANK new file mode 100644 index 0000000..5b0fb34 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.BANK @@ -0,0 +1,29 @@ + real*8 dihang,etot,bvar,bene,rene,rvar,avedif,difmin, + & ebmin,ebmax,ebmaxt,cutdif,dij,dihang_in + integer ibank,is,jbank,ibmin,ibmax,nbank,nconf,iuse,nstep,icycle, + & iseed,ntbank,ntbankm,iref,nconf_in,indb,ilastnstep, + & bvar_nss,bvar_ss,bvar_ns,bvar_s, + & nss_in,iss_in,jss_in,nadd + common/varin/dihang_in(mxang,maxres,mxch,mxio),nss_in(mxio), + & iss_in(maxss,mxio),jss_in(maxss,mxio) + common/minvar/dihang(mxang,maxres,mxch,mxio),etot(mxio),rmsn(mxio) + & ,pncn(mxio),nss_out(mxio), + & iss_out(maxss,mxio),jss_out(maxss,mxio) + common/bank/ + * bvar(mxang,maxres,mxch,mxio),bene(mxio),rene(mxio), + * brmsn(mxio),rrmsn(mxio), + * bpncn(mxio),rpncn(mxio), + * rvar(mxang,maxres,mxch,mxio),ibank(mxio),is(mxio), + * avedif,difmin,ebmin,ebmax,ebmaxt,dele,difcut,cutdif, + * rmscut,pnccut, + * jbank(mxio),dij(mxio,mxio),ibmin,ibmax, + * nbank,ntbank,ntbankm,nconf,iuse,nstep,icycle,iseed,iref, + * nconf_in,ilastnstep,nadd + common/bank_disulfid/ bvar_nss(mxio),bvar_ss(2,maxss,mxio), + * bvar_ns(mxio),bvar_s(maxss,mxio) + common/mvstat/ movenx(mxio),movernx(mxio), + & nstatnx(0:mxmv,3),nstatnx_tot(0:mxmv,3),indb(mxio,9), + & parent(3,mxio) + common/send2/isend2(mxio),iff_in(maxres,mxio2), + & dihang_in2(mxang,maxres,mxch,mxio2), + & idata(5,mxio) diff --git a/source/unres/src_MD-M-newcorr/COMMON.BOUNDS b/source/unres/src_MD-M-newcorr/COMMON.BOUNDS new file mode 100644 index 0000000..f3859ae --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.BOUNDS @@ -0,0 +1,2 @@ + double precision phibound(2,maxres) + common /bounds/ phibound diff --git a/source/unres/src_MD-M-newcorr/COMMON.CACHE b/source/unres/src_MD-M-newcorr/COMMON.CACHE new file mode 100644 index 0000000..8cb0cbc --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.CALC b/source/unres/src_MD-M-newcorr/COMMON.CALC new file mode 100644 index 0000000..67b4bb9 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.CHAIN b/source/unres/src_MD-M-newcorr/COMMON.CHAIN new file mode 100644 index 0000000..f343887 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.CHAIN @@ -0,0 +1,16 @@ + integer nres,nsup,nstart_sup,nz_start,nz_end,iz_sc, + & nres0,nstart_seq,chain_length,iprzes,tabperm,nperm + double precision c,dc,dc_old,d_c_work,xloc,xrot,dc_norm,t,r, + & prod,rt,dc_work,cref,crefjlee,chain_rep,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,maxperm), + & crefjlee(3,maxres2+2), + & chain_rep(3,maxres2+2,maxsym), + & nsup,nstart_sup,nstart_seq, + & chain_length,iprzes,tabperm(maxperm,maxsym),nperm + common /from_zscore/ nz_start,nz_end,iz_sc diff --git a/source/unres/src_MD-M-newcorr/COMMON.CONTACTS b/source/unres/src_MD-M-newcorr/COMMON.CONTACTS new file mode 100644 index 0000000..45c578b --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.CONTACTS @@ -0,0 +1,84 @@ +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,gmu,gUb2 + & DUg,DUgder,DtUg2,DtUg2der,Ctobr,Ctobrder,Dtobr2,Dtobr2der, + & gtEug + 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), + & gmu(2,maxres),gUb2(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),gtEUg(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-M-newcorr/COMMON.CONTACTS.moment b/source/unres/src_MD-M-newcorr/COMMON.CONTACTS.moment new file mode 100644 index 0000000..d07a0f0 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.CONTACTS_safe1 b/source/unres/src_MD-M-newcorr/COMMON.CONTACTS_safe1 new file mode 100644 index 0000000..64e0761 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.CONTACTS_safe1 @@ -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 + 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:MaxProcs-1), + & itask_cont_to(0:MaxProcs-1),ntask_cont_from,ntask_cont_to diff --git a/source/unres/src_MD-M-newcorr/COMMON.CONTROL b/source/unres/src_MD-M-newcorr/COMMON.CONTROL new file mode 100644 index 0000000..40346c7 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.CONTROL @@ -0,0 +1,13 @@ + integer modecalc,iscode,indpdb,indback,indphi,iranconf,icheckgrad, + & inprint,i2ndstr,mucadyn,constr_dist,symetr + 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,symetr +C... minim = .true. means DO minimization. +C... energy_dec = .true. means print energy decomposition matrix diff --git a/source/unres/src_MD-M-newcorr/COMMON.CSA b/source/unres/src_MD-M-newcorr/COMMON.CSA new file mode 100644 index 0000000..273a268 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.CSA @@ -0,0 +1,11 @@ + integer ngroup,igroup,ntotgr,numch,irestart,ndiff + double precision diffcut + common/alphaa/ ngroup(mxgr),igroup(3,mxang,mxgr),ntotgr,numch + common/csa_input/cut1,cut2,eglob_csa,estop,jstart,jend, + & n1,n2,n3,n4,n5,n6,n7,n8,n9,n14,n15,n16,n17,n18,n0, + & is1,is2,nseed,ntotal,icmax,nstmax,irestart,nran0,nran1,irr, + & nglob_csa,nmin_csa,ndiff + logical ldih_bias + common/dih_control/rdih_bias,ldih_bias + common/diffcuta/ diffcut + diff --git a/source/unres/src_MD-M-newcorr/COMMON.DBASE b/source/unres/src_MD-M-newcorr/COMMON.DBASE new file mode 100644 index 0000000..4f07780 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.DERIV b/source/unres/src_MD-M-newcorr/COMMON.DERIV new file mode 100644 index 0000000..524d72a --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.DERIV @@ -0,0 +1,35 @@ + 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 + integer nfl,icg + 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-M-newcorr/COMMON.DERIV_safe b/source/unres/src_MD-M-newcorr/COMMON.DERIV_safe new file mode 100644 index 0000000..524d72a --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.DERIV_safe @@ -0,0 +1,35 @@ + 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 + integer nfl,icg + 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-M-newcorr/COMMON.DISTFIT b/source/unres/src_MD-M-newcorr/COMMON.DISTFIT new file mode 100644 index 0000000..044225b --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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) + COMMON /frag/ bvar_frag(mxio,6),hvar_frag(mxio,3), + 1 lvar_frag(mxio,3),svar_frag(mxio,3), + 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-M-newcorr/COMMON.FFIELD b/source/unres/src_MD-M-newcorr/COMMON.FFIELD new file mode 100644 index 0000000..d7d8cde --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.FFIELD @@ -0,0 +1,25 @@ +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,weights(n_ene),temp0, + & scal14,cutoff_corr,delt_corr,r0_corr,ipot,n_ene_comp, + & rescale_mode + common /potentials/ potname(5) + 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------------------------------------------------------------------------ diff --git a/source/unres/src_MD-M-newcorr/COMMON.GEO b/source/unres/src_MD-M-newcorr/COMMON.GEO new file mode 100644 index 0000000..8cfbbde --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.HAIRPIN b/source/unres/src_MD-M-newcorr/COMMON.HAIRPIN new file mode 100644 index 0000000..f103268 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.HEADER b/source/unres/src_MD-M-newcorr/COMMON.HEADER new file mode 100644 index 0000000..7154812 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.HEADER @@ -0,0 +1,2 @@ + character*80 titel + common /header/ titel diff --git a/source/unres/src_MD-M-newcorr/COMMON.INFO b/source/unres/src_MD-M-newcorr/COMMON.INFO new file mode 100644 index 0000000..4f63708 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.INTERACT b/source/unres/src_MD-M-newcorr/COMMON.INTERACT new file mode 100644 index 0000000..83af3fb --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.INTERACT @@ -0,0 +1,31 @@ + double precision aa,bb,augm,aad,bad,app,bpp,ale6,ael3,ael6 + 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 + common /interact/aa(ntyp,ntyp),bb(ntyp,ntyp),augm(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 +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 + common /body/eps(ntyp,ntyp),sigma(0:ntyp1,0:ntyp1), + & sigmaii(ntyp,ntyp), + & rs0(ntyp,ntyp),chi(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(ntyp,2), + & rscp(ntyp,2) +c 12/5/03 modified 09/18/03 Bond stretching parameters. + double precision vbldp0,vbldsc0,akp,aksc,abond0,distchainmax + integer nbondterm + common /stretch/ vbldp0,vbldsc0(maxbondterm,ntyp),akp, + & aksc(maxbondterm,ntyp),abond0(maxbondterm,ntyp), + & distchainmax,nbondterm(ntyp) diff --git a/source/unres/src_MD-M-newcorr/COMMON.IOUNITS b/source/unres/src_MD-M-newcorr/COMMON.IOUNITS new file mode 100644 index 0000000..49b6db3 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.LANGEVIN b/source/unres/src_MD-M-newcorr/COMMON.LANGEVIN new file mode 100644 index 0000000..6a703e2 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.LANGEVIN.lang0 b/source/unres/src_MD-M-newcorr/COMMON.LANGEVIN.lang0 new file mode 100644 index 0000000..354a0c4 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.LANGEVIN.lang0_ b/source/unres/src_MD-M-newcorr/COMMON.LANGEVIN.lang0_ new file mode 100644 index 0000000..26eb500 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.LANGEVIN.lang0_ @@ -0,0 +1,11 @@ + double precision friction(3,0:MAXRES2),stochforc(3,0:MAXRES2), + & fricmat(MAXRES6,MAXRES6),fric_work(MAXRES6), + & stoch_work(MAXRES6), + & fricgam(MAXRES6),fricvec(MAXRES6,MAXRES6) + 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-M-newcorr/COMMON.LOCAL b/source/unres/src_MD-M-newcorr/COMMON.LOCAL new file mode 100644 index 0000000..9f0627b --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.LOCAL @@ -0,0 +1,61 @@ + 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:ntyp),athet(2,-ntyp:ntyp,-1:1,-1:1), + & bthet(2,-ntyp:ntyp,-1:1,-1:1),polthet(0:3,-ntyp:ntyp), + & gthet(3,-ntyp:ntyp),theta0(-ntyp:ntyp),sig0(-ntyp:ntyp), + & sigc0(-ntyp:ntyp) +C Parameters of the side-chain probability distribution + common /sclocal/ dsc(ntyp1),dsc_inv(ntyp1),bsc(maxlob,ntyp), + & censc(3,maxlob,-ntyp:ntyp),gaussc(3,3,maxlob,-ntyp: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:ntyp1),nntheterm + double precision aa0thet(-maxthetyp1:maxthetyp1, + &-maxthetyp1:maxthetyp1,-maxthetyp1:maxthetyp1,2), + & aathet(maxtheterm,-maxthetyp1:maxthetyp1, + &-maxthetyp1:maxthetyp1,-maxthetyp1:maxthetyp1,2), + & bbthet(maxsingle,maxtheterm2,-maxthetyp1:maxthetyp1, + &-maxthetyp1:maxthetyp1,-maxthetyp1:maxthetyp1,2), + & ccthet(maxsingle,maxtheterm2,-maxthetyp1:maxthetyp1, + &-maxthetyp1:maxthetyp1,-maxthetyp1:maxthetyp1,2), + & ddthet(maxsingle,maxtheterm2,-maxthetyp1:maxthetyp1, + &-maxthetyp1:maxthetyp1,-maxthetyp1:maxthetyp1,2), + & eethet(maxsingle,maxtheterm2,-maxthetyp1:maxthetyp1, + &-maxthetyp1:maxthetyp1,-maxthetyp1:maxthetyp1,2), + & ffthet(maxdouble,maxdouble,maxtheterm3,-maxthetyp1:maxthetyp1, + &-maxthetyp1:maxthetyp1, -maxthetyp1:maxthetyp1,2), + & ggthet(maxdouble,maxdouble,maxtheterm3,-maxthetyp1:maxthetyp1, + &-maxthetyp1:maxthetyp1, -maxthetyp1:maxthetyp1,2) + 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,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,itau_start,itau_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,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,itau_start,itau_end, + & 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-M-newcorr/COMMON.LOCMOVE b/source/unres/src_MD-M-newcorr/COMMON.LOCMOVE new file mode 100644 index 0000000..211516d --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.MAP b/source/unres/src_MD-M-newcorr/COMMON.MAP new file mode 100644 index 0000000..77e97e7 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.MAXGRAD b/source/unres/src_MD-M-newcorr/COMMON.MAXGRAD new file mode 100644 index 0000000..285241a --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.MCE b/source/unres/src_MD-M-newcorr/COMMON.MCE new file mode 100644 index 0000000..2d79184 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.MCM b/source/unres/src_MD-M-newcorr/COMMON.MCM new file mode 100644 index 0000000..576f912 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.MD b/source/unres/src_MD-M-newcorr/COMMON.MD new file mode 100644 index 0000000..b17c722 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.MD @@ -0,0 +1,65 @@ + 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 + logical large,print_compon,tbf,rest,reset_moment,reset_vel, + & surfarea,rattle,usampl,mdpdb,RESPA + 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 + 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(ntyp1),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) diff --git a/source/unres/src_MD-M-newcorr/COMMON.MINIM b/source/unres/src_MD-M-newcorr/COMMON.MINIM new file mode 100644 index 0000000..e44f9cd --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.MUCA b/source/unres/src_MD-M-newcorr/COMMON.MUCA new file mode 100644 index 0000000..7529c15 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.NAMES b/source/unres/src_MD-M-newcorr/COMMON.NAMES new file mode 100644 index 0000000..13dde91 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.NAMES @@ -0,0 +1,8 @@ + character*3 restyp + character*1 onelet + common /names/ restyp(-ntyp1:ntyp1), + & onelet(-ntyp1:ntyp1) + 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-M-newcorr/COMMON.REMD b/source/unres/src_MD-M-newcorr/COMMON.REMD new file mode 100644 index 0000000..7109548 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.REMD @@ -0,0 +1,33 @@ + integer nrep,nstex + logical remd_tlist,remd_mlist,mremdsync,restart1file,traj1file + double precision retmin,retmax,remd_t(maxprocs) + 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) + common /remdcommon/ nrep,nstex,retmin,retmax,remd_t,remd_tlist, + & remd_mlist,remd_m,mremdsync,restart1file, + & traj1file,i_sync_step + 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-M-newcorr/COMMON.SBRIDGE b/source/unres/src_MD-M-newcorr/COMMON.SBRIDGE new file mode 100644 index 0000000..4cc80c8 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.SBRIDGE @@ -0,0 +1,12 @@ + double precision ebr,d0cm,akcm,akth,akct,v1ss,v2ss,v3ss + integer ns,nss,nfree,iss + common /sbridge/ ebr,d0cm,akcm,akth,akct,v1ss,v2ss,v3ss, + & ns,nss,nfree,iss(maxss) + double precision dhpb,forcon + integer ihpb,jhpb,nhpb + common /links/ dhpb(maxdim),forcon(maxdim),ihpb(maxdim), + & jhpb(maxdim),nhpb + double precision weidis + common /restraints/ weidis + integer link_start,link_end + common /links_split/ link_start,link_end diff --git a/source/unres/src_MD-M-newcorr/COMMON.SCCOR b/source/unres/src_MD-M-newcorr/COMMON.SCCOR new file mode 100644 index 0000000..7952bd1 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.SCCOR @@ -0,0 +1,18 @@ +cc Parameters of the SCCOR term + double precision v1sccor,v2sccor,vlor1sccor, + & vlor2sccor,vlor3sccor,gloc_sc, + & dcostau,dsintau,dtauangle,dcosomicron, + & domicron,v0sccor + integer nterm_sccor,isccortyp,nsccortyp,nlor_sccor + common/sccor/v1sccor(maxterm_sccor,3,-ntyp:ntyp,-ntyp:ntyp), + & v2sccor(maxterm_sccor,3,-ntyp:ntyp,-ntyp:ntyp), + & v0sccor(maxterm_sccor,-ntyp:ntyp,-ntyp:ntyp), + & nterm_sccor(-ntyp:ntyp,-ntyp:ntyp),isccortyp(-ntyp:ntyp), + & nsccortyp, + & nlor_sccor(-ntyp:ntyp,-ntyp:ntyp), + & vlor1sccor(maxterm_sccor,20,20), + & vlor2sccor(maxterm_sccor,20,20), + & vlor3sccor(maxterm_sccor,20,20),gloc_sc(3,0:maxres2,10), + & 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) diff --git a/source/unres/src_MD-M-newcorr/COMMON.SCROT b/source/unres/src_MD-M-newcorr/COMMON.SCROT new file mode 100644 index 0000000..a352775 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.SCROT @@ -0,0 +1,3 @@ +C Parameters of the SC rotamers (local) term + double precision sc_parmin + common/scrot/sc_parmin(maxsccoef,ntyp) diff --git a/source/unres/src_MD-M-newcorr/COMMON.SETUP b/source/unres/src_MD-M-newcorr/COMMON.SETUP new file mode 100644 index 0000000..5039116 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.SPLITELE b/source/unres/src_MD-M-newcorr/COMMON.SPLITELE new file mode 100644 index 0000000..a2f0447 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.SPLITELE @@ -0,0 +1,2 @@ + double precision r_cut,rlamb + common /splitele/ r_cut,rlamb diff --git a/source/unres/src_MD-M-newcorr/COMMON.THREAD b/source/unres/src_MD-M-newcorr/COMMON.THREAD new file mode 100644 index 0000000..5c814cc --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.TIME1 b/source/unres/src_MD-M-newcorr/COMMON.TIME1 new file mode 100644 index 0000000..d6203a6 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.TORCNSTR b/source/unres/src_MD-M-newcorr/COMMON.TORCNSTR new file mode 100644 index 0000000..e4af17c --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/COMMON.TORSION b/source/unres/src_MD-M-newcorr/COMMON.TORSION new file mode 100644 index 0000000..3f1b981 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.TORSION @@ -0,0 +1,41 @@ +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,-maxtor:maxtor,2), + & v1(maxterm,-maxtor:maxtor,-maxtor:maxtor,2), + & v2(maxterm,-maxtor:maxtor,-maxtor:maxtor,2), + & vlor1(maxlor,-maxtor:maxtor,-maxtor:maxtor), + & vlor2(maxlor,maxtor,maxtor),vlor3(maxlor,maxtor,maxtor), + & itortyp(-ntyp1:ntyp1),ntortyp, + & nterm(-maxtor:maxtor,-maxtor:maxtor,2), + & nlor(-maxtor:maxtor,-maxtor:maxtor,2) + & ,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:maxtor,-maxtor:maxtor,2), + &v1s(2,maxtermd_1,-maxtor:maxtor,-maxtor:maxtor,-maxtor:maxtor,2), + &v2c(maxtermd_2,maxtermd_2,-maxtor:maxtor,-maxtor:maxtor, + & -maxtor:maxtor,2), + &v2s(maxtermd_2,maxtermd_2,-maxtor:maxtor,-maxtor:maxtor, + & -maxtor:maxtor,2), + & ntermd_1(-maxtor:maxtor,-maxtor:maxtor,-maxtor:maxtor,2), + & ntermd_2(-maxtor:maxtor,-maxtor:maxtor,-maxtor:maxtor,2) +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,b1tilde, + &bnew1,bnew2,eenew,gtb1,gtb2,eeold,gtee + integer nloctyp + common/fourier/ b1(2,maxres),b2(2,maxres), + & bnew1(3,2,-maxtor:maxtor),bnew2(3,2,-maxtor:maxtor), + & cc(2,2,-maxtor:maxtor), + & dd(2,2,-maxtor:maxtor),eeold(2,2,-maxtor:maxtor), + & eenew(2,-maxtor:maxtor), + & ee(2,2,maxres), + & ctilde(2,2,-maxtor:maxtor), + & dtilde(2,2,-maxtor:maxtor),b1tilde(2,maxres), + & b2tilde(2,maxres), + & gtb1(2,maxres),gtb2(2,maxres),gtEE(2,2,maxres), + & nloctyp + diff --git a/source/unres/src_MD-M-newcorr/COMMON.VAR b/source/unres/src_MD-M-newcorr/COMMON.VAR new file mode 100644 index 0000000..1ab0a16 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/COMMON.VAR @@ -0,0 +1,22 @@ +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, + & tauangle,omicron, + & xxtab,yytab,zztab,xxref,yyref,zzref + common /var/ theta(maxres),phi(maxres),alph(maxres),omeg(maxres), + & vbld(2*maxres),thetaref(maxres),phiref(maxres), + & costtab(maxres), sinttab(maxres), cost2tab(maxres), + & omicron(2,maxres),tauangle(3,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-M-newcorr/COMMON.VECTORS b/source/unres/src_MD-M-newcorr/COMMON.VECTORS new file mode 100644 index 0000000..d880c24 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/DIMENSIONS b/source/unres/src_MD-M-newcorr/DIMENSIONS new file mode 100644 index 0000000..6815ae9 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/DIMENSIONS @@ -0,0 +1,141 @@ +******************************************************************************** +* 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=1200) +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 symetric chains + integer maxsym + parameter (maxsym=50) + integer maxperm + parameter (maxperm=120) +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/4) +c parameter (maxconts=50) +C Number of AA types (at present only natural AA's will be handled + integer ntyp,ntyp1 + parameter (ntyp=24,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=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 + 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=2) +C Maximum number of n7 generated conformations + integer mxio2 + parameter (mxio2=2) +C Maximum number of moves (n1-n8) + integer mxmv + parameter (mxmv=18) +C Maximum number of seed + integer max_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) +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) diff --git a/source/unres/src_MD-M-newcorr/DIMENSIONS.2100 b/source/unres/src_MD-M-newcorr/DIMENSIONS.2100 new file mode 100644 index 0000000..ea1d287 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/DIMENSIONS.4100 b/source/unres/src_MD-M-newcorr/DIMENSIONS.4100 new file mode 100644 index 0000000..a4558b9 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/DIMENSIONS_safe1 b/source/unres/src_MD-M-newcorr/DIMENSIONS_safe1 new file mode 100644 index 0000000..7e72823 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/DIMENSIONS_safe1 @@ -0,0 +1,135 @@ +******************************************************************************** +* 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 + parameter (max_fg_procs=maxprocs) +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=3) +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=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 + 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=2) +C Maximum number of n7 generated conformations + integer mxio2 + parameter (mxio2=2) +C Maximum number of moves (n1-n8) + integer mxmv + parameter (mxmv=18) +C Maximum number of seed + integer max_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) +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) diff --git a/source/unres/src_MD-M-newcorr/MD.F b/source/unres/src_MD-M-newcorr/MD.F new file mode 100644 index 0000000..b740de7 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/MD.F @@ -0,0 +1,2565 @@ + 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" +#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' + include 'COMMON.HAIRPIN' + 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 + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif +#ifndef LANG0 + 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 +#endif + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo + 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 + if (ovrtim()) goto 100 + 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 + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif +#ifndef LANG0 + 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 +#endif + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo + 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/(dimen*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 + call brown_step(itime) + 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 .and. itype(i).ne.ntyp1) 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 + call check_cartgrad + if (mod(itime,ntwx).eq.0) then + write (tytul,'("time",f8.2)') totT + if(mdpdb) then + call check_cartgrad + write(iout,*) "kupa gowna" + call hairpin(.true.,nharp,iharp) + call secondary2(.true.) + 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 + 100 continue +#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 ' + return + end +c------------------------------------------------------------------------------- + subroutine brown_step(itime) +c------------------------------------------------ +c Perform a single Euler integration step of Brownian dynamics +c------------------------------------------------ + 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 zapas(MAXRES6) + integer ilen,rstcount + external ilen + double precision stochforcvec(MAXRES6) + double precision Bmat(MAXRES6,MAXRES2),Cmat(maxres2,maxres2), + & Cinv(maxres2,maxres2),GBmat(MAXRES6,MAXRES2), + & Tmat(MAXRES6,MAXRES2),Pmat(maxres6,maxres6),Td(maxres6), + & ppvec(maxres2) + common /stochcalc/ stochforcvec + common /gucio/ cm + integer itime + logical lprn /.false./,lprn1 /.false./ + integer maxiter /5/ + double precision difftol /1.0d-5/ + nbond=nct-nnt + do i=nnt,nct + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) nbond=nbond+1 + enddo +c + if (lprn1) then + write (iout,*) "Generalized inverse of fricmat" + call matout(dimen,dimen,MAXRES6,MAXRES6,fricmat) + endif + do i=1,dimen + do j=1,nbond + Bmat(i,j)=0.0d0 + enddo + enddo + ind=3 + ind1=0 + do i=nnt,nct-1 + ind1=ind1+1 + do j=1,3 + Bmat(ind+j,ind1)=dC_norm(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then + ind1=ind1+1 + do j=1,3 + Bmat(ind+j,ind1)=dC_norm(j,i+nres) + enddo + ind=ind+3 + endif + enddo + if (lprn1) then + write (iout,*) "Matrix Bmat" + call MATOUT(nbond,dimen,MAXRES6,MAXRES2,Bmat) + endif + do i=1,dimen + do j=1,nbond + GBmat(i,j)=0.0d0 + do k=1,dimen + GBmat(i,j)=GBmat(i,j)+fricmat(i,k)*Bmat(k,j) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix GBmat" + call MATOUT(nbond,dimen,MAXRES6,MAXRES2,Gbmat) + endif + do i=1,nbond + do j=1,nbond + Cmat(i,j)=0.0d0 + do k=1,dimen + Cmat(i,j)=Cmat(i,j)+Bmat(k,i)*GBmat(k,j) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix Cmat" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat) + endif + call matinvert(nbond,MAXRES2,Cmat,Cinv) + if (lprn1) then + write (iout,*) "Matrix Cinv" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cinv) + endif + do i=1,dimen + do j=1,nbond + Tmat(i,j)=0.0d0 + do k=1,nbond + Tmat(i,j)=Tmat(i,j)+GBmat(i,k)*Cinv(k,j) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix Tmat" + call MATOUT(nbond,dimen,MAXRES6,MAXRES2,Tmat) + endif + do i=1,dimen + do j=1,dimen + if (i.eq.j) then + Pmat(i,j)=1.0d0 + else + Pmat(i,j)=0.0d0 + endif + do k=1,nbond + Pmat(i,j)=Pmat(i,j)-Tmat(i,k)*Bmat(j,k) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix Pmat" + call MATOUT(dimen,dimen,MAXRES6,MAXRES6,Pmat) + endif + do i=1,dimen + Td(i)=0.0d0 + ind=0 + do k=nnt,nct-1 + ind=ind+1 + Td(i)=Td(i)+vbl*Tmat(i,ind) + enddo + do k=nnt,nct + if (itype(k).ne.10 .and. itype(i).ne.ntyp1) then + ind=ind+1 + Td(i)=Td(i)+vbldsc0(1,itype(k))*Tmat(i,ind) + endif + enddo + enddo + if (lprn1) then + write (iout,*) "Vector Td" + do i=1,dimen + write (iout,'(i5,f10.5)') i,Td(i) + enddo + endif + call stochastic_force(stochforcvec) + if (lprn) then + write (iout,*) "stochforcvec" + do i=1,dimen + write (iout,*) i,stochforcvec(i) + enddo + endif + do j=1,3 + zapas(j)=-gcart(j,0)+stochforcvec(j) + d_t_work(j)=d_t(j,0) + dC_work(j)=dC_old(j,0) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + ind=ind+1 + zapas(ind)=-gcart(j,i)+stochforcvec(ind) + dC_work(ind)=dC_old(j,i) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then + do j=1,3 + ind=ind+1 + zapas(ind)=-gxcart(j,i)+stochforcvec(ind) + dC_work(ind)=dC_old(j,i+nres) + enddo + endif + enddo + + if (lprn) then + write (iout,*) "Initial d_t_work" + do i=1,dimen + write (iout,*) i,d_t_work(i) + enddo + endif + + do i=1,dimen + d_t_work(i)=0.0d0 + do j=1,dimen + d_t_work(i)=d_t_work(i)+fricmat(i,j)*zapas(j) + enddo + enddo + + do i=1,dimen + zapas(i)=Td(i) + do j=1,dimen + zapas(i)=zapas(i)+Pmat(i,j)*(dC_work(j)+d_t_work(j)*d_time) + enddo + enddo + if (lprn1) then + write (iout,*) "Final d_t_work and zapas" + do i=1,dimen + write (iout,*) i,d_t_work(i),zapas(i) + enddo + endif + + do j=1,3 + d_t(j,0)=d_t_work(j) + dc(j,0)=zapas(j) + dc_work(j)=dc(j,0) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=d_t_work(i) + dc(j,i)=zapas(ind+j) + dc_work(ind+j)=dc(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + do j=1,3 + d_t(j,i+nres)=d_t_work(ind+j) + dc(j,i+nres)=zapas(ind+j) + dc_work(ind+j)=dc(j,i+nres) + enddo + ind=ind+3 + enddo + if (lprn) then + call chainbuild_cart + write (iout,*) "Before correction for rotational lengthening" + write (iout,*) "New coordinates", + & " and differences between actual and standard bond lengths" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + xx=vbld(i+1)-vbl + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i),j=1,3),xx + enddo + do i=nnt,nct + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then + ind=ind+1 + xx=vbld(i+nres)-vbldsc0(1,itype(i)) + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i+nres),j=1,3),xx + endif + enddo + endif +c Second correction (rotational lengthening) +c do iter=1,maxiter + diffmax=0.0d0 + ind=0 + do i=nnt,nct-1 + ind=ind+1 + blen2 = scalar(dc(1,i),dc(1,i)) + ppvec(ind)=2*vbl**2-blen2 + diffbond=dabs(vbl-dsqrt(blen2)) + if (diffbond.gt.diffmax) diffmax=diffbond + if (ppvec(ind).gt.0.0d0) then + ppvec(ind)=dsqrt(ppvec(ind)) + else + ppvec(ind)=0.0d0 + endif + if (lprn) then + write (iout,'(i5,3f10.5)') ind,diffbond,ppvec(ind) + endif + enddo + do i=nnt,nct + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then + ind=ind+1 + blen2 = scalar(dc(1,i+nres),dc(1,i+nres)) + ppvec(ind)=2*vbldsc0(1,itype(i))**2-blen2 + diffbond=dabs(vbldsc0(1,itype(i))-dsqrt(blen2)) + if (diffbond.gt.diffmax) diffmax=diffbond + if (ppvec(ind).gt.0.0d0) then + ppvec(ind)=dsqrt(ppvec(ind)) + else + ppvec(ind)=0.0d0 + endif + if (lprn) then + write (iout,'(i5,3f10.5)') ind,diffbond,ppvec(ind) + endif + endif + enddo + if (lprn) write (iout,*) "iter",iter," diffmax",diffmax + if (diffmax.lt.difftol) goto 10 + do i=1,dimen + Td(i)=0.0d0 + do j=1,nbond + Td(i)=Td(i)+ppvec(j)*Tmat(i,j) + enddo + enddo + do i=1,dimen + zapas(i)=Td(i) + do j=1,dimen + zapas(i)=zapas(i)+Pmat(i,j)*dc_work(j) + enddo + enddo + do j=1,3 + dc(j,0)=zapas(j) + dc_work(j)=zapas(j) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + dc(j,i)=zapas(ind+j) + dc_work(ind+j)=zapas(ind+j) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then + do j=1,3 + dc(j,i+nres)=zapas(ind+j) + dc_work(ind+j)=zapas(ind+j) + enddo + ind=ind+3 + endif + enddo +c Building the chain from the newly calculated coordinates + call chainbuild_cart + 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,'(a)') "Potential forces" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(-gcart(j,i),j=1,3), + & (-gxcart(j,i),j=1,3) + enddo + write (iout,'(a)') "Stochastic forces" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(stochforc(j,i),j=1,3), + & (stochforc(j,i+nres),j=1,3) + enddo + write (iout,'(a)') "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 + endif + endif + if (lprn) then + write (iout,*) "After correction for rotational lengthening" + write (iout,*) "New coordinates", + & " and differences between actual and standard bond lengths" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + xx=vbld(i+1)-vbl + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i),j=1,3),xx + enddo + do i=nnt,nct + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then + ind=ind+1 + xx=vbld(i+nres)-vbldsc0(1,itype(i)) + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i+nres),j=1,3),xx + endif + enddo + endif +c ENDDO +c write (iout,*) "Too many attempts at correcting the bonds" +c stop + 10 continue +#ifdef MPI + tt0 =MPI_Wtime() +#else + tt0 = tcpu() +#endif +c Calculate energy and forces + call zerograd + call etotal(potEcomp) + potE=potEcomp(0)-potEcomp(20) + call cartgrad + totT=totT+d_time +c Calculate the kinetic and total energy and the kinetic temperature + call kinetic(EK) +#ifdef MPI + t_enegrad=t_enegrad+MPI_Wtime()-tt0 +#else + t_enegrad=t_enegrad+tcpu()-tt0 +#endif + totE=EK+potE + kinetic_T=2.0d0/(dimen*Rb)*EK + 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.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 +c + scale=.true. + icount_scale=0 + if (lang.eq.1) then + call sddir_precalc + else if (lang.eq.2 .or. lang.eq.3) then + call stochastic_force(stochforcvec) + 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 + call sd_verlet1 + else if (lang.eq.3) then + call sd_verlet1_ciccotti + else if (lang.eq.1) then + call sddir_verlet1 + else + 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) + 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 + call predict_edrift(epdrift) + if (amax.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 +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) +#ifndef LANG0 + do i=1,dimen + do j=1,dimen + 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 +#endif + 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. +#ifndef LANG0 + do i=1,dimen + do j=1,dimen + 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 + endif + fac_time=1.0d0/dsqrt(fac_time) + do i=1,dimen + stochforcvec(i)=fac_time*stochforcvec(i) + enddo + else if (lang.eq.1) then +c Rescale the accelerations due to stochastic forces + fac_time=1.0d0/dsqrt(fac_time) + do i=1,dimen + 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 + call sd_verlet2 + else if (lang.eq.3) then + call sd_verlet2_ciccotti + else if (lang.eq.1) then + call sddir_verlet2 + else + call verlet2 + endif + if (rattle) call rattle2 + totT=totT+d_time + if (d_time.ne.d_time0) then + d_time=d_time0 + 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 +#ifndef LANG0 + do i=1,dimen + do j=1,dimen + 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 + 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/(dimen*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) + 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 .and. large) then + 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 + 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' +#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 energia_short(0:n_ene), + & energia_long(0:n_ene) + double precision cm(3),L(3),vcm(3),incr(3) + integer ilen,count,rstcount + external ilen + character*50 tytul + integer maxcount_scale /10/ + common /gucio/ cm + double precision stochforcvec(MAXRES6) + common /stochcalc/ stochforcvec + integer itime + logical scale + common /cipiszcze/ itt + itt=itime + large=(itime.gt.14600 .and. itime.lt.14700) + 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" + 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" + call RESPA_vel + 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 + call zerograd + call etotal_short(energia_short) + if (large) write (iout,*) "energia_short",energia_short(0) + call cartgrad + call lagrangian +#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) + d_t_old(j,i)=d_t(j,i) + d_a_old(j,i)=d_a(j,i) + enddo + enddo + d_time0=d_time +c Split the time step + d_time=d_time/ntime_split +c Perform the short-range RESPSA 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 + call stochastic_force(stochforcvec) + endif +c First step of the velocity Verlet algorithm + if (lang.eq.2) then + call sd_verlet1 + else if (lang.eq.3) then + call sd_verlet1_ciccotti + else if (lang.eq.1) then + call sddir_verlet1 + else + 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 pdbout(0.0d0,"cipiszcze",iout) +c call cartprint + call intout + 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_short(energia_short) + if (large) write (iout,*) "energia_short",energia_short(0) + 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 Second step of the velocity Verlet algorithm + if (lang.eq.2) then + call sd_verlet2 + else if (lang.eq.3) then + call sd_verlet2_ciccotti + else if (lang.eq.1) then + call sddir_verlet2 + else + call verlet2 + endif + if (rattle) call rattle2 +c Backup the coordinates, velocities, and accelerations + 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 + enddo + enddo +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) + if (large) write (iout,*) "energia_long",energia_long(0) + 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,*) "Cartesian and internal coordinates: step 2" +c call cartprint + call pdbout(0.0d0,"cipiszcze",iout) + call intout + 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 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" + call RESPA_vel +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/(dimen*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 + 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 .and. itype(i).ne.ntyp1) 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 + + 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 .and. itype(i).ne.ntyp1) 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 + 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 .and. itype(i).ne.ntyp1) 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' + 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 +c +c Compute friction and stochastic forces +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 +#ifdef OLD_GINV + do i=1,dimen + d_af_work(i)=0.0d0 + d_as_work(i)=0.0d0 + do j=1,dimen + d_af_work(i)=d_af_work(i)+Ginv(i,j)*fric_work(j) + d_as_work(i)=d_as_work(i)+Ginv(i,j)*stochforcvec(j) + enddo + enddo +#else + call ginv_mult(fric_work, d_af_work) + call ginv_mult(stochforcvec, d_as_work) +#endif + 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 .and. itype(i).ne.ntyp1) 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 +#ifdef OLD_GINV + do i=1,dimen +c d_af_work(i)=0.0d0 + d_as_work1(i)=0.0d0 + do j=1,dimen +c d_af_work(i)=d_af_work(i)+Ginv(i,j)*fric_work(j) + d_as_work1(i)=d_as_work1(i)+Ginv(i,j)*stochforcvec(j) + enddo + enddo +#else + call ginv_mult(stochforcvec, d_as_work1) +#endif + +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 .and. itype(i).ne.ntyp1) 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) + do j=1,3 + aux(j)=d_a(j,0)-d_a_old(j,0) + enddo + amax=0.0d0 + do i=nnt,nct +c Backbone + if (i.lt.nct) then + do j=1,3 + accel(j)=aux(j)+0.5d0*(d_a(j,i)-d_a_old(j,i)) + if (dabs(accel(j)).gt.amax) amax=dabs(accel(j)) + enddo + endif +c Side chains + do j=1,3 + accel(j)=aux(j) + enddo + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then + do j=1,3 + accel(j)=accel(j)+d_a(j,i+nres)-d_a_old(j,i+nres) + enddo + endif + do j=1,3 + if (dabs(accel(j)).gt.amax) amax=dabs(accel(j)) + enddo + do j=1,3 + 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 .and. itype(i).ne.ntyp1) 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/(dimen*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 .and. itype(i).ne.ntyp1) 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' + include 'COMMON.SETUP' + character*16 form +#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.REMD' + real*8 energia_long(0:n_ene), + & energia_short(0:n_ene),vcm(3),incr(3) + 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(iabs(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 + call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM, + & IERR) + write (*,*) me," After broadcast: file_exist",file_exist +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 backbone velocities" + do i=nnt,nct-1 + write(iout,*) (d_t(j,i),j=1,3) + enddo + write(iout,*) "Initial side-chain velocities" + do i=nnt,nct + write(iout,*) (d_t(j,i+nres),j=1,3) + enddo +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) + 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(EK) + endif + kinetic_T=2.0d0/(dimen*Rb)*EK + if(me.eq.king.or..not.out1file)then + call cartprint + call intout + endif + call zerograd + call etotal(potEcomp) + potE=potEcomp(0) + call cartgrad + call lagrangian + call max_accel + if (amax*d_time .gt. dvmax) d_time=d_time*dvmax/amax + if(me.eq.king.or..not.out1file)then + write(iout,*) "Potential energy and its components" + 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,*) "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" + 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 + 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 + 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_long(energia_long) + if (large) write (iout,*) "energia_long",energia_long(0) + call cartgrad + call lagrangian +#ifdef MPI + t_enegrad=t_enegrad+MPI_Wtime()-tt0 +#else + t_enegrad=t_enegrad+tcpu()-tt0 +#endif +c call etotal_short(energia_short) +c write (iout,*) "energia_long",energia_long(0), +c & " energia_short",energia_short(0), +c & " total",energia_long(0)+energia_short(0) + 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" + xv=0.0d0 + do i=1,dimen + sigv=dsqrt((Rb*t_bath)/geigen(i)) + lowb=-5*sigv + highb=5*sigv + d_t_work_new(i)=anorm_distr(xv,sigv,lowb,highb) + enddo +c Ek1=0.0d0 +c do i=1,dimen +c Ek1=Ek1+0.5d0*geigen(i)*d_t_work_new(i)**2 +c enddo +c Transform velocities to UNRES coordinate space + do i=1,dimen + d_t_work(i)=0.0d0 + do j=1,dimen + d_t_work(i)=d_t_work(i)+Gvec(i,j)*d_t_work_new(j) + 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 + if (itype(i).ne.ntyp1 .and. itype(i+1).ne.ntyp1) then + d_t(j,i)=d_t_work(ind) + else + d_t(j,i)=0.0d0 + endif + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) 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/(dimen*Rb)*EK,2.0d0/(dimen*Rb)*EK1 + return + end +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,maxres6,mt3,mt2,pfric_vec,pfric_mat) + call eigtransf(dimen,maxres6,mt3,mt2,vfric_vec,vfric_mat) + call eigtransf(dimen,maxres6,mt3,mt2,afric_vec,afric_mat) + call eigtransf(dimen,maxres6,mt3,mt1,prand_vec,prand_mat) + call eigtransf(dimen,maxres6,mt3,mt1,vrand_vec1,vrand_mat1) + call eigtransf(dimen,maxres6,mt3,mt1,vrand_vec2,vrand_mat2) +#endif +c call eigtransf1(dimen,maxres6,mt3mt2,pfric_vec,pfric_mat) +c call eigtransf1(dimen,maxres6,mt3mt2,vfric_vec,vfric_mat) +c call eigtransf1(dimen,maxres6,mt3mt2,afric_vec,afric_mat) +c call eigtransf1(dimen,maxres6,mt3mt1,prand_vec,prand_mat) +c call eigtransf1(dimen,maxres6,mt3mt1,vrand_vec1,vrand_mat1) +c call eigtransf1(dimen,maxres6,mt3mt1,vrand_vec2,vrand_mat2) +#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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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,maxres6,mt3,mt2,pfric_vec,pfric_mat) + call eigtransf(dimen,maxres6,mt3,mt2,vfric_vec,vfric_mat) + call eigtransf(dimen,maxres6,mt3,mt2,afric_vec,afric_mat) + call eigtransf(dimen,maxres6,mt3,mt1,prand_vec,prand_mat) + call eigtransf(dimen,maxres6,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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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 diff --git a/source/unres/src_MD-M-newcorr/MD_A-MTS.F b/source/unres/src_MD-M-newcorr/MD_A-MTS.F new file mode 100644 index 0000000..e0c1cfb --- /dev/null +++ b/source/unres/src_MD-M-newcorr/MD_A-MTS.F @@ -0,0 +1,2446 @@ + 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' + include 'COMMON.HAIRPIN' + 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 + logical ovrtim +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,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 +#ifdef MPI + t_langsetup=MPI_Wtime()-tt0 + tt0=MPI_Wtime() +#else + t_langsetup=tcpu()-tt0 + tt0=tcpu() +#endif + do itime=1,n_timestep + if (ovrtim()) exit + if (large.and. mod(itime,ntwe).eq.0) + & write (iout,*) "itime",itime + 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 + 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 .and. itype(i).ne.ntyp1) 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 check_ecartint + call hairpin(.true.,nharp,iharp) + call secondary2(.true.) + 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 +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 + 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) + if (large.and. mod(itime,ntwe).eq.0) + & call enerprint(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)-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,dimen + do j=1,dimen + 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,dimen + do j=1,dimen + 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,dimen + 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,dimen + 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 + call verlet2 + 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,dimen + do j=1,dimen + 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 + 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) + 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 .and. large) then + 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 + 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) + logical PRINT_AMTS_MSG /.false./ + integer ilen,count,rstcount + external ilen + character*50 tytul + integer maxcount_scale /10/ + common /gucio/ cm + double precision stochforcvec(MAXRES6) + common /stochcalc/ stochforcvec + integer itime + logical scale + 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" + call RESPA_vel + 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) +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) + 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 + 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) + if (large.and. mod(itime,ntwe).eq.0) + & call enerprint(energia_short) +#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 + if (PRINT_AMTS_MSG) then + write (iout,*) "acceleration/energy drift too large",amax, + & epdrift," split increased to ",ntime_split," itime",itime, + & " itsplit",itsplit + endif + 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 + call verlet2 + endif + if (rattle) call rattle2 +c Backup the coordinates, velocities, and accelerations + 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 + 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) + if (large.and. mod(itime,ntwe).eq.0) + & call enerprint(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 +#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" + call RESPA_vel +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 + 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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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 + time00=MPI_Wtime() + call friction_force + time_fric=time_fric+MPI_Wtime()-time00 + time00=MPI_Wtime() + call stochastic_force(stochforcvec) + time_stoch=time_stoch+MPI_Wtime()-time00 +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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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)) +c write (iout,*) i,dacc + 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 .and. itype(i).ne.ntyp1) 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)) +c write (iout,*) "side-chain",i,dacc + 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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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) + 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(iabs(itype(i))) + & *dsqrt(gamsc(iabs(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 + call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM, + & IERR) + write (*,*) me," After broadcast: file_exist",file_exist +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 +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) + 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) + if (large) call enerprint(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) + 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) + if (large) call enerprint(potEcomp) +#ifdef TIMING_ENE +#ifdef MPI + t_eshort=t_eshort+MPI_Wtime()-tt0 +#else + t_eshort=t_eshort+tcpu()-tt0 +#endif +#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) + if (large) call enerprint(potEcomp) +#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) + 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 +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 + do i=nnt,nct + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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 diff --git a/source/unres/src_MD-M-newcorr/MD_A-MTS.F_safe b/source/unres/src_MD-M-newcorr/MD_A-MTS.F_safe new file mode 100644 index 0000000..db8058f --- /dev/null +++ b/source/unres/src_MD-M-newcorr/MD_A-MTS.F_safe @@ -0,0 +1,2327 @@ + 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,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 +#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,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 + 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 ' + 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 +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 + 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) + 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,dimen + do j=1,dimen + 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,dimen + do j=1,dimen + 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,dimen + 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,dimen + 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 + call verlet2 + 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,dimen + do j=1,dimen + 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 + 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) + 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 .and. large) then + 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 + 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 + double precision stochforcvec(MAXRES6) + common /stochcalc/ stochforcvec + integer itime + logical scale + 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" + call RESPA_vel + 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 + call zerograd + call etotal_short(energia_short) + call cartgrad + call lagrangian + 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) + 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 + 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) + call cartgrad +c Get the new accelerations + call lagrangian + 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 + call verlet2 + endif + if (rattle) call rattle2 +c Backup the coordinates, velocities, and accelerations + 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 + 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) + 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" + call RESPA_vel +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 + 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' + 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 +c +c Compute friction and stochastic forces +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(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) + 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 + call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM, + & IERR) + write (*,*) me," After broadcast: file_exist",file_exist +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 backbone velocities" + do i=nnt,nct-1 + write(iout,*) (d_t(j,i),j=1,3) + enddo + write(iout,*) "Initial side-chain velocities" + do i=nnt,nct + write(iout,*) (d_t(j,i+nres),j=1,3) + enddo +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) + 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(EK) + endif + kinetic_T=2.0d0/(dimen3*Rb)*EK + if(me.eq.king.or..not.out1file)then + call cartprint + call intout + endif + call zerograd + call etotal(potEcomp) + potE=potEcomp(0) + 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" + 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,*) "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" + 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_long(energia_long) + 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 + call cartgrad + call lagrangian +#ifdef MPI + t_enegrad=t_enegrad+MPI_Wtime()-tt0 +#else + t_enegrad=t_enegrad+tcpu()-tt0 +#endif +c call etotal_short(energia_short) +c write (iout,*) "energia_long",energia_long(0), +c & " energia_short",energia_short(0), +c & " total",energia_long(0)+energia_short(0) + 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) + 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,*) "ii",ii," d_t_work_new",d_t_work_new(ii) + enddo + enddo +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 + 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 diff --git a/source/unres/src_MD-M-newcorr/MD_A-MTS.F_safe1 b/source/unres/src_MD-M-newcorr/MD_A-MTS.F_safe1 new file mode 100644 index 0000000..faa149f --- /dev/null +++ b/source/unres/src_MD-M-newcorr/MD_A-MTS.F_safe1 @@ -0,0 +1,2356 @@ + 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,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 +#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,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 + 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 ' + 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 +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 + 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) + 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,dimen + do j=1,dimen + 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,dimen + do j=1,dimen + 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,dimen + 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,dimen + 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 + call verlet2 + 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,dimen + do j=1,dimen + 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 + 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) + 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 .and. large) then + 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 + 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 + double precision stochforcvec(MAXRES6) + common /stochcalc/ stochforcvec + integer itime + logical scale + 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" + call RESPA_vel + 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) +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) + 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 + 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) + 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 + call verlet2 + endif + if (rattle) call rattle2 +c Backup the coordinates, velocities, and accelerations + 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 + 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) + 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" + call RESPA_vel +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 + 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' + 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 +c +c Compute friction and stochastic forces +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(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) + 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 + call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM, + & IERR) + write (*,*) me," After broadcast: file_exist",file_exist +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 backbone velocities" + do i=nnt,nct-1 + write(iout,*) (d_t(j,i),j=1,3) + enddo + write(iout,*) "Initial side-chain velocities" + do i=nnt,nct + write(iout,*) (d_t(j,i+nres),j=1,3) + enddo +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) + 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(EK) + endif + kinetic_T=2.0d0/(dimen3*Rb)*EK + if(me.eq.king.or..not.out1file)then + call cartprint + call intout + endif + call zerograd + call etotal(potEcomp) + potE=potEcomp(0) + 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" + 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,*) "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" + 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) + 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 + call zerograd + call etotal_long(energia_long) + 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) + 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,*) "ii",ii," d_t_work_new",d_t_work_new(ii) + enddo + enddo +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 + 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 diff --git a/source/unres/src_MD-M-newcorr/MP.F b/source/unres/src_MD-M-newcorr/MP.F new file mode 100644 index 0000000..37bf5b9 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/MP.F @@ -0,0 +1,518 @@ +#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 (lprn) then + 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 + 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() +c 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 +c 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-M-newcorr/MREMD.F b/source/unres/src_MD-M-newcorr/MREMD.F new file mode 100644 index 0000000..d55a95b --- /dev/null +++ b/source/unres/src_MD-M-newcorr/MREMD.F @@ -0,0 +1,1864 @@ + 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' + include 'COMMON.HAIRPIN' + 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) + 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 + +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 + 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(i),i=0,nodes-1) + write(iout,*) (i2set(i),i=0,nodes-1) + 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) 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) then + iset=i2set(me) + 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 + 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 + 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(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 hairpin(.true.,nharp,iharp) + call secondary2(.true.) + 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) 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) 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. + 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-time00 + 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 + call flush(iout) + endif + if (synflag) then +c Update the time safety limiy + if (time001-time00.gt.safety) then + safety=time001-time00+600 + 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. + + 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 + 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 + 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 + 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 + 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 +c------------------------------------- + IF(.not.usampl) THEN + write (iout,*) "Enter exchnge, remd_m",remd_m(1), + & " nodes",nodes + call flush(iout) + write (iout,*) "remd_m(1)",remd_m(1) + do irr=1,remd_m(1) + i=ifirst(iran_num(1,remd_m(1))) + write (iout,*) "i",i + call flush(iout) + + do ii=1,nodes-1 + + write (iout,*) "i",i," nupa(0,i)",int(nupa(0,i)) + 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 (real(ene_i_i).ne.real(remd_ene(0,i))) 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 (real(ene_iex_iex).ne.real(remd_ene(0,iex))) 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) + ELSE + 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 + + i_dir=iran_num(1,3) +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 + 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 + + + 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 + + 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) + & 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 + 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 + +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-time00 + 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 ' + 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 + 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 + diff --git a/source/unres/src_MD-M-newcorr/MREMD.F.drabinka b/source/unres/src_MD-M-newcorr/MREMD.F.drabinka new file mode 100644 index 0000000..5b4c997 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/MREMD.F.drabinka @@ -0,0 +1,1199 @@ + 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' + double precision cm(3),L(3),vcm(3) + double precision energia(0:n_ene) + double precision remd_t_bath(maxprocs) + double precision remd_ene(0:n_ene+1,maxprocs) + integer iremd_acc(maxprocs),iremd_tot(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 itime_all(maxprocs) + integer status(MPI_STATUS_SIZE),statusi(MPI_STATUS_SIZE,maxprocs) + logical synflag,end_of_run,file_exist + + time00=MPI_WTIME() + if(me.eq.king.or..not.out1file) + & write (iout,*) 'MREMD',nodes,'time before',time00-walltime + + synflag=.false. + 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 + k=0 + rep2i(k)=-1 + do i=1,nrep + iremd_acc(i)=0 + iremd_tot(i)=0 + do j=1,remd_m(i) + i2rep(k)=i + rep2i(i)=k + k=k+1 + enddo + enddo + +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)) + + + if(rest.and.restart1file) then + inquire(file=mremd_rst_name,exist=file_exist) + if(file_exist) call read1restart + endif + + if(me.eq.king) then + if (rest.and..not.restart1file) + & inquire(file=mremd_rst_name,exist=file_exist) + IF (rest.and.file_exist.and..not.restart1file) THEN + 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 + 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 + +c write (iout,'(a6,100i4)') "ifirst", +c & (ifirst(i),i=1,remd_m(1)) +c do il=1,nodes +c write (iout,'(a6,i4,a1,100i4)') "nupa",il,":", +c & (nupa(i,il),i=1,nupa(0,il)) +c write (iout,'(a6,i4,a1,100i4)') "ndowna",il,":", +c & (ndowna(i,il),i=1,ndowna(0,il)) +c 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 +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" + tt0 = tcpu() +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 + call rescale_weights(t_bath) + endif + + t_MDsetup = tcpu()-tt0 + rstcount=0 +c Entering the MD loop + tt0 = tcpu() + if (lang.eq.2 .or. lang.eq.3) then + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif +#ifndef LANG0 + 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 +#endif + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo + 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 + call flush(iout) + t_langsetup=tcpu()-tt0 + tt0=tcpu() + 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 + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif +#ifndef LANG0 + 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 +#endif + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo + 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/(dimen*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 + call brown_step(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) then + ntwx_cache=ntwx_cache+1 + + 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 + + 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,nres*2 + do j=1,3 + c_cache(j,i,ntwx_cache)=c(j,i) + enddo + enddo + else + print *,itime,"processor ",me," over cache ",ntwx_cache + endif + 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 + 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 + 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,mpi_comm_world,synflag,status,ierr) + if (synflag) then + call mpi_recv(itime_master, 1, MPI_INTEGER, + & 0,101,mpi_comm_world, status, ierr) + call mpi_barrier(mpi_comm_world, ierr) + if (out1file.or.traj1file) then + call mpi_gather(itime,1,mpi_integer, + & itime_all,1,mpi_integer,king, + & mpi_comm_world,ierr) + endif + if (.not.out1file) + & write(iout,*) 'REMD synchro at',itime_master,itime + if(itime_master.ge.n_timestep) 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. + time00=MPI_WTIME() + do i=1,nodes-1 + call mpi_isend(itime,1,MPI_INTEGER,i,101, + & mpi_comm_world, 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(mpi_comm_world, ierr) + time01=MPI_WTIME() + write(iout,*) 'REMD synchro at',itime,'time=',time01-time00 + if (out1file.or.traj1file) then + call mpi_gather(itime,1,mpi_integer, + & itime_all,1,mpi_integer,king, + & mpi_comm_world,ierr) +ctime write(iout,'(a19,8000i8)') ' REMD synchro itime', +ctime & (itime_all(i),i=1,nodes) + if(traj1file) then + imin_itime=itime_all(1) + do i=2,nodes + if(itime_all(i).lt.imin_itime) imin_itime=itime_all(i) + enddo + ii_write=(imin_itime-imin_itime_old)/ntwx + imin_itime_old=int(imin_itime/ntwx)*ntwx + write(iout,*) imin_itime,imin_itime_old,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 + call flush(iout) + endif + if(synflag.and..not.end_of_run) then + time02=MPI_WTIME() + synflag=.false. + +cd 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 & mpi_comm_world,ierr) + potEcomp(n_ene+1)=t_bath + potEcomp(n_ene+2)=iset + call mpi_gather(potEcomp(0),n_ene+3,mpi_double_precision, + & remd_ene(0,1),n_ene+3,mpi_double_precision,king, + & mpi_comm_world,ierr) + if(lmuca) then + call mpi_gather(elow,1,mpi_double_precision, + & elowi,1,mpi_double_precision,king, + & mpi_comm_world,ierr) + call mpi_gather(ehigh,1,mpi_double_precision, + & ehighi,1,mpi_double_precision,king, + & mpi_comm_world,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 + + time04=MPI_WTIME() + if (me.eq.king .or. .not. out1file) then + write(iout,*) 'REMD writing rst time=',time04-time03 + endif + + if (traj1file) call write1traj + + time05=MPI_WTIME() + if (me.eq.king .or. .not. out1file) then + write(iout,*) 'REMD writing traj time=',time05-time04 + endif + + + if (me.eq.king) then + do i=1,nodes + remd_t_bath(i)=remd_ene(n_ene+1,i) + enddo + 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 +cd write(iout,*) 'REMD exchange temp,ene' +c do i=1,nodes +co write(iout,'(i4,2f12.5)') i,remd_t_bath(i),remd_ene(0,i) +c write(iout,'(6f12.5)') (remd_ene(j,i),j=1,n_ene) +c enddo + endif +c------------------------------------- + do irr=1,remd_m(1) + i=ifirst(iran_num(1,remd_m(1))) + do ii=1,nodes-1 + + if(i.gt.0.and.nupa(0,i).gt.0) then + iex=nupa(iran_num(1,int(nupa(0,i))),i) + 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) +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)) + ene_iex_i=remd_ene(0,iex) +cd write (iout,*) "ene_iex_i",remd_ene(0,iex) + call sum_energy(remd_ene(0,i)) +cd write (iout,*) "ene_i_i",remd_ene(0,i) +c write (iout,*) "rescaling weights with temperature", +c & remd_t_bath(iex) + if (real(ene_i_i).ne.real(remd_ene(0,i))) then + write (iout,*) "ERROR: inconsistent energies:",i, + & ene_i_i,remd_ene(0,i) + endif + call rescale_weights(remd_t_bath(iex)) + call sum_energy(remd_ene(0,i)) +c write (iout,*) "ene_i_iex",remd_ene(0,i) + ene_i_iex=remd_ene(0,i) + call sum_energy(remd_ene(0,iex)) + if (real(ene_iex_iex).ne.real(remd_ene(0,iex))) 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 +co write (iout,'(4(a,e15.5))') "ene_i_i",ene_i_i, +co & " ene_i_iex",ene_i_iex, +co & " 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 +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) +co 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 + 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 + +cd write(iout,*) 'exchange',i,iex +cd write (iout,'(a8,100i4)') "@ ifirst", +cd & (ifirst(k),k=1,remd_m(1)) +cd do il=1,nodes +cd write (iout,'(a8,i4,a1,100i4)') "@ nupa",il,":", +cd & (nupa(k,il),k=1,nupa(0,il)) +cd write (iout,'(a8,i4,a1,100i4)') "@ ndowna",il,":", +cd & (ndowna(k,il),k=1,ndowna(0,il)) +cd enddo + + else + remd_ene(0,iex)=ene_iex_iex + remd_ene(0,i)=ene_i_i + i=iex + endif + endif + enddo + enddo +c------------------------------------- + do i=1,nrep + if(iremd_tot(i).ne.0) + & write(iout,'(a3,i4,2f12.5)') 'ACC',i,remd_t(i) + & ,iremd_acc(i)/(1.0*iremd_tot(i)) + enddo + +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() + call mpi_scatter(remd_t_bath,1,mpi_double_precision, + & t_bath,1,mpi_double_precision,king, + & mpi_comm_world,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, + & mpi_comm_world,ierr) + call mpi_scatter(ehighi,1,mpi_double_precision, + & ehigh,1,mpi_double_precision,king, + & mpi_comm_world,ierr) + endif + 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 + +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-time00 + 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 + endif + + if (traj1file) call write1traj + + + t_MD=tcpu()-tt0 + 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 ' + endif + return + end + + subroutine write1rst_ + 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 + + + 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,mpi_comm_world,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, + & mpi_comm_world,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, + & mpi_comm_world,ierr) + + if(me.eq.king) then + open(irest1,file=mremd_rst_name,status='unknown') + write (irest1,*) (i2rep(i),i=0,nodes-1) + write (irest1,*) (ifirst(i),i=1,remd_m(1)) + do il=1,nodes + write (irest1,*) nupa(0,il),(nupa(i,il),i=1,nupa(0,il)) + write (irest1,*) ndowna(0,il), + & (ndowna(i,il),i=1,ndowna(0,il)) + enddo + + do il=1,nodes + write(irest1,*) (t_restart1(j,il),j=1,4) + enddo + + do il=0,nodes-1 + do i=1,2*nres + write(irest1,'(3e15.5)') (d_restart1(j,i+2*nres*il),j=1,3) + enddo + enddo + do il=0,nodes-1 + do i=1,2*nres + write(irest1,'(3e15.5)') (d_restart2(j,i+2*nres*il),j=1,3) + enddo + enddo + close(irest1) + endif + + return + end + + subroutine write1rst + 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 + + + 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,mpi_comm_world,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, + & mpi_comm_world,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, + & mpi_comm_world,ierr) + + if(me.eq.king) then +c open(irest1,file=mremd_rst_name,status='unknown') + call xdrfopen(ixdrf,mremd_rst_name, "w", iret) +c write (irest1,*) (i2rep(i),i=0,nodes-1) + do i=0,nodes-1 + call xdrfint(ixdrf, i2rep(i), iret) + enddo +c write (irest1,*) (ifirst(i),i=1,remd_m(1)) + do i=1,remd_m(1) + call xdrfint(ixdrf, ifirst(i), iret) + enddo + do il=1,nodes +c write (irest1,*) nupa(0,il),(nupa(i,il),i=1,nupa(0,il)) + do i=0,nupa(0,il) + call xdrfint(ixdrf, nupa(i,il), iret) + enddo + +c write (irest1,*) ndowna(0,il), +c & (ndowna(i,il),i=1,ndowna(0,il)) + do i=0,ndowna(0,il) + call xdrfint(ixdrf, ndowna(i,il), iret) + enddo + enddo + + do il=1,nodes +c write(irest1,*) (t_restart1(j,il),j=1,4) + do j=1,4 + call xdrffloat(ixdrf, t_restart1(j,il), iret) + enddo + enddo + + do il=0,nodes-1 + do i=1,2*nres +c write(irest1,'(3e15.5)') (d_restart1(j,i+2*nres*il),j=1,3) + 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 +c write(irest1,'(3e15.5)') (d_restart2(j,i+2*nres*il),j=1,3) + do j=1,3 + call xdrffloat(ixdrf, d_restart2(j,i+2*nres*il), iret) + enddo + enddo + enddo +c close(irest1) + call xdrfclose(ixdrf, iret) + 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 p_qfrag(50*maxprocs),p_qpair(100*maxprocs) + real p_c(3,(maxres2+2)*maxprocs),r_c(3,maxres2+2) + + call mpi_bcast(ii_write,1,mpi_integer, + & king,mpi_comm_world,ierr) + + print *,'traj1file',me,ii_write,ntwx_cache + + if(me.eq.king) call xdrfopen(ixdrf,cartname, "a", iret) + 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,mpi_comm_world,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 + + call mpi_gather(r_qfrag,nfrag,mpi_real, + & p_qfrag,nfrag,mpi_real,king, + & mpi_comm_world,ierr) + call mpi_gather(r_qpair,npair,mpi_real, + & p_qpair,npair,mpi_real,king, + & mpi_comm_world,ierr) + + 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, + & mpi_comm_world,ierr) + + if(me.eq.king) then + + 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, 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 + 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 + enddo + if(me.eq.king) call xdrfclose(ixdrf, iret) + 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) + + 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,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 + 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) + + 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 + call xdrfopen(ixdrf,mremd_rst_name, "r", iret) + +c read (irest2,*) (i2rep(i),i=0,nodes-1) + do i=0,nodes-1 + call xdrfint(ixdrf, i2rep(i), iret) + enddo +c read (irest2,*) (ifirst(i),i=1,remd_m(1)) + do i=1,remd_m(1) + call xdrfint(ixdrf, ifirst(i), iret) + enddo + do il=1,nodes +c read (irest2,*) nupa(0,il),(nupa(i,il),i=1,nupa(0,il)) + call xdrfint(ixdrf, nupa(0,il), iret) + do i=1,nupa(0,il) + call xdrfint(ixdrf, nupa(i,il), iret) + enddo + +c read (irest2,*) ndowna(0,il), +c & (ndowna(i,il),i=1,ndowna(0,il)) + 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 +c read(irest2,*) (t_restart1(j,il),j=1,4) + do j=1,4 + call xdrffloat(ixdrf, t_restart1(j,il), iret) + enddo + enddo + endif + call mpi_scatter(t_restart1,5,mpi_real, + & t5_restart1,5,mpi_real,king,mpi_comm_world,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 + call xdrffloat(ixdrf, d_restart1(j,i+2*nres*il), iret) + enddo + enddo + enddo + endif + call mpi_scatter(d_restart1,3*2*nres,mpi_real, + & r_d,3*2*nres,mpi_real,king,mpi_comm_world,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 + call xdrffloat(ixdrf, d_restart1(j,i+2*nres*il), iret) + enddo + enddo + enddo + endif + call mpi_scatter(d_restart1,3*2*nres,mpi_real, + & r_d,3*2*nres,mpi_real,king,mpi_comm_world,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 + + 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) + + 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,mpi_comm_world,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,mpi_comm_world,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,mpi_comm_world,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 + \ No newline at end of file diff --git a/source/unres/src_MD-M-newcorr/MREMD.F.safe b/source/unres/src_MD-M-newcorr/MREMD.F.safe new file mode 100644 index 0000000..110dea3 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/MREMD.F.safe @@ -0,0 +1,1756 @@ + 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' + 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) + 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./ + +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 + 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(i),i=0,nodes-1) + write(iout,*) (i2set(i),i=0,nodes-1) + 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) 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 + +c write (iout,'(a6,100i4)') "ifirst", +c & (ifirst(i),i=1,remd_m(1)) +c do il=1,nodes +c write (iout,'(a6,i4,a1,100i4)') "nupa",il,":", +c & (nupa(i,il),i=1,nupa(0,il)) +c write (iout,'(a6,i4,a1,100i4)') "ndowna",il,":", +c & (ndowna(i,il),i=1,ndowna(0,il)) +c 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) then + iset=i2set(me) + 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 + call rescale_weights(t_bath) + endif + +#ifdef MPI + t_MDsetup = MPI_Wtime() +#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 + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif +#ifndef LANG0 + 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 +#endif + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo + 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 + call flush(iout) +#ifdef MPI + t_langsetup=MPI_Wtime() + 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 + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif +#ifndef LANG0 + 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 +#endif + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo + 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/(dimen*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 + call brown_step(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) 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) 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) 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. + time00=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-time00 + 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 + + call flush(iout) + endif + if(synflag.and..not.end_of_run) then + time02=MPI_WTIME() + synflag=.false. + +cd 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 + 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 + 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 + 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 + 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 +cd write(iout,*) 'REMD exchange temp,ene' +c do i=1,nodes +co write(iout,'(i4,2f12.5)') i,remd_t_bath(i),remd_ene(0,i) +c write(iout,'(6f12.5)') (remd_ene(j,i),j=1,n_ene) +c enddo + endif +c------------------------------------- + IF(.not.usampl) THEN + write (iout,*) "Enter exchnge, remd_m",remd_m(1), + & " nodes",nodes + call flush(iout) + do irr=1,remd_m(1) + i=ifirst(iran_num(1,remd_m(1))) + call flush(iout) + + do ii=1,nodes-1 + + if(i.gt.0.and.nupa(0,i).gt.0) then + iex=nupa(iran_num(1,int(nupa(0,i))),i) + 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) +cd write (iout,*) "rescaling weights with temperature", +cd & remd_t_bath(i) +cd call flush(iout) + call rescale_weights(remd_t_bath(i)) + +cd write (iout,*) "0,iex",remd_t_bath(i) +cd call enerprint(remd_ene(0,iex)) + + 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) + +cd write (iout,*) "0,i",remd_t_bath(i) +cd call enerprint(remd_ene(0,i)) + + call sum_energy(remd_ene(0,i),.false.) +cd write (iout,*) "ene_i_i",remd_ene(0,i) +cd call flush(iout) +cd write (iout,*) "rescaling weights with temperature", +cd & remd_t_bath(iex) + if (real(ene_i_i).ne.real(remd_ene(0,i))) then + write (iout,*) "ERROR: inconsistent energies:",i, + & ene_i_i,remd_ene(0,i) + endif + call rescale_weights(remd_t_bath(iex)) + +cd write (iout,*) "0,i",remd_t_bath(iex) +cd call enerprint(remd_ene(0,i)) + + call sum_energy(remd_ene(0,i),.false.) +cd write (iout,*) "ene_i_iex",remd_ene(0,i) +cd call flush(iout) + ene_i_iex=remd_ene(0,i) + +cd write (iout,*) "0,iex",remd_t_bath(iex) +cd call enerprint(remd_ene(0,iex)) + + call sum_energy(remd_ene(0,iex),.false.) + if (real(ene_iex_iex).ne.real(remd_ene(0,iex))) then + write (iout,*) "ERROR: inconsistent energies:",iex, + & ene_iex_iex,remd_ene(0,iex) + endif +cd write (iout,*) "ene_iex_iex",remd_ene(0,iex) +cd 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 +cd 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 +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)) + 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) +cd write(iout,'(2i4,a6,2f12.5)') i,iex,' delta',delta,xxx +cd 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 + +cd write(iout,*) 'exchange',i,iex +cd write (iout,'(a8,100i4)') "@ ifirst", +cd & (ifirst(k),k=1,remd_m(1)) +cd do il=1,nodes +cd write (iout,'(a8,i4,a1,100i4)') "@ nupa",il,":", +cd & (nupa(k,il),k=1,nupa(0,il)) +cd write (iout,'(a8,i4,a1,100i4)') "@ ndowna",il,":", +cd & (ndowna(k,il),k=1,ndowna(0,il)) +cd enddo + 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) + ELSE + 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 + + i_dir=iran_num(1,3) +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 + 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 + + + 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 + + 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) + & 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 + 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 + +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-time00 + 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() +#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 ' + endif + return + end + +c----------------------------------------------------------------------- + + subroutine write1rst_oldtxt + 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 + + + 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 + open(irest1,file=mremd_rst_name,status='unknown') + write (irest1,*) (i2rep(i),i=0,nodes-1) + write (irest1,*) (ifirst(i),i=1,remd_m(1)) + do il=1,nodes + write (irest1,*) nupa(0,il),(nupa(i,il),i=1,nupa(0,il)) + write (irest1,*) ndowna(0,il), + & (ndowna(i,il),i=1,ndowna(0,il)) + enddo + + do il=1,nodes + write(irest1,*) (t_restart1(j,il),j=1,4) + enddo + + do il=0,nodes-1 + do i=1,2*nres + write(irest1,'(3e15.5)') (d_restart1(j,i+2*nres*il),j=1,3) + enddo + enddo + do il=0,nodes-1 + do i=1,2*nres + write(irest1,'(3e15.5)') (d_restart2(j,i+2*nres*il),j=1,3) + enddo + enddo + close(irest1) + endif + + return + end + + 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) + + + 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 +c open(irest1,file=mremd_rst_name,status='unknown') + call xdrfopen(ixdrf,mremd_rst_name, "w", iret) +c write (irest1,*) (i2rep(i),i=0,nodes-1) + do i=0,nodes-1 + call xdrfint(ixdrf, i2rep(i), iret) + enddo +c write (irest1,*) (ifirst(i),i=1,remd_m(1)) + do i=1,remd_m(1) + call xdrfint(ixdrf, ifirst(i), iret) + enddo + do il=1,nodes +c write (irest1,*) nupa(0,il),(nupa(i,il),i=1,nupa(0,il)) + do i=0,nupa(0,il) + call xdrfint(ixdrf, nupa(i,il), iret) + enddo + +c write (irest1,*) ndowna(0,il), +c & (ndowna(i,il),i=1,ndowna(0,il)) + do i=0,ndowna(0,il) + call xdrfint(ixdrf, ndowna(i,il), iret) + enddo + enddo + + do il=1,nodes +c write(irest1,*) (t_restart1(j,il),j=1,4) + do j=1,4 + call xdrffloat(ixdrf, t_restart1(j,il), iret) + enddo + enddo + + do il=0,nodes-1 + do i=1,2*nres +c write(irest1,'(3e15.5)') (d_restart1(j,i+2*nres*il),j=1,3) + 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 +c write(irest1,'(3e15.5)') (d_restart2(j,i+2*nres*il),j=1,3) + do j=1,3 + call xdrffloat(ixdrf, d_restart2(j,i+2*nres*il), iret) + enddo + enddo + enddo + + + if(usampl) then +c write (irest1,*) nset + call xdrfint(ixdrf, nset, iret) +c write (irest1,*) (mset(i),i=1,nset) + do i=1,nset + call xdrfint(ixdrf,mset(i), iret) + enddo +c write (irest1,*) (i2set(i),i=0,nodes-1) + do i=0,nodes-1 + call xdrfint(ixdrf,i2set(i), iret) + enddo +c write (irest1,*) "i_index" + do il=1,nset + do il1=1,mset(il) + do i=1,nrep +c write(irest1,*) (i_index(i,j,il,il1),j=1,remd_m(i)) + do j=1,remd_m(i) + itmp=i_index(i,j,il,il1) + call xdrfint(ixdrf,itmp, iret) + enddo + enddo + enddo + enddo + + endif + +c close(irest1) + call xdrfclose(ixdrf, iret) + 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) + + call mpi_bcast(ii_write,1,mpi_integer, + & king,CG_COMM,ierr) + +c debugging + print *,'traj1file',me,ii_write,ntwx_cache +c end debugging + + if(me.eq.king) call xdrfopen(ixdrf,cartname, "a", iret) + 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 + 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 + + 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 + enddo + if(me.eq.king) call xdrfclose(ixdrf, iret) + 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) + 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 + call xdrfopen(ixdrf,mremd_rst_name, "r", iret) + +c read (irest2,*) (i2rep(i),i=0,nodes-1) + do i=0,nodes-1 + call xdrfint(ixdrf, i2rep(i), iret) + enddo +c read (irest2,*) (ifirst(i),i=1,remd_m(1)) + do i=1,remd_m(1) + call xdrfint(ixdrf, ifirst(i), iret) + enddo + do il=1,nodes +c read (irest2,*) nupa(0,il),(nupa(i,il),i=1,nupa(0,il)) + call xdrfint(ixdrf, nupa(0,il), iret) + do i=1,nupa(0,il) + call xdrfint(ixdrf, nupa(i,il), iret) + enddo + +c read (irest2,*) ndowna(0,il), +c & (ndowna(i,il),i=1,ndowna(0,il)) + 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 +c read(irest2,*) (t_restart1(j,il),j=1,4) + do j=1,4 + call xdrffloat(ixdrf, t_restart1(j,il), iret) + enddo + 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 +c read(irest2,'(3e15.5)') +c & (d_restart1(j,i+2*nres*il),j=1,3) + do j=1,3 + call xdrffloat(ixdrf, d_restart1(j,i+2*nres*il), iret) + 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 + call xdrffloat(ixdrf, d_restart1(j,i+2*nres*il), iret) + 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 + 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 + + 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) + + 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 + diff --git a/source/unres/src_MD-M-newcorr/MREMD_nosy1traj.F b/source/unres/src_MD-M-newcorr/MREMD_nosy1traj.F new file mode 100644 index 0000000..d9d524e --- /dev/null +++ b/source/unres/src_MD-M-newcorr/MREMD_nosy1traj.F @@ -0,0 +1,910 @@ + 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' + include 'COMMON.HAIRPIN' + double precision cm(3),L(3),vcm(3) + double precision energia(0:n_ene) + double precision remd_t_bath(maxprocs) + double precision remd_ene(0:n_ene+1,maxprocs) + integer iremd_acc(maxprocs),iremd_tot(maxprocs) + integer ilen,rstcount + external ilen + character*50 tytul + common /gucio/ cm + integer itime + integer nup(0:maxprocs),ndown(0:maxprocs) + integer rep2i(0:maxprocs) + integer itime_all(maxprocs) + integer status(MPI_STATUS_SIZE) + logical synflag,end_of_run,file_exist + + time00=MPI_WTIME() + if(me.eq.king.or..not.out1file) + & write (iout,*) 'MREMD',nodes,'time before',time00-walltime + + synflag=.false. + 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 + k=0 + rep2i(k)=-1 + do i=1,nrep + iremd_acc(i)=0 + iremd_tot(i)=0 + do j=1,remd_m(i) + i2rep(k)=i + rep2i(i)=k + k=k+1 + enddo + enddo + +c print *,'i2rep',me,i2rep(me) +c print *,'rep2i',(rep2i(i),i=0,nrep) + + if (i2rep(me).eq.nrep) then + nup(0)=0 + else + nup(0)=remd_m(i2rep(me)+1) + k=rep2i(i2rep(me))+1 + do i=1,nup(0) + nup(i)=k + k=k+1 + enddo + endif + +cd print '(i4,a4,100i4)',me,' nup',(nup(i),i=0,nup(0)) + + if (i2rep(me).eq.1) then + ndown(0)=0 + else + ndown(0)=remd_m(i2rep(me)-1) + k=rep2i(i2rep(me)-2)+1 + do i=1,ndown(0) + ndown(i)=k + k=k+1 + enddo + endif + +cd print '(i4,a6,100i4)',me,' ndown',(ndown(i),i=0,ndown(0)) + + + if(rest.and.restart1file) then + inquire(file=mremd_rst_name,exist=file_exist) + if(file_exist) call read1restart + endif + + if(me.eq.king) then + if (rest.and..not.restart1file) + & inquire(file=mremd_rst_name,exist=file_exist) + IF (rest.and.file_exist.and..not.restart1file) THEN + 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 + 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 + 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(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 + +c write (iout,'(a6,100i4)') "ifirst", +c & (ifirst(i),i=1,remd_m(1)) +c do il=1,nodes +c write (iout,'(a6,i4,a1,100i4)') "nupa",il,":", +c & (nupa(i,il),i=1,nupa(0,il)) +c write (iout,'(a6,i4,a1,100i4)') "ndowna",il,":", +c & (ndowna(i,il),i=1,ndowna(0,il)) +c 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(i2rep(me)) + 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" + tt0 = tcpu() +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 + call rescale_weights(t_bath) + endif + + t_MDsetup = tcpu()-tt0 + rstcount=0 +c Entering the MD loop + tt0 = tcpu() + if (lang.eq.2 .or. lang.eq.3) then + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif +#ifndef LANG0 + 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 +#endif + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo + 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 + call flush(iout) + t_langsetup=tcpu()-tt0 + tt0=tcpu() + 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 + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif +#ifndef LANG0 + 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 +#endif + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo + 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/(dimen*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 + call brown_step(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 hairpin(.true.,nharp,iharp) + call secondary2(.true.) + call pdbout(potE,tytul,ipdb) + else + call cartout(totT) + endif + 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 + 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 + close(irest2) + rstcount=0 + endif + +c REMD - exchange +c forced synchronization + if (mod(itime,100).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) + if (.not. out1file) then + write(iout,*) 'REMD synchro at',itime_master,itime + else + call mpi_gather(itime,1,mpi_integer, + & itime_all,1,mpi_integer,king, + & CG_COMM,ierr) + endif + if(itime_master.ge.n_timestep) end_of_run=.true. + 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. + time00=MPI_WTIME() + do i=1,nodes-1 + call mpi_isend(itime,1,MPI_INTEGER,i,101, + & CG_COMM, ireq, ierr) +cd write(iout,*) 'REMD synchro with',i +cd call flush(iout) + enddo + time02=MPI_WTIME() + write(iout,*) 'REMD synchro at',itime,'time=',time02-time00 + if (out1file) then + call mpi_gather(itime,1,mpi_integer, + & itime_all,1,mpi_integer,king, + & CG_COMM,ierr) + write(iout,'(a18,8000i8)') 'REMD synchro itime', + & (itime_all(i),i=1,nodes) + endif + 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 + call flush(iout) + endif + if(synflag.and..not.end_of_run) then + time00=MPI_WTIME() + synflag=.false. + +cd 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 + call mpi_gather(potEcomp(0),n_ene+2,mpi_double_precision, + & remd_ene(0,1),n_ene+2,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 + + if (restart1file) call write1rst + if (traj1file) call write1traj + + if (me.eq.king) then + do i=1,nodes + remd_t_bath(i)=remd_ene(n_ene+1,i) + enddo + 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 +cd write(iout,*) 'REMD exchange temp,ene' +c do i=1,nodes +co write(iout,'(i4,2f12.5)') i,remd_t_bath(i),remd_ene(0,i) +c write(iout,'(6f12.5)') (remd_ene(j,i),j=1,n_ene) +c enddo + endif +c------------------------------------- + do irr=1,remd_m(1) + i=ifirst(iran_num(1,remd_m(1))) + do ii=1,nodes-1 + + if(i.gt.0.and.nupa(0,i).gt.0) then + iex=nupa(iran_num(1,int(nupa(0,i))),i) + 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) +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) + 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) + if (real(ene_i_i).ne.real(remd_ene(0,i))) then + write (iout,*) "ERROR: inconsistent energies:",i, + & ene_i_i,remd_ene(0,i) + endif + call rescale_weights(remd_t_bath(iex)) + call sum_energy(remd_ene(0,i),.false.) +c write (iout,*) "ene_i_iex",remd_ene(0,i) + ene_i_iex=remd_ene(0,i) + call sum_energy(remd_ene(0,iex),.false.) + if (real(ene_iex_iex).ne.real(remd_ene(0,iex))) 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 +co write (iout,'(4(a,e15.5))') "ene_i_i",ene_i_i, +co & " ene_i_iex",ene_i_iex, +co & " 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 +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(i2rep(i-1))=iremd_tot(i2rep(i-1))+1 + xxx=ran_number(0.0d0,1.0d0) +co 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 + 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(i2rep(i-1))=iremd_acc(i2rep(i-1))+1 + itmp=i2rep(i-1) + i2rep(i-1)=i2rep(iex-1) + i2rep(iex-1)=itmp + +cd write(iout,*) 'exchange',i,iex +cd write (iout,'(a8,100i4)') "@ ifirst", +cd & (ifirst(k),k=1,remd_m(1)) +cd do il=1,nodes +cd write (iout,'(a8,i4,a1,100i4)') "@ nupa",il,":", +cd & (nupa(k,il),k=1,nupa(0,il)) +cd write (iout,'(a8,i4,a1,100i4)') "@ ndowna",il,":", +cd & (ndowna(k,il),k=1,ndowna(0,il)) +cd enddo + + else + remd_ene(0,iex)=ene_iex_iex + remd_ene(0,i)=ene_i_i + i=iex + endif + endif + enddo + enddo +c------------------------------------- + do i=1,nrep + if(iremd_tot(i).ne.0) + & write(iout,'(a3,i4,2f12.5)') 'ACC',i,remd_t(i) + & ,iremd_acc(i)/(1.0*iremd_tot(i)) + enddo + +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 + + call mpi_scatter(remd_t_bath,1,mpi_double_precision, + & t_bath,1,mpi_double_precision,king, + & CG_COMM,ierr) + 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 + 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 + +cde write(iout,*) 'REMD after',me,t_bath + time02=MPI_WTIME() + if (me.eq.king .or. .not. out1file) then + write(iout,*) 'REMD exchange time=',time02-time00 + 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 + endif + + if (traj1file) call write1traj + + + t_MD=tcpu()-tt0 + 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 ' + endif + return + end + + subroutine write1rst + 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 + + + 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 + open(irest1,file=mremd_rst_name,status='unknown') + write (irest1,*) (i2rep(i),i=0,nodes-1) + write (irest1,*) (ifirst(i),i=1,remd_m(1)) + do il=1,nodes + write (irest1,*) nupa(0,il),(nupa(i,il),i=1,nupa(0,il)) + write (irest1,*) ndowna(0,il), + & (ndowna(i,il),i=1,ndowna(0,il)) + enddo + + do il=1,nodes + write(irest1,*) (t_restart1(j,il),j=1,4) + enddo + + do il=0,nodes-1 + do i=1,2*nres + write(irest1,'(3e15.5)') (d_restart1(j,i+2*nres*il),j=1,3) + enddo + enddo + do il=0,nodes-1 + do i=1,2*nres + write(irest1,'(3e15.5)') (d_restart2(j,i+2*nres*il),j=1,3) + enddo + enddo + close(irest1) + 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 p_qfrag(50*maxprocs),p_qpair(100*maxprocs) + real p_c(3,(maxres2+2)*maxprocs),r_c(3,maxres2+2) + + if(.not.restart1file) then + 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) + endif + + do i=1,nfrag + r_qfrag(i)=qfrag(i) + enddo + do i=1,npair + r_qpair(i)=qpair(i) + enddo + + call mpi_gather(r_qfrag,nfrag,mpi_real, + & p_qfrag,nfrag,mpi_real,king, + & CG_COMM,ierr) + call mpi_gather(qpair,nfrag,mpi_real, + & p_qpair,nfrag,mpi_real,king, + & CG_COMM,ierr) + + do i=1,nres*2 + do j=1,3 + r_c(j,i)=c(j,i) + 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 + call xdrfopen(ixdrf,cartname, "a", iret) + 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, 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 + 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 + call xdrfclose(ixdrf, iret) + endif + + return + end + + + subroutine read1restart + 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) + + 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 + diff --git a/source/unres/src_MD-M-newcorr/Makefile b/source/unres/src_MD-M-newcorr/Makefile new file mode 120000 index 0000000..8453cdd --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile @@ -0,0 +1 @@ +Makefile_MPICH_ifort \ No newline at end of file diff --git a/source/unres/src_MD-M-newcorr/Makefile-biosim b/source/unres/src_MD-M-newcorr/Makefile-biosim new file mode 100644 index 0000000..e8de82a --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile-biosim @@ -0,0 +1,127 @@ +#CPPFLAGS = -WF,-DOLD_GINV \ + -WF,-DUNRES -WF,-DMP -WF,-DMPI \ + -WF,-DSPLITELE -WF,-DISNAN \ + -WF,-DAIX -WF,-DLANG0 -WF,-DPROCOR +# +INSTALL_DIR = /opt/mpich-pgi +CC = cc +FC=mpif90 +PGI=/opt/pgi +#OPT = -fast -pc 64 -tp p6 \ +#-Minline=name:scalar2,scalar,transpose2,matvec2,prodmat3 +OPT = -fast + +OPT1 = -fast +#OPT = -C -g +#OPT1 = -C -g + +# -Mvect <---slows down +# -Minline=name:matmat2 <---false convergence + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c ${OPT1} -I$(INSTALL_DIR)/include +FFLAGSE = ${FFLAGS} +FFLAGS2 = ${FFLAGS} + +BIN = /home/aliwo/UNRES/MD/bin/unres_MD_Tc-new-fg.exe +LIBS = ../src_Tc_cache/xdrf_new/libxdrf.a +#LIBS=-lmpichfsup +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DOLD_GINV -DLANG0 +CFLAGS = -DLINUX -DPGI -c + +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 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.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split.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 + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-M-newcorr/Makefile-intrepid-with-tau b/source/unres/src_MD-M-newcorr/Makefile-intrepid-with-tau new file mode 100644 index 0000000..eae1cc5 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/Makefile-matrix-intel b/source/unres/src_MD-M-newcorr/Makefile-matrix-intel new file mode 100644 index 0000000..c81649f --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile-matrix-intel @@ -0,0 +1,124 @@ +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI \ + -DPGI -DSPLITELE -DISNAN -DAMD64 \ + -DPROCOR +# -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +## -DPROCOR +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +#INSTALL_DIR = /usr/local/mpich-1.2.0 +INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/ +# +#FC= /usr/local/opt/intel/compiler60/ia32/bin/ifc +FC= ifort + +OPT = -O3 -ip -w + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -w -g -d2 -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -w -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -w -O3 -ipo -ipo_obj -opt_report -I$(INSTALL_DIR)/include + +BIN = unres_Tc_procor_new_em64-fg.exe +#LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich xdrf/libxdrf.a +#LIBS = -L$(INSTALL_DIR)/lib_ifort -lmpich xdrf/libxdrf.a +LIBS = -L$(INSTALL_DIR)/lib -lmpich xdrf_em64/libxdrf.a -g -d2 -CA -CB + +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 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.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split.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 + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-M-newcorr/Makefile-matrix3 b/source/unres/src_MD-M-newcorr/Makefile-matrix3 new file mode 100644 index 0000000..3a50a21 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile-matrix3 @@ -0,0 +1,141 @@ +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI \ + -DPGI -DSPLITELE -DISNAN -DAMD64 \ + -DPROCOR \ +# -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +## -DPROCOR +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +CFLAGS = -DSGI -c + +#INSTALL_DIR = /usr/local/mpich-1.2.0 +INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh +# +#FC= /usr/local/opt/intel/compiler60/ia32/bin/ifc +FC= ifort + +OPT = -O3 -ip -w + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -w -g -d2 -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -w -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -w -O3 -ipo -ipo_obj -opt_report -I$(INSTALL_DIR)/include + +#FFLAGS = -c -C -g -I$(INSTALL_DIR)/include +#FFLAGS1 = -c -g -I$(INSTALL_DIR)/include +#FFLAGS2 = -c -C -g -I$(INSTALL_DIR)/include +#FFLAGSE = -c -C -g -I$(INSTALL_DIR)/include + +BIN = ../bin/unres_Tc_procor_em64-D-finegrain.exe +#LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich xdrf/libxdrf.a +#LIBS = -L$(INSTALL_DIR)/lib_ifort -lmpich xdrf/libxdrf.a +LIBS = -L$(INSTALL_DIR)/lib -lmpich xdrf_em64/libxdrf.a -g -d2 -CA -CB + +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} 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 + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +eigen.o : eigen.f + ${FC} ${FFLAGS} eigen.f + +blas.o : blas.f + ${FC} ${FFLAGS} blas.f + +add.o : add.f + ${FC} ${FFLAGS} add.f + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-M-newcorr/Makefile-matrix3-oldparm b/source/unres/src_MD-M-newcorr/Makefile-matrix3-oldparm new file mode 100644 index 0000000..9096f63 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile-matrix3-oldparm @@ -0,0 +1,127 @@ +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI \ + -DPGI -DSPLITELE -DISNAN -DAMD64 \ + -DPROCOR -DLANG0 \ + -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +## -DPROCOR +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +#INSTALL_DIR = /usr/local/mpich-1.2.0 +INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh +# +#FC= /usr/local/opt/intel/compiler60/ia32/bin/ifc +FC= ifort + +OPT = -O3 -ip -w + +CFLAGS = -DSGI -c + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -w -g -d2 -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -w -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -w -O3 -ipo -ipo_obj -opt_report -I$(INSTALL_DIR)/include + +BIN = ../bin/unres_Tc_procor_oldparm_em64-D-finegrain.exe +#LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich xdrf/libxdrf.a +#LIBS = -L$(INSTALL_DIR)/lib_ifort -lmpich xdrf/libxdrf.a +LIBS = -L$(INSTALL_DIR)/lib -lmpich xdrf_em64/libxdrf.a -g -d2 -CA -CB + +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} proc_proc.o + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} -Wl,-M ${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 + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-M-newcorr/Makefile-oldparm b/source/unres/src_MD-M-newcorr/Makefile-oldparm new file mode 100644 index 0000000..bf12898 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile-oldparm @@ -0,0 +1,130 @@ +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI \ + -DPGI -DSPLITELE -DISNAN -DAMD64 \ + -DPROCOR \ + -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +## -DPROCOR +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +#INSTALL_DIR = /usr/local/mpich-1.2.0 +#INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/ +INSTALL_DIR = /opt/mpi/mvapich +# +#FC= /usr/local/opt/intel/compiler60/ia32/bin/ifc +FC= ifort +FCL = ${INSTALL_DIR}/bin/mpif77 + +OPT = -O3 -ip -w + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -w -g -d2 -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -w -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -w -O3 -ipo -ipo_obj -opt_report -I$(INSTALL_DIR)/include + +BIN = unres_Tc_procor_new_em64-oldparm.exe +#LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich xdrf/libxdrf.a +#LIBS = -L$(INSTALL_DIR)/lib_ifort -lmpich xdrf/libxdrf.a +LIBS = -L$(INSTALL_DIR)/lib -lmpich -lpthread xdrf_em64/libxdrf.a -g -d2 -CA -CB + +ARCH = LINUX +PP = /lib/cpp -P + +all: unresCSA + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +objectCSA = unres_CSA.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 energy_p_new.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 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.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split.o \ + q_measure3.o econstr_local.o gnmr1.o check_sc_map.o check_bond.o + +unresCSA: ${objectCSA} + cc -o compinfo compinfo.c + ./compinfo + ${FC} ${FFLAGS} cinfo.f + ${FCL} -static-libcxa ${OPT} ${objectCSA} cinfo.o ${LIBS} -o ${BIN} + mv ${BIN} ../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 + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +readrtns_CSA.o : readrtns_CSA.F + ${FC} ${FFLAGS1} ${CPPFLAGS} readrtns_CSA.F + +MREMD.o : MREMD.F + ${FC} ${FFLAGS1} ${CPPFLAGS} MREMD.F + diff --git a/source/unres/src_MD-M-newcorr/Makefile-rstconv b/source/unres/src_MD-M-newcorr/Makefile-rstconv new file mode 100644 index 0000000..58d5e5f --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile-rstconv @@ -0,0 +1,40 @@ +# +FC= ifort +FCL = ${INSTALL_DIR}/bin/mpif77 +CC = cc + +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/restbin2asc +LIBS = xdrf/libxdrf.a + +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI \ + -DPGI -DSPLITELE -DISNAN -DAMD64 \ + -DPROCOR +# -DCRYST_BOND -DCRYST_THETA -DCRYST_SC + +ARCH = LINUX +PP = /lib/cpp -P + + +all: restbin2asc + +obj: ${object} + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +object = restbin2asc.o + +restbin2asc: ${object} + ${FC} ${OPT} ${object} ${LIBS} -o ${BIN} + + +clean: + /bin/rm *.o diff --git a/source/unres/src_MD-M-newcorr/Makefile-tau-temp b/source/unres/src_MD-M-newcorr/Makefile-tau-temp new file mode 100644 index 0000000..6fd84a8 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile-tau-temp @@ -0,0 +1,148 @@ +# +#include TAU_MAKEFILE ${TAU_ROOT_DIR}/xt3/lib/Makefile.tau-mpi-pdt-pgi +TAU_MAKEFILE=/usr/local/packages/TAU-2.17/tau-2.17/xt3/lib/Makefile.tau-mpi-pdt-pgi +FC=tau_f90.sh +OPT = -fast -pc 64 -tp p6 +#-Minline=name:scalar2,scalar,transpose2,matvec2,prodmat3 \ +#-Mprefetch=distance:8,nta + +OPT1 = -fast -pc 64 -tp p6 +OPT2 = -fast -pc 64 -tp p6 +OPTE = -fast -pc 64 -tp p6 + +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-tau.exe +#LIBS = xdrf/libxdrf.a /home/liwo/UNRES/LIB/libmemmon.a +LIBS = xdrf/libxdrf.a + +CPPFLAGS = -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI \ + -DSPLITELE -DPROCOR -DAMD64 -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} ${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 + ${FC} ${FFLAGS} prng.f + +readrtns_CSA.o: readrtns_CSA.F + ${FC} ${FFLAGS} ${CPPFLAGS} readrtns_CSA.F + +gen_rand_conf.o: gen_rand_conf.F + ${FC} ${FFLAGS} ${CPPFLAGS} gen_rand_conf.F diff --git a/source/unres/src_MD-M-newcorr/Makefile.tau-mpi-f77-pdt b/source/unres/src_MD-M-newcorr/Makefile.tau-mpi-f77-pdt new file mode 100644 index 0000000..c8dc5fe --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/Makefile.tau-mpi-pdt-pgi.org b/source/unres/src_MD-M-newcorr/Makefile.tau-mpi-pdt-pgi.org new file mode 100755 index 0000000..5f0dd3a --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile.tau-mpi-pdt-pgi.org @@ -0,0 +1,836 @@ +#**************************************************************************** +#* 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=xt3 +TAU_ARCH=xt3 +CONFIG_CC=qk-pgcc +CONFIG_CXX=qk-pgCC +TAU_CC_FE=$(CONFIG_CC) +#BGL#TAU_CC_FE=xlc #ENDIF# +#BGP#TAU_CC_FE=xlc #ENDIF# +TAU_CC_FE=gcc #ENDIF##CATAMOUNT# +#SC_GFORTRAN#TAU_CC_FE=gcc #ENDIF# +#SC_PATHSCALE#TAU_CC_FE=gcc #ENDIF# +PCXX_OPT=-g +USER_OPT= +EXTRADIR=/opt/pgi/6.1.4/linux86-64/6.1/bin/.. +EXTRADIRCXX= +TAUROOT=/usr/local/packages/TAU-2.17/tau-2.17 +TULIPDIR= +TAUEXTRASHLIBOPTS= +TAUGCCLIBOPTS= +TAUGCCLIBDIR= +PCLDIR= +PAPIDIR= +PAPISUBDIR= +CHARMDIR= +PDTDIR=/usr/local/packages/TAU-2.17/tau-2.17/../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-pgi +TAU_MPI_INC=-I/opt/xt-mpt/default/mpich2-64/P2/include +TAU_MPI_LIB=/usr/local/packages/TAU-2.17/tau-2.17/xt3/lib/libTauMpi$(TAU_CONFIG).a -L/opt/xt-mpt/default/mpich2-64/P2/lib -lrt -lmpichcxx -lmpich -lrt +TAU_MPI_FLIB=-L/opt/xt-mpt/default/mpich2-64/P2/lib -L/usr/local/packages/TAU-2.17/tau-2.17/xt3/lib/libTauMpi$(TAU_CONFIG).a -lrt -lmpichcxx -lmpich -lrt +TAU_MPILIB_DIR=/opt/xt-mpt/default/mpich2-64/P2/lib +TAU_MPI_NOWRAP_LIB= -L/opt/xt-mpt/default/mpich2-64/P2/lib -lrt -lmpichcxx -lmpich -lrt +TAU_MPI_NOWRAP_FLIB=-L/opt/xt-mpt/default/mpich2-64/P2/lib -lrt -lmpichcxx -lmpich -lrt +FULL_CXX=/opt/xt-pe/1.5.47/bin/snos64/qk-pgCC +FULL_CC=/opt/xt-pe/1.5.47/bin/snos64/qk-pgcc +TAU_PREFIX_INSTALL_DIR=/usr/local/packages/TAU-2.17/tau-2.17 + +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 + +####################################################################### + +#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# + +#USE_IBMXLC#IBM_ABI = $(IBM_XLC_ABI) #ENDIF# +#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# + +#THREADSAFE_COMPILERS#TAU_R =_r #ENDIF# + +############# 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# +#IBM_FORTRAN#TAU_F90 = xlf90$(TAU_R) $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#BGP#TAU_F90 = bgxlf90$(TAU_R) $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#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# +TAU_F90 = pgf90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF##PGI_FORTRAN# +#CRAYCNL#TAU_F90 = ftn $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +TAU_F90 = qk-pgf90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF##PGI_CATAMOUNT# +#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# +#IBM_FORTRAN#TAU_F90_FIXED = -qfixed #ENDIF# +#IBM_FORTRAN#TAU_F90_SUFFIX = -qsuffix=f=f90 #ENDIF# +#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# +PROFILEOPT19 = -DTAU_DOT_H_LESS_HEADERS -fPIC #ENDIF##PGI# +#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# +#USE_IBMXLC#PROFILEOPT21 = -DTAU_DOT_H_LESS_HEADERS -DTAU_XLC $(TAU_PIC_PROFILEOPT21) #ENDIF# +#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# +#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# +#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# +PROFILEOPT50 = -DTAU_CATAMOUNT #ENDIF##CATAMOUNT# +#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# +#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# +PROFILEOPT67 = -DTAU_WEAK_MPI_INIT #ENDIF##WEAKMPIINIT# +#LAMPI#PROFILEOPT68 = -DTAU_LAMPI #ENDIF# +PROFILEOPT68 = -DMPICH_IGNORE_CXX_SEEK #ENDIF##MPICH_IGNORE_CXX_SEEK# +PROFILEOPT73 = -DTAU_MPICH2_MPI_IN_PLACE #ENDIF##MPICH2_MPI_INPLACE# + + +############# 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# + +#For F90 support for all platforms +FWRAPPER = TauFMpi.o +MPI2EXTENSIONS = TauMpiExtensions.o #ENDIF##MPI2# +#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# +#X86_64PAPI#LEXTRA = -L$(PAPIDIR)/$(PAPISUBDIR)/ -L$(PAPIDIR)/lib64/ -lpapi -lperfctr #ENDIF# +#PAPIPFM#LEXTRA = -L$(PAPIDIR)/$(PAPISUBDIR) -lpfm -lpapi -lpfm #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# + + + +# 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# +TAU_PAPI_RPATH = -R$(PAPIDIR)/$(PAPISUBDIR) #ENDIF##PGI# +#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 +#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 = -lgfortran -lgfortranbegin #ENDIF# +#SC_GFORTRAN#TAU_FORTRANLIBS = -lgfortran -lgfortranbegin #ENDIF# +#SGI_FORTRAN#TAU_FORTRANLIBS = -lfortran -lftn #ENDIF# +#USE_IBMXLC#TAU_IBM_FORTRANLIBS = -bh:4 -bpT:0x10000000 -bpD:0x20000000 /lib/crt0.o -lxlf90 -lm -lc #ENDIF# +#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# +#IBM_FORTRAN#TAU_FORTRANLIBS = $(TAU_IBM_FORTRANLIBS) #ENDIF# + +#USE_IBMXLC#TAU_IBM64_FORTRANLIBS = -bh:4 -bpT:0x10000000 -bpD:0x20000000 -b64 /lib/crt0_64.o -lxlf90 -lm -lc #ENDIF# +#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# +#IBM_FORTRAN#TAU_FORLIBDIR=lib #ENDIF# +#BGL#TAU_FORLIBDIR=blrts_dev_lib #ENDIF# +#BGP#TAU_FORLIBDIR=bglib #ENDIF# +#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# + +#BGP#TAU_BGL_OMP_SERIAL= -lxlomp_ser #ENDIF# +#OPENMP#TAU_BGL_OMP_SERIAL= #ENDIF# +#BGP#TAU_OMP_SERIAL=$(TAU_BGL_OMP_SERIAL) #ENDIF# +#BGP#TAU_FORTRANLIBS = -L$(EXTRADIR)/$(TAU_FORLIBDIR) -lxlf90 -lxlfmath $(TAU_OMP_SERIAL) #ENDIF# + +#IBMXLFAPPLE#TAU_FORTRANLIBS = -L$(EXTRADIR)/lib -lxlf90 -lxlfmath -lxl #ENDIF# + +#CRAY_FORTRAN#TAU_FORTRANLIBS = #ENDIF# +#CRAY_X1_FORTRAN#TAU_FORTRANLIBS = #ENDIF# +TAU_FORTRANLIBS = $(EXTRADIR)/lib/f90main.o -lpgf90 -lpgf90rtl -lpgf90_rpm1 -lpgf902 -lpgftnrtl -lrt #ENDIF##PGI_FORTRAN# +#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# +TAU_CXXLIBS = -lstd -lC #ENDIF##PGI# +#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# +#BGP#TAU_XLCLIBS = -L$(EXTRADIRCXX)/bglib -libmc++ -lstdc++ #ENDIF# +#SP1#TAU_XLCLIBS = -lC #ENDIF# +#USE_IBMXLC#TAU_CXXLIBS = $(TAU_XLCLIBS) #ENDIF# +#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 +#EPILOG#TAU_LINKER_OPT3 = -L$(EPILOGLIBDIR) -lelg $(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# + +#USE_IBMXLC#TAU_IBM_PYTHON_SHFLAG = -Wl,-bI:$(PYTHON_LIBDIR)/config/python.exp -Wl,-einitpytau#ENDIF# +#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# + +#USE_IBMXLC#TAU_IBM_LD_FLAGS = -binitfini:poe_remote_main #ENDIF# +#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# +#USE_IBMXLC#TAU_IBM_LINKER_SHOPTS= -brtl -bexpall #ENDIF# +#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# +AR_SHFLAGS = -shared #ENDIF##PGI# +#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# +#USE_IBMXLC#AR_SHFLAGS = -G #ENDIF# +#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-M-newcorr/Makefile_MPICH_ifort b/source/unres/src_MD-M-newcorr/Makefile_MPICH_ifort new file mode 100644 index 0000000..708cf8f --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_MPICH_ifort @@ -0,0 +1,143 @@ +################################################################### +INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh + + +FC= ifort + +OPT = -g -ip -w -CB + +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 + + +LIBS = -L$(INSTALL_DIR)/lib -lmpich xdrf/libxdrf.a + +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 permut.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 + +GAB: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DUNRES -DISNAN -DMP -DMPI \ + -DSPLITELE -DLANG0 -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +GAB: BIN = ../../../bin/unres/MD/unres_mchain-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} + +GABT: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DUNRES -DISNAN -DMP -DMPI \ + -DSPLITELE -DLANG0 -DNEWCORR -DCRYST_BOND -DCRYST_THETA -DCRYST_SC # -DMUOUT +GABT: BIN = ../../../bin/unres/MD/unres_mchain-ifort_MPICH_GAB-NEWC.exe +GABT: ${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_mchain_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} + +E0LL2YT: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DUNRES -DISNAN -DMP -DMPI \ + -DSPLITELE -DLANG0 -DNEWCORR +E0LL2YT: BIN = ../../../bin/unres/MD/unres_mchain_ifort_MPICH_E0LL2Y-NEWC.exe +E0LL2YT: ${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-M-newcorr/Makefile_aix_xlf b/source/unres/src_MD-M-newcorr/Makefile_aix_xlf new file mode 100644 index 0000000..8fe4624 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_aix_xlf @@ -0,0 +1,112 @@ +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 + + +objectCSA = unres_CSA.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 energy_p_new.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 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.o REMD.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split.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-M-newcorr/Makefile_bigben b/source/unres/src_MD-M-newcorr/Makefile_bigben new file mode 100644 index 0000000..8d961fa --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/Makefile_bigben-oldparm b/source/unres/src_MD-M-newcorr/Makefile_bigben-oldparm new file mode 100644 index 0000000..14a4ab4 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-novec-noparint_barrier_corr-split-oldparm.exe +LIBS = xdrf/libxdrf.a + +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI -DPGI \ + -DSPLITELE -DPROCOR -DAMD64 -DLANG0 \ + -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_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-M-newcorr/Makefile_bigben-tau b/source/unres/src_MD-M-newcorr/Makefile_bigben-tau new file mode 100644 index 0000000..ee02905 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/Makefile_intrepid b/source/unres/src_MD-M-newcorr/Makefile_intrepid new file mode 100644 index 0000000..2b57f9e --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/Makefile_jubl b/source/unres/src_MD-M-newcorr/Makefile_jubl new file mode 100644 index 0000000..9524cd6 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_jubl @@ -0,0 +1,132 @@ +CPPFLAGS = -WF,-DOLD_GINV \ + -WF,-DUNRES -WF,-DMP -WF,-DMPI \ + -WF,-DSPLITELE -WF,-DISNAN \ + -WF,-DAIX -WF,-DLANG0 -WF,-DPROCOR +#-WF,-DNOXDR +#-WF,-DPROCOR +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +BGLSYS = /bgl/BlueLight/ppcfloor/bglsys + +CC = /usr/bin/blrts_xlc +CPPC = /usr/bin/blrts_xlc +FC = /usr/bin/blrts_xlf90 +#-pg -g + +# try -qarch=440 first, then use -qarch=440d for 2nd FPU later on +# (SIMDization requires at least -O3) +# use -qlist -qsource with 440d and look for Parallel ASM instructions. +# +OPT= -I$(BGLSYS)/include -L$(BGLSYS)/lib -qarch=440d -qtune=440 -qfixed -w -qnosave +CFLAGS= -O3 -I$(BGLSYS)/include -L$(BGLSYS)/lib -qarch=440d -qtune=440 +FFLAGS= -c -O3 ${OPT} +# +LIBS_MPI = -lmpich.rts -lmsglayer.rts -lrts.rts -ldevices.rts +LIBSF_MPI = -lmpich.rts -lfmpich.rts -lmsglayer.rts -lrts.rts -ldevices.rts + +FFLAGS1 = -c ${OPT} -O2 +FFLAGS2 = -c ${OPT} -O +FFLAGSE = -c ${OPT} -O4 + + +BIN = ${HOME}/UNRES/bin/unres_Tc_procor_150aa.rts +#BIN = ${HOME}/UNRES/bin/unres_Tc_oldginv_noprocor.rts +LIBS = ${LIBSF_MPI} xdrf/libxdrf.a +#LIBS = ${LIBSF_MPI} + +ARCH = LINUX +PP = /lib/cpp -P + +all: unresCSA + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +objectCSA = unres_CSA.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 energy_p_new.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 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.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split.o \ + q_measure.o gnmr1.o + +unresCSA: ${objectCSA} + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${objectCSA} 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 + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + diff --git a/source/unres/src_MD-M-newcorr/Makefile_jubl-debug b/source/unres/src_MD-M-newcorr/Makefile_jubl-debug new file mode 100644 index 0000000..d2d6c47 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_jubl-debug @@ -0,0 +1,141 @@ +CPPFLAGS = -WF,-DOLD_GINV \ + -WF,-DUNRES -WF,-DMP -WF,-DMPI \ + -WF,-DSPLITELE -WF,-DISNAN \ + -WF,-DAIX -WF,-DLANG0 -WF,-DPROCOR +#-WF,-DNOXDR +#-WF,-DPROCOR +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +BGLSYS = /bgl/BlueLight/ppcfloor/bglsys + +CC = /usr/bin/blrts_xlc +CPPC = /usr/bin/blrts_xlc +FC = /usr/bin/blrts_xlf90 +#-pg -g + +# try -qarch=440 first, then use -qarch=440d for 2nd FPU later on +# (SIMDization requires at least -O3) +# use -qlist -qsource with 440d and look for Parallel ASM instructions. +# +OPT= -I$(BGLSYS)/include -L$(BGLSYS)/lib -qarch=440d -qtune=440 -qfixed -w -qnosave +CFLAGS= -O3 -I$(BGLSYS)/include -L$(BGLSYS)/lib -qarch=440d -qtune=440 +FFLAGS= -c -O3 ${OPT} +FFLAGS= -c -C -g ${OPT} +# +LIBS_MPI = -lmpich.rts -lmsglayer.rts -lrts.rts -ldevices.rts +LIBSF_MPI = -lmpich.rts -lfmpich.rts -lmsglayer.rts -lrts.rts -ldevices.rts + +FFLAGS1 = -c ${OPT} -O2 +FFLAGS2 = -c ${OPT} -O +FFLAGSE = -c ${OPT} -O4 + + +BIN = ${HOME}/UNRES/bin/unres_Tc_procor_150aa_newparm.rts +LIBS = ${LIBSF_MPI} xdrf/libxdrf.a +#LIBS = ${LIBSF_MPI} + +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} + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${objectCSA} 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 + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +eigen.o : eigen.f + ${FC} ${FFLAGS2} ${CPPFLAGS} eigen.f + +blas.o : blas.f + ${FC} ${FFLAGS2} ${CPPFLAGS} blas.f + +add.o : add.f + ${FC} ${FFLAGS2} ${CPPFLAGS} add.f diff --git a/source/unres/src_MD-M-newcorr/Makefile_jubl-opt b/source/unres/src_MD-M-newcorr/Makefile_jubl-opt new file mode 100644 index 0000000..b89fe31 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_jubl-opt @@ -0,0 +1,117 @@ +CPPFLAGS = -WF,-DAIX -WF,-DISNAN -WF,-DUNRES -WF,-DMP -WF,-DMPI \ + -WF,-DSPLITELE -WF,-DPROCOR -WF,-DAMD64 -WF,-DLANG0 +#-WF,-DTIMING_ENE -WF,-DTIMING +# -WF,-DCRYST_BOND -WF,-DCRYST_THETA -WF,-DCRYST_SC + + +#FC= mpixlf77 -pg +FC= mpixlf77 +CC= bgcc + +OPT = -O3 -qarch=450d -qtune=450 + +FFLAGS = -c ${OPT} +FFLAGS1 = -c -g -O3 -qarch=450d -qtune=450 +FFLAGS2 = -c -g -O0 -qarch=450d -qtune=450 +FFLAGSE = -c -O4 -qipa -Q+scalar -qhot=simd -qarch=450d -qtune=450 + +BIN = ../bin/unres_Tc_procor_new800_jugene.exe +LIBS = xdrf/libxdrf.a -qipa + +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} + 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 + +energy_p_new.o : energy_p_new.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +fitsq.o : fitsq.f + ${FC} ${FFLAGS2} fitsq.f diff --git a/source/unres/src_MD-M-newcorr/Makefile_jubl-opt-oldparm b/source/unres/src_MD-M-newcorr/Makefile_jubl-opt-oldparm new file mode 100644 index 0000000..4c883a9 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_jubl-opt-oldparm @@ -0,0 +1,116 @@ +CPPFLAGS = -WF,-DAIX -WF,-DISNAN -WF,-DUNRES -WF,-DMP -WF,-DMPI \ + -WF,-DSPLITELE -WF,-DPROCOR -WF,-DAMD64 -WF,-DLANG0 \ + -WF,-DCRYST_BOND -WF,-DCRYST_THETA -WF,-DCRYST_SC -WF,-DTIMING_ENE + + +#FC= mpixlf77 -pg +FC= mpixlf77 +CC= bgcc + +OPT = -O3 -qarch=450d -qtune=450 + +FFLAGS = -c ${OPT} +FFLAGS1 = -c -g -O3 -qarch=450d -qtune=450 +FFLAGS2 = -c -g -O0 -qarch=450d -qtune=450 +FFLAGSE = -c -O4 -qipa -Q+scalar -qhot=simd -qarch=450d -qtune=450 + +BIN = ../bin/unres_Tc_procor_new700_jugene-oldparm.exe +LIBS = xdrf/libxdrf.a -qipa + +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} + 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 + +energy_p_new.o : energy_p_new.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +fitsq.o : fitsq.f + ${FC} ${FFLAGS2} fitsq.f diff --git a/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc new file mode 100644 index 0000000..fa4db65 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc @@ -0,0 +1,104 @@ +# mpich def +INSTALL_DIR = /usr/local/mpich-1.2.0 +# +#FC= /usr/local/opt/intel/compiler60/ia32/bin/ifc +FC= ifc +OPT = -O3 -ip -w -pc64 -tpp6 + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -tpp6 -w -g -d2 -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -tpp6 -w -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -tpp6 -w -O3 -ipo -ipo_obj -pc64 -opt_report -I$(INSTALL_DIR)/include + +BIN = ${HOME}/UNRES/NEW/bin/unres_ifc8.exe +LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich -lpmpich -Vaxlib -openmp +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI -DPGI +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +ARCH = LINUX +PP = /lib/cpp -P + +all: unresCSA + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +objectCSA = unres_CSA.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 energy_p_new.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 contact.o djacob.o entmcm.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 proc_proc.o mcmf.o \ + test.o banach.o distfit.o rmsd.o elecont.o dihed_cons.o +#fputrap.o zscore.o + +unresCSA: ${objectCSA} + cc -o compinfo compinfo.c + ./compinfo + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${objectCSA} cinfo.o ${LIBS} -Wl,-Bstatic -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-M-newcorr/Makefile_lnx_ifc10_em64 b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64 new file mode 100644 index 0000000..f2b013d --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64 @@ -0,0 +1,128 @@ +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI \ + -DPGI -DSPLITELE -DISNAN -DAMD64 \ + -DPROCOR +# -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +## -DPROCOR +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +#INSTALL_DIR = /usr/local/mpich-1.2.0 +INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/ +# +#FC= /usr/local/opt/intel/compiler60/ia32/bin/ifc +FC= ifort + +OPT = -O3 -ip -w + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -w -g -d2 -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -w -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -w -O3 -ipo -ipo_obj -opt_report -I$(INSTALL_DIR)/include + +BIN = unres_Tc_procor_new_em64.exe +#LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich xdrf/libxdrf.a +#LIBS = -L$(INSTALL_DIR)/lib_ifort -lmpich xdrf/libxdrf.a +LIBS = -L$(INSTALL_DIR)/lib -lmpich xdrf_em64/libxdrf.a -g -d2 -CA -CB + +ARCH = LINUX +PP = /lib/cpp -P + +all: unresCSA + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +objectCSA = unres_CSA.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 energy_p_new.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 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.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split.o \ + q_measure3.o econstr_local.o gnmr1.o check_sc_map.o check_bond.o + +unresCSA: ${objectCSA} + cc -o compinfo compinfo.c + ./compinfo + ${FC} ${FFLAGS} cinfo.f + ${FC} -static-libcxa ${OPT} ${objectCSA} cinfo.o ${LIBS} -o ${BIN} + mv ${BIN} ../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 + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +readrtns_CSA.o : readrtns_CSA.F + ${FC} ${FFLAGS1} ${CPPFLAGS} readrtns_CSA.F + +MREMD.o : MREMD.F + ${FC} ${FFLAGS1} ${CPPFLAGS} MREMD.F + diff --git a/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_galera b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_galera new file mode 100644 index 0000000..cf0d3a5 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_galera @@ -0,0 +1,130 @@ +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI \ + -DPGI -DSPLITELE -DISNAN -DAMD64 \ + -DPROCOR +# -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +#INSTALL_DIR = /usr/local/mpich-1.2.0 +#INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/ +INSTALL_DIR = /opt/mpi/mvapich +# +#FC= /usr/local/opt/intel/compiler60/ia32/bin/ifc +FC= ifort +FCL = ${INSTALL_DIR}/bin/mpif77 +CC = cc + +OPT = -O3 -ip -w + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -w -g -d2 -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -w -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -w -O3 -ipo -ipo_obj -opt_report -I$(INSTALL_DIR)/include + +BIN = ../bin/unres_Tc_procor_new_em64-lang-D-1000.exe +LIBS = -L$(INSTALL_DIR)/lib -lmpich -lpthread xdrf_em64/libxdrf.a -g -d2 -CA -CB + +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.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: ${object} + cc -o compinfo compinfo.c + ./compinfo + ${FC} ${FFLAGS} cinfo.f + ${FCL} -static-libcxa ${OPT} ${object} 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 + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +readrtns_CSA.o : readrtns_CSA.F + ${FC} ${FFLAGS1} ${CPPFLAGS} readrtns_CSA.F + +MREMD.o : MREMD.F + ${FC} ${FFLAGS1} ${CPPFLAGS} MREMD.F + +fitsq.o : fitsq.f + ${FC} ${FFLAGS2} fitsq.f diff --git a/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_galera-oldparm b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_galera-oldparm new file mode 100644 index 0000000..4efcbee --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_galera-oldparm @@ -0,0 +1,131 @@ +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI \ + -DPGI -DSPLITELE -DISNAN -DAMD64 \ + -DPROCOR \ + -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +## -DPROCOR +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +#INSTALL_DIR = /usr/local/mpich-1.2.0 +#INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/ +INSTALL_DIR = /opt/mpi/mvapich +# +#FC= /usr/local/opt/intel/compiler60/ia32/bin/ifc +FC= ifort +FCL = ${INSTALL_DIR}/bin/mpif77 +CC = cc + +OPT = -O3 -ip -w + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -w -g -d2 -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -w -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -w -O3 -ipo -ipo_obj -opt_report -I$(INSTALL_DIR)/include + +BIN = ../bin/unres_Tc_procor_new_em64-lang-oldparm-D-1000.exe +LIBS = -L$(INSTALL_DIR)/lib -lmpich -lpthread xdrf_em64/libxdrf.a -g -d2 -CA -CB + +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.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: ${object} + cc -o compinfo compinfo.c + ./compinfo + ${FC} ${FFLAGS} cinfo.f + ${FCL} -static-libcxa ${OPT} ${object} 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 + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +readrtns_CSA.o : readrtns_CSA.F + ${FC} ${FFLAGS1} ${CPPFLAGS} readrtns_CSA.F + +MREMD.o : MREMD.F + ${FC} ${FFLAGS1} ${CPPFLAGS} MREMD.F + +fitsq.o : fitsq.f + ${FC} ${FFLAGS2} fitsq.f diff --git a/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_mpi2 b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_mpi2 new file mode 100644 index 0000000..c9228ca --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc10_em64_mpi2 @@ -0,0 +1,146 @@ +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 + +FC= ifort +FCL= ${INSTALL_DIR}/bin/mpif77 + +OPT = -O3 -ip -w -xO + +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 -xO -O3 -ipo -ipo_obj -opt_report -I$(INSTALL_DIR)/include + + +BIN = ../bin/unres_Tc_procor_new_em64_mpich2-lang.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 + +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-M-newcorr/Makefile_lnx_ifc8 b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc8 new file mode 100644 index 0000000..5b5eeee --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_lnx_ifc8 @@ -0,0 +1,127 @@ +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI \ + -DPGI -DSPLITELE -DISNAN \ + -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +## -DPROCOR +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +#INSTALL_DIR = /usr/local/mpich-1.2.0 +INSTALL_DIR = /usr/local/mpich-1.2.7p1_intel-8.0_ssh +# +#FC= /usr/local/opt/intel/compiler60/ia32/bin/ifc +FC= ifort + +OPT = -O3 -ip -w -pc64 -tpp6 + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -tpp6 -w -g -d2 -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -tpp6 -w -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -tpp6 -w -O3 -ipo -ipo_obj -pc64 -opt_report -I$(INSTALL_DIR)/include + +BIN = unres_Tc_noprocor.exe +#LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich xdrf/libxdrf.a +#LIBS = -L$(INSTALL_DIR)/lib_ifort -lmpich xdrf/libxdrf.a +LIBS = -L$(INSTALL_DIR)/lib -lmpich xdrf/libxdrf.a -g -d2 -CA -CB + +ARCH = LINUX +PP = /lib/cpp -P + +all: unresCSA + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +objectCSA = unres_CSA.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 energy_p_new.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 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.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split.o \ + q_measure3.o econstr_local.o gnmr1.o check_sc_map.o check_bond.o + +unresCSA: ${objectCSA} + cc -o compinfo compinfo.c + ./compinfo + ${FC} ${FFLAGS} cinfo.f + ${FC} -static-libcxa ${OPT} ${objectCSA} cinfo.o ${LIBS} -o ${BIN} + mv ${BIN} ../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 + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +readrtns_CSA.o : readrtns_CSA.F + ${FC} ${FFLAGS1} ${CPPFLAGS} readrtns_CSA.F + +MREMD.o : MREMD.F + ${FC} ${FFLAGS1} ${CPPFLAGS} MREMD.F + diff --git a/source/unres/src_MD-M-newcorr/Makefile_lnx_pgf90 b/source/unres/src_MD-M-newcorr/Makefile_lnx_pgf90 new file mode 100644 index 0000000..844c8c6 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_lnx_pgf90 @@ -0,0 +1,120 @@ +FC= mpif90 +OPT = -fast -pc 64 -tp p6 \ +-Minline=name:scalar2,scalar,transpose2,matvec2,prodmat3 +#OPT = -C -g -fast -pc 64 -tp p6 + +OPT1 = -C -g -fast -pc 64 -tp p6 +#OPT = -C -g + +# -Mvect <---slows down +# -Minline=name:matmat2 <---false convergence + +CFLAGS = -DSGI +FFLAGS = -c ${OPT} +FFLAGS1 = -c ${OPT1} + +BIN = /users/adam/MEY_MD/bin/unres_MD_Tc-fine-newmat.exe +LIBS = -Lxdrf -lxdrf +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI -DPGI \ + -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -DPARVEC #-DPARINT -DPARINTDER +#-DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +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 + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} proc_proc.o cinfo.o ${LIBS} -Wl,-Bstatic -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} ${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} ${FFLAGS} ${CPPFLAGS} eigen.f + +blas.o : blas.f + ${FC} ${FFLAGS} ${CPPFLAGS} blas.f + +add.o : add.f + ${FC} ${FFLAGS} ${CPPFLAGS} add.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-M-newcorr/Makefile_osf_f90 b/source/unres/src_MD-M-newcorr/Makefile_osf_f90 new file mode 100644 index 0000000..f9fa711 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_osf_f90 @@ -0,0 +1,79 @@ +# +FC= f90 +OPT = -arch ev67 -tune ev67 -fast -fpe1 -f77 +OPT1 = -arch ev67 -tune ev67 -fast -fpe1 -f77 +#OPT1 = -fast -g3 -arch ev67 -fpe4 -f77 -C +#OPT = -g3 -arch ev67 -tune ev67 -C -fpe1 -f77 + +FFLAGS = -c ${OPT} +FFLAGS1 = -c ${OPT1} + +BIN = ${HOME}/UNRES/MD/bin/unres_MD_procor-Tc.exe +LIBS = -lmpi -lelan xdrf/libxdrf.a +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI -DPGI -DOSF -DSPLITELE -DPROCOR -DISNAN +#CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI -DPGI -DOSF -DISNAN -DSPLITELE +#-DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +ARCH = LINUX +PP = /lib/cpp -P + +all: unresCSA + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F +.c.o: + ${CC} -c ${CPPFLAGS} $*.c + + +objectCSA = unres_CSA.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 energy_p_new.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 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.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split.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 + +newconf.o: newconf.f + ${FC} ${FFLAGS} ${CPPFLAGS} newconf.f + +together.o: together.F + ${FC} ${FFLAGS1} ${CPPFLAGS} together.F + +test.o: test.F + ${FC} ${FFLAGS1} ${CPPFLAGS} test.F + +elecont.o: elecont.f + ${FC} ${FFLAGS} ${CPPFLAGS} elecont.f + +gen_rand_conf.o:gen_rand_conf.F + ${FC} ${FFLAGS1} ${CPPFLAGS} gen_rand_conf.F + +djacob.o: djacob.f + ${FC} ${FFLAGS1} ${CPPFLAGS} djacob.f + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS1} ${CPPFLAGS} chainbuild.F +cartder.o: cartder.F + ${FC} ${FFLAGS1} ${CPPFLAGS} cartder.F + diff --git a/source/unres/src_MD-M-newcorr/Makefile_win_ifl b/source/unres/src_MD-M-newcorr/Makefile_win_ifl new file mode 100644 index 0000000..309718c --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_win_ifl @@ -0,0 +1,53 @@ +CC= icl.exe +FC= ifl.exe + +FFLAGS = /Qlowercase /c /Qip /Qfpp2 /Ox /G6 /w90 /w /cm /DUNRES /DMOMENT /DMP /DMPI /DPGI /DWINIFL +CCFLAGS = /c /Qlowercase /DUNRES /DMOMENT /DMP /DMPI /DPGI /DWIN /DWINIFL +LDFLAGS = /ounres_ifl.exe C:\\Progra~1\\MPIPro\\lib\\MPIPro.lib \ + C:\\Progra~1\\MPIPro\\lib\\MPIPro_abs.lib + +all: unresCSA + +.SUFFIXES: .f .c + +.f.o: + $(FC) $(FFLAGS) $*.f + touch $*.o +.F.o: + $(FC) $(FFLAGS) $*.F + touch $*.o +.c.o: + $(CC) $(CCFLAGS) $*.c + touch $*.o + +objectCSA = unres_CSA.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 energy_p_new.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 contact.o djacob.o entmcm.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 proc_proc.o mcmf.o \ + test.o banach.o distfit.o rmsd.o elecont.o dihed_cons.o +#fputrap.o zscore.o + +objectCSAobj = unres_CSA.obj arcos.obj cartprint.obj chainbuild.obj convert.obj initialize_p.obj \ + matmult.obj readrtns_CSA.obj parmread.obj gen_rand_conf.obj printmat.obj map.obj \ + pinorm.obj randgens.obj rescode.obj intcor.obj timing.obj misc.obj intlocal.obj \ + cartder.obj checkder_p.obj energy_p_new.obj gradient_p.obj minimize_p.obj sumsld.obj \ + cored.obj rmdd.obj geomout.obj readpdb.obj regularize.obj thread.obj fitsq.obj mcm.obj \ + mc.obj bond_move.obj refsys.obj check_sc_distr.obj contact.obj djacob.obj entmcm.obj \ + together.obj csa.obj minim_jlee.obj shift.obj diff12.obj bank.obj newconf.obj ran.obj \ + indexx.obj MP.obj compare_s1.obj prng_32.obj proc_proc.obj mcmf.obj \ + test.obj banach.obj distfit.obj rmsd.obj elecont.obj dihed_cons.obj + +unresCSA: $(objectCSA) + $(FC) $(FFLAGS) cinfo.f + $(FC) $(LDFLAGS) $(objectCSAobj) cinfo.obj +link: + $(FC) $(LDFLAGS) $(objectCSAobj) cinfo.obj + +clean: + del *.obj + del *.o + diff --git a/source/unres/src_MD-M-newcorr/Makefile_win_pgf90 b/source/unres/src_MD-M-newcorr/Makefile_win_pgf90 new file mode 100644 index 0000000..e5530ba --- /dev/null +++ b/source/unres/src_MD-M-newcorr/Makefile_win_pgf90 @@ -0,0 +1,43 @@ +CC= pgcc +FC= pgf90 +OPT = -fast -pc 64 -tp p6 \ +-Minline=name:scalar2,scalar,transpose2,matvec2,prodmat3 + +#FFLAGS = -c $(OPT) -Ic:/progra~1/mpipro/include +FFLAGS = -c $(OPT) -Ih:/users/czarek/mpipro/include + +LIBS = c:/progra~1/mpipro/lib/MPIPro_pgf.lib \ + c:/progra~1/mpipro/lib/MPIPro.lib + +CPPFLAGS = -DUNRES -DMP -DMPI -DPGI -DWINPGI +#-DMOMENT +#-DCRYST_TOR +#-DDEBUG + +all: unresCSA + +.SUFFIXES: .F +.F.o: + $(FC) $(FFLAGS) $(CPPFLAGS) $*.F +.c.o: + $(CC) -c $(CPPFLAGS) $*.c + + +objectCSA = unres_CSA.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 energy_p_new.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 contact.o djacob.o entmcm.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 proc_proc.o mcmf.o \ + test.o banach.o distfit.o rmsd.o elecont.o dihed_cons.o +#fputrap.o + +unresCSA: $(objectCSA) + $(FC) $(FFLAGS) cinfo.f + $(FC) $(OPT) $(objectCSA) cinfo.o $(LIBS) -o unres_pg + +clean: + /bin/rm *.o + diff --git a/source/unres/src_MD-M-newcorr/README b/source/unres/src_MD-M-newcorr/README new file mode 100644 index 0000000..2b1d2be --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/TAU b/source/unres/src_MD-M-newcorr/TAU new file mode 100644 index 0000000..231a93e --- /dev/null +++ b/source/unres/src_MD-M-newcorr/TAU @@ -0,0 +1,6 @@ +module load tau/tau-2.17 +#with preprocessor +setenv TAU_OPTIONS '-optPreProcess -optVerbose' +setenv TAU_THROTTLE 1 +setenv TAU_THROTTLE_NUMCALLS 400000 +setenv TAU_THROTTLE_PERCALL 3000 diff --git a/source/unres/src_MD-M-newcorr/TAU_setup.sh b/source/unres/src_MD-M-newcorr/TAU_setup.sh new file mode 100755 index 0000000..1423b72 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/TAU_setup.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# +# Adding tau +# Must be executed from command line, don't know why! +#soft add +tau +# +# With preprocessor +# +export TAU_OPTIONS='-optPreProcess -optVerbose' +# +# sets tau makefile +# +export TAU_MAKEFILE=/soft/apps/tau/tau-2.17.1/bgp/lib/Makefile.tau-mpi-pdt + +export TAU_OPTIONS='-optTauSelectFile=select.tau -optPreProcess -optVerbose -optKeepFiles' diff --git a/source/unres/src_MD-M-newcorr/WVRND b/source/unres/src_MD-M-newcorr/WVRND new file mode 100644 index 0000000..0ebf6db --- /dev/null +++ b/source/unres/src_MD-M-newcorr/WVRND @@ -0,0 +1,32 @@ +# This viminfo file was generated by Vim 6.4. +# You may edit it if you're careful! + +# Value of 'encoding' when this file was written +*encoding=utf-8 + + +# hlsearch on (H) or off (h): +~h +# Command Line History (newest to oldest): +:q + +# Search String History (newest to oldest): + +# Expression History (newest to oldest): + +# Input Line History (newest to oldest): + +# Input Line History (newest to oldest): + +# Registers: + +# File marks: +'0 1 0 ~/UNRES/src_TC_newmat.tau-timing/grep + +# Jumplist (newest first): +-' 1 0 ~/UNRES/src_TC_newmat.tau-timing/grep + +# History of marks within files (newest to oldest): + +> ~/UNRES/src_TC_newmat.tau-timing/grep + " 1 0 diff --git a/source/unres/src_MD-M-newcorr/add.f b/source/unres/src_MD-M-newcorr/add.f new file mode 100644 index 0000000..fd91a70 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/arcos.f b/source/unres/src_MD-M-newcorr/arcos.f new file mode 100644 index 0000000..f054118 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/banach.f b/source/unres/src_MD-M-newcorr/banach.f new file mode 100644 index 0000000..7c43d77 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/bank.F b/source/unres/src_MD-M-newcorr/bank.F new file mode 100644 index 0000000..5636ba0 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/bank.F @@ -0,0 +1,1084 @@ +cc--------------------------------- + subroutine refresh_bank(ntrial) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + character chacc + integer iaccn + double precision l_diff(mxio),denep + + do i=0,mxmv + do j=1,3 + nstatnx_tot(i,j)=nstatnx_tot(i,j)+nstatnx(i,j) + nstatnx(i,j)=0 + enddo + enddo + +c loop over all newly obtained conformations + do n=1,ntrial + chacc=' ' + iaccn=0 + nstatnx(movernx(n),1)=nstatnx(movernx(n),1)+1 +cccccccccccccccccccccccccccccccccccccccccccc +cjlee + if(iref.ne.0) then + if(rmsn(n).gt.rmscut.or.pncn(n).lt.pnccut) goto 100 + endif +cjlee + if(etot(n).gt.ebmax) goto 100 +c Find the conformation closest to the conformation n in the bank + difmin=9.d9 + do m=1,nbank + call get_diff12(dihang(1,1,1,n),bvar(1,1,1,m),l_diff(m)) + if(l_diff(m).lt.difmin) then + difmin=l_diff(m) + idmin=m + endif + enddo + + if(difmin.lt.cutdif) then +c n is redundant to idmin + if(etot(n).lt.bene(idmin)) then + if(etot(n).lt.bene(idmin)-0.01d0) then + ibank(idmin)=0 + jbank(idmin)=0 + endif + denep=bene(idmin)-etot(n) + call replace_bvar(idmin,n) +crc Update dij + do i1=1,nbank + if (i1.ne.idmin) then + dij(i1,idmin)=l_diff(i1) + dij(idmin,i1)=l_diff(i1) + endif + enddo + chacc='c' + iaccn=idmin + nstatnx(movernx(n),2)=nstatnx(movernx(n),2)+1 + if(idmin.eq.ibmax) call find_max + endif + else +c got new conformation + del_ene=0.0d0 + if(ebmax-ebmin.gt.del_ene) then + denep=ebmax-etot(n) + call replace_bvar(ibmax,n) +crc Update dij + do i1=1,nbank + if (i1.ne.ibmax) then + dij(i1,ibmax)=l_diff(i1) + dij(ibmax,i1)=l_diff(i1) + endif + enddo + chacc='f' + iaccn=ibmax + nstatnx(movernx(n),3)=nstatnx(movernx(n),3)+1 + ibank(ibmax)=0 + jbank(ibmax)=0 + call find_max + else + if(del_ene.lt.0.0001) then + write (iout,*) 'ERROR in refresh_bank: ' + write (iout,*) 'ebmax: ',ebmax + write (iout,*) 'ebmin: ',ebmin + write (iout,*) 'del_ene: ',del_ene +crc call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif +cjp nbmax is never defined so condition below is always false +c if(nbank.lt.nbmax) then +c nbank=nbank+1 +c call replace_bvar(nbank,n) +c ibank(nbank)=0 +c jbank(nbank)=0 +c else + call replace_bvar(ibmax,n) + ibank(ibmax)=0 + jbank(ibmax)=0 + call find_max +c endif + endif + endif +cccccccccccccccccccccccccccccccccccccccccccc + 100 continue + if (iaccn.eq.0) then + if (iref.eq.0) then + write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a4,i3,i4,3i5)') + & indb(n,2),' e ',indb(n,3),indb(n,1),' etot ',etot(n),' mv ', + & indb(n,5),indb(n,4),indb(n,7),indb(n,8),indb(n,9) + else + write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a4,i3,i4,3i5 + & ,a5,0pf4.1,a5,f3.0)') + & indb(n,2),' e ',indb(n,3),indb(n,1),' etot ',etot(n),' mv ', + & indb(n,5),indb(n,4),indb(n,7),indb(n,8),indb(n,9), + & ' rms ',rmsn(n),' %NC ',pncn(n)*100 + endif + else + if (iref.eq.0) then + write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a4,i3,i4,3i5, + & 1x,a1,i4,0pf8.1,0pf8.1)') + & indb(n,2),' e ',indb(n,3),indb(n,1),' etot ',etot(n),' mv ', + & indb(n,5),indb(n,4),indb(n,7),indb(n,8),indb(n,9), + & chacc,iaccn,difmin,denep + else + write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a4,i3,i4,3i5,a5, + & 0pf4.1,a5,f3.0,1x,a1,i4,0pf8.1,0pf8.1)') + & indb(n,2),' e ',indb(n,3),indb(n,1),' etot ',etot(n),' mv ', + & indb(n,5),indb(n,4),indb(n,7),indb(n,8),indb(n,9), + & ' rms ',rmsn(n),' %NC ',pncn(n)*100, + & chacc,iaccn,difmin,denep + endif + endif + enddo +c end of loop over all newly obtained conformations + do i=0,mxmv + if(nstatnx(i,1).ne.0) then + if (i.le.9) then + write(iout,'(a4,i1,a7,i4,a7,i4,a5,i4,a5,f5.1)') + & '## N',i,' total=',nstatnx(i,1), + & ' close=',nstatnx(i,2),' far=',nstatnx(i,3), + & ' %acc',(nstatnx(i,2)+nstatnx(i,3))*100.0/nstatnx(i,1) + else + write(iout,'(a3,i2,a7,i4,a7,i4,a5,i4,a5,f5.1)') + & '##N',i,' total=',nstatnx(i,1), + & ' close=',nstatnx(i,2),' far=',nstatnx(i,3), + & ' %acc',(nstatnx(i,2)+nstatnx(i,3))*100.0/nstatnx(i,1) + endif + else + if (i.le.9) then + write(iout,'(a4,i1,a7,i4,a7,i4,a5,i4,a5,f5.1)') + & '## N',i,' total=',nstatnx(i,1), + & ' close=',nstatnx(i,2),' far=',nstatnx(i,3), + & ' %acc',0.0 + else + write(iout,'(a3,i2,a7,i4,a7,i4,a5,i4,a5,f5.1)') + & '##N',i,' total=',nstatnx(i,1), + & ' close=',nstatnx(i,2),' far=',nstatnx(i,3), + & ' %acc',0.0 + endif + endif + enddo + call flush(iout) +crc Update dij +crc moved up, saves some get_diff12 calls +crc +crc do i1=1,nbank-1 +crc do i2=i1+1,nbank +crc if(jbank(i1).eq.0.or.jbank(i2).eq.0) then +crc call get_diff12(bvar(1,1,1,i1),bvar(1,1,1,i2),diff) +crc dij(i1,i2)=diff +crc dij(i2,i1)=diff +crc endif +crc enddo +crc enddo + + do i=1,nbank + jbank(i)=1 + enddo + + return + end +c--------------------------------- + subroutine replace_bvar(iold,inew) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + + if (iold.gt.mxio .or. iold.lt.1 .or. inew.gt.mxio .or. inew.lt.1) + & then + write (iout,*) 'Dimension ERROR in REPLACE_BVAR: IOLD',iold, + & ' INEW',inew + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif + do k=1,numch + do j=2,nres-1 + do i=1,4 + bvar(i,j,k,iold)=dihang(i,j,k,inew) + enddo + enddo + enddo + bene(iold)=etot(inew) + brmsn(iold)=rmsn(inew) + bpncn(iold)=pncn(inew) + + if(bene(iold).lt.ebmin) then + ebmin=bene(iold) + ibmin=iold + endif + + if(vdisulf) then + bvar_nss(iold)=nss_out(inew) +cd write(iout,*) 'SS BANK',iold,bvar_nss(iold) + do i=1,bvar_nss(iold) + bvar_ss(1,i,iold)=iss_out(i,inew) + bvar_ss(2,i,iold)=jss_out(i,inew) +cd write(iout,*) 'SS',bvar_ss(1,i,iold)-nres, +cd & bvar_ss(2,i,iold)-nres + enddo + + bvar_ns(iold)=ns-2*bvar_nss(iold) +cd write(iout,*) 'CYS #free ', bvar_ns(iold) + k=0 + do i=1,ns + j=1 + do while( iss(i).ne.iss_out(j,inew)-nres .and. + & iss(i).ne.jss_out(j,inew)-nres .and. + & j.le.nss_out(inew)) + j=j+1 + enddo + if (j.gt.nss_out(inew)) then + k=k+1 + bvar_s(k,iold)=iss(i) + endif + enddo +cd write(iout,*) 'CYS free',(bvar_s(k,iold),k=1,bvar_ns(iold)) + endif + + return + end +c--------------------------------------- + subroutine write_rbank(jlee,adif,nft) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + + open(icsa_rbank,file=csa_rbank,status="unknown") + write (icsa_rbank,900) jlee,nbank,nstep,nft,icycle,adif + do k=1,nbank + write (icsa_rbank,952) k,rene(k),rrmsn(k),rpncn(k) + do j=1,numch + do l=2,nres-1 + write (icsa_rbank,850) (rad2deg*rvar(i,l,j,k),i=1,4) + enddo + enddo + enddo + close(icsa_rbank) + + 850 format (10f8.3) + 900 format (1x,"jlee =",i3,3x,"nbank =",i4,3x,"nstep =", + & i8,i10,i2,f15.5) + 952 format (1x,'#',i4,' total E ',1pe14.5,' rmsd from N ',0pf8.3 + & ,' %NC ',0pf5.2) + + return + end +c--------------------------------------- + subroutine read_rbank(jlee,adif) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.SETUP' + character*80 karta + + open(icsa_rbank,file=csa_rbank,status="old") + read (icsa_rbank,901) jleer,nbankr,nstepr,nftr,icycler,adif + print *,jleer,nbankr,nstepr,nftr,icycler,adif +c print *, 'adif from read_rbank ',adif + if(nbankr.ne.nbank) then + write (iout,*) 'ERROR in READ_BANK: NBANKR',nbankr, + & ' NBANK',nbank + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif + if(jleer.ne.jlee) then + write (iout,*) 'ERROR in READ_BANK: JLEER',jleer, + & ' JLEE',jlee + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif + + kk=0 + do k=1,nbankr + read (icsa_rbank,'(a80)') karta + write(iout,*) "READ_RBANK: kk=",kk + write(iout,*) karta +c if (index(karta,"*").gt.0) then +c write (iout,*) "***** Stars in bankr ***** k=",k, +c & " skipped" +c do j=1,numch +c do l=2,nres-1 +c read (30,850) (rdummy,i=1,4) +c enddo +c enddo +c else + kk=kk+1 + call reada(karta,"total E",rene(kk),1.0d20) + call reada(karta,"rmsd from N",rrmsn(kk),0.0d0) + call reada(karta,"%NC",rpncn(kk),0.0d0) + write(iout,*)"total E",bene(kk),"rmsd from N",brmsn(kk), + & "%NC",bpncn(kk),ibank(kk) +c read (icsa_rbank,953) kdummy,rene(kk),rrmsn(kk),rpncn(kk) + do j=1,numch + do l=2,nres-1 + read (icsa_rbank,850) (rvar(i,l,j,kk),i=1,4) +c write (iout,850) (rvar(i,l,j,kk),i=1,4) + do i=1,4 + rvar(i,l,j,kk)=deg2rad*rvar(i,l,j,kk) + enddo + enddo + enddo +c endif + enddo +cd write (*,*) "read_rbank ******************* kk",kk, +cd & "nbankr",nbankr + if (kk.lt.nbankr) nbankr=kk +cd do kk=1,nbankr +cd print *,"kk=",kk +cd do j=1,numch +cd do l=2,nres-1 +cd write (*,850) (rvar(i,l,j,kk),i=1,4) +cd enddo +cd enddo +cd enddo + close(icsa_rbank) + + 850 format (10f8.3) + 901 format (1x,6x,i3,3x,7x,i4,3x,7x,i8,i10,i2,f15.5) + 953 format (1x,1x,i4,9x,f12.3,13x,f8.3,5x,f5.2) + + return + end +c--------------------------------------- + subroutine write_bank(jlee,nft) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + character*7 chtmp + character*40 chfrm + external ilen + + open(icsa_bank,file=csa_bank,status="unknown") + write (icsa_bank,900) jlee,nbank,nstep,nft,icycle,cutdif + write (icsa_bank,902) nglob_csa, eglob_csa + open (igeom,file=intname,status='UNKNOWN') + do k=1,nbank + write (icsa_bank,952) k,bene(k),brmsn(k),bpncn(k),ibank(k) + if (vdisulf) write (icsa_bank,'(101i4)') + & bvar_nss(k),((bvar_ss(j,i,k),j=1,2),i=1,bvar_nss(k)) + do j=1,numch + do l=2,nres-1 + write (icsa_bank,850) (rad2deg*bvar(i,l,j,k),i=1,4) + enddo + enddo + if (bvar_nss(k).le.9) then + write (igeom,'(I5,F10.3,I2,9(1X,2I3))') k,bene(k), + & bvar_nss(k),(bvar_ss(1,i,k),bvar_ss(2,i,k),i=1,bvar_nss(k)) + else + write (igeom,'(I5,F10.3,I2,9(1X,2I3))') k,bene(k), + & bvar_nss(k),(bvar_ss(1,i,k),bvar_ss(2,i,k),i=1,9) + write (igeom,'(3X,11(1X,2I3))') (bvar_ss(1,i,k), + & bvar_ss(2,i,k),i=10,bvar_nss(k)) + endif + write (igeom,200) (rad2deg*bvar(1,i,1,k),i=2,nres-1) + write (igeom,200) (rad2deg*bvar(2,i,1,k),i=2,nres-2) + write (igeom,200) (rad2deg*bvar(3,i,1,k),i=2,nres-1) + write (igeom,200) (rad2deg*bvar(4,i,1,k),i=2,nres-1) + enddo + close(icsa_bank) + close(igeom) + + if (nstep/200.gt.ilastnstep) then + + ilastnstep=(ilastnstep+1)*1.5 + write(chfrm,'(a2,i1,a1)') '(i',int(dlog10(dble(nstep))+1),')' + write(chtmp,chfrm) nstep + open(icsa_int,file=prefix(:ilen(prefix)) + & //'_'//chtmp(:ilen(chtmp))//'.int',status='UNKNOWN') + do k=1,nbank + if (bvar_nss(k).le.9) then + write (icsa_int,'(I5,F10.3,I2,9(1X,2I3))') k,bene(k), + & bvar_nss(k),(bvar_ss(1,i,k),bvar_ss(2,i,k),i=1,bvar_nss(k)) + else + write (icsa_int,'(I5,F10.3,I2,9(1X,2I3))') k,bene(k), + & bvar_nss(k),(bvar_ss(1,i,k),bvar_ss(2,i,k),i=1,9) + write (icsa_int,'(3X,11(1X,2I3))') (bvar_ss(1,i,k), + & bvar_ss(2,i,k),i=10,bvar_nss(k)) + endif + write (icsa_int,200) (rad2deg*bvar(1,i,1,k),i=2,nres-1) + write (icsa_int,200) (rad2deg*bvar(2,i,1,k),i=2,nres-2) + write (icsa_int,200) (rad2deg*bvar(3,i,1,k),i=2,nres-1) + write (icsa_int,200) (rad2deg*bvar(4,i,1,k),i=2,nres-1) + enddo + close(icsa_int) + endif + + + 200 format (8f10.4) + 850 format (10f8.3) + 900 format (1x,"jlee =",i3,3x,"nbank =",i4,3x,"nstep =", + & i8,i10,i2,f15.5) + 902 format (1x,'nglob_csa =',i4,' eglob_csa =',1pe14.5) + 952 format (1x,'#',i4,' total E ',1pe14.5,' rmsd from N ',0pf8.3, + & ' %NC ',0pf5.2,i5) + + return + end +c--------------------------------------- + subroutine write_bank_reminimized(jlee,nft) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.SBRIDGE' + + open(icsa_bank_reminimized,file=csa_bank_reminimized, + & status="unknown") + write (icsa_bank_reminimized,900) + & jlee,nbank,nstep,nft,icycle,cutdif + open (igeom,file=intname,status='UNKNOWN') + do k=1,nbank + write (icsa_bank_reminimized,952) k,bene(k),brmsn(k), + & bpncn(k),ibank(k) + do j=1,numch + do l=2,nres-1 + write (icsa_bank_reminimized,850) (rad2deg*bvar(i,l,j,k),i=1,4) + enddo + enddo + if (nss.le.9) then + write (igeom,'(I5,F10.3,I2,9(1X,2I3))') k,bene(k), + & nss,(ihpb(i),jhpb(i),i=1,nss) + else + write (igeom,'(I5,F10.3,I2,9(1X,2I3))') k,bene(k), + & nss,(ihpb(i),jhpb(i),i=1,9) + write (igeom,'(3X,11(1X,2I3))') (ihpb(i),jhpb(i),i=10,nss) + endif + write (igeom,200) (rad2deg*bvar(1,i,1,k),i=2,nres-1) + write (igeom,200) (rad2deg*bvar(2,i,1,k),i=2,nres-2) + write (igeom,200) (rad2deg*bvar(3,i,1,k),i=2,nres-1) + write (igeom,200) (rad2deg*bvar(4,i,1,k),i=2,nres-1) + enddo + close(icsa_bank_reminimized) + close(igeom) + + 200 format (8f10.4) + 850 format (10f8.3) + 900 format (1x,"jlee =",i3,3x,"nbank =",i4,3x,"nstep =", + & i8,i10,i2,f15.5) + 952 format (1x,'#',i4,' total E ',1pe14.5,' rmsd from N ',0pf8.3 + & ,' %NC ',0pf5.2,i5) + + return + end +c--------------------------------- + subroutine read_bank(jlee,nft,cutdifr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + character*80 karta + integer ilen + external ilen + + open(icsa_bank,file=csa_bank,status="old") + read (icsa_bank,901) jlee,nbank,nstep,nft,icycle,cutdifr + read (icsa_bank,902) nglob_csa, eglob_csa +c if(jleer.ne.jlee) then +c write (iout,*) 'ERROR in READ_BANK: JLEER',jleer, +c & ' JLEE',jlee +c call mpi_abort(mpi_comm_world,ierror,ierrcode) +c endif + + kk=0 + do k=1,nbank + read (icsa_bank,'(a80)') karta + write(iout,*) "READ_BANK: kk=",kk + write(iout,*) karta +c if (index(karta,"*").gt.0) then +c write (iout,*) "***** Stars in bank ***** k=",k, +c & " skipped" +c do j=1,numch +c do l=2,nres-1 +c read (33,850) (rdummy,i=1,4) +c enddo +c enddo +c else + kk=kk+1 + call reada(karta,"total E",bene(kk),1.0d20) + call reada(karta,"rmsd from N",brmsn(kk),0.0d0) + call reada(karta,"%NC",bpncn(kk),0.0d0) + read (karta(ilen(karta)-1:),*,end=111,err=111) ibank(kk) + goto 112 + 111 ibank(kk)=0 + 112 continue + write(iout,*)"total E",bene(kk),"rmsd from N",brmsn(kk), + & "%NC",bpncn(kk),ibank(kk) +c read (icsa_bank,953) kdummy,bene(k),brmsn(k),bpncn(k),ibank(k) + if (vdisulf) then + read (icsa_bank,'(101i4)') + & bvar_nss(kk),((bvar_ss(j,i,kk),j=1,2),i=1,bvar_nss(kk)) + bvar_ns(kk)=ns-2*bvar_nss(kk) + write(iout,*) 'read SSBOND',bvar_nss(kk), + & ((bvar_ss(j,i,kk),j=1,2),i=1,bvar_nss(kk)) +cd write(iout,*) 'read CYS #free ', bvar_ns(kk) + l=0 + do i=1,ns + j=1 + do while( iss(i).ne.bvar_ss(1,j,kk)-nres .and. + & iss(i).ne.bvar_ss(2,j,kk)-nres .and. + & j.le.bvar_nss(kk)) + j=j+1 + enddo + if (j.gt.bvar_nss(kk)) then + l=l+1 + bvar_s(l,kk)=iss(i) + endif + enddo +cd write(iout,*)'read CYS free',(bvar_s(l,kk),l=1,bvar_ns(kk)) + endif + do j=1,numch + do l=2,nres-1 + read (icsa_bank,850) (bvar(i,l,j,kk),i=1,4) +c write (iout,850) (bvar(i,l,j,kk),i=1,4) + do i=1,4 + bvar(i,l,j,kk)=deg2rad*bvar(i,l,j,kk) + enddo ! l + enddo ! l + enddo ! j +c endif + enddo ! k + + if (kk.lt.nbank) nbank=kk +cd write (*,*) "read_bank ******************* kk",kk, +cd & "nbank",nbank +cd do kk=1,nbank +cd print *,"kk=",kk +cd do j=1,numch +cd do l=2,nres-1 +cd write (*,850) (bvar(i,l,j,kk),i=1,4) +cd enddo +cd enddo +cd enddo + +c do k=1,nbank +c read (33,953) kdummy,bene(k),brmsn(k),bpncn(k),ibank(k) +c do j=1,numch +c do l=2,nres-1 +c read (33,850) (bvar(i,l,j,k),i=1,4) +c do i=1,4 +c bvar(i,l,j,k)=deg2rad*bvar(i,l,j,k) +c enddo +c enddo +c enddo +c enddo + close(icsa_bank) + + 850 format (10f8.3) + 952 format (1x,'#',i4,' total E ',f12.3,' rmsd from N ',f8.3,i5) + 901 format (1x,6x,i3,3x,7x,i4,3x,7x,i8,i10,i2,f15.5) + 902 format (1x,11x,i4,12x,1pe14.5) + 953 format (1x,1x,i4,9x,f12.3,13x,f8.3,5x,f5.2,i5) + + return + end +c--------------------------------------- + subroutine write_bank1(jlee) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + +#if defined(AIX) || defined(PGI) + open(icsa_bank1,file=csa_bank1,position="append") +#else + open(icsa_bank1,file=csa_bank1,access="append") +#endif + write (icsa_bank1,900) jlee,nbank,nstep,cutdif + do k=1,nbank + write (icsa_bank1,952) k,bene(k),brmsn(k),bpncn(k),ibank(k) + do j=1,numch + do l=2,nres-1 + write (icsa_bank1,850) (rad2deg*bvar(i,l,j,k),i=1,4) + enddo + enddo + enddo + close(icsa_bank1) + 850 format (10f8.3) + 900 format (4x,"jlee =",i5,3x,"nbank =",i5,3x,"nstep =",i10,f15.5) + 952 format (1x,'#',i4,' total E ',1pe14.5,' rmsd from N ',0pf8.3 + & ,' %NC ',0pf5.2,i5) + + return + end +c--------------------------------- + subroutine save_is(ind) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + + index=nbank+ind +c print *, "nbank,ind,index,is(ind) ",nbank,ind,index,is(ind) + if (index.gt.mxio .or. index.lt.1 .or. + & is(ind).gt.mxio .or. is(ind).lt.1) then + write (iout,*) 'Dimension ERROR in SAVE_IS: INDEX',index, + & ' IND',ind,' IS',is(ind) + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif + do k=1,numch + do j=2,nres-1 + do i=1,4 + bvar(i,j,k,index)=bvar(i,j,k,is(ind)) + enddo + enddo + enddo + bene(index)=bene(is(ind)) + ibank(is(ind))=1 + + return + end +c--------------------------------- + subroutine select_is(n,ifar,idum) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + dimension itag(mxio),adiff(mxio) + + iuse=0 + do i=1,nbank + if(ibank(i).eq.0) then + iuse=iuse+1 + itag(iuse)=i + endif + enddo + iusesv=iuse + + if(iuse.eq.0) then + icycle=icycle+1 + do i=1,nbank + if(ibank(i).eq.2) then + ibank(i)=1 + else + ibank(i)=0 + endif + enddo + imade=0 + call get_is(idum,ifar,n,imade,0) +ctest3 call get_is_max(idum,ifar,n,imade,0) + else if(iuse.eq.n) then + do i=1,iuse + is(i)=itag(i) + call save_is(i) + enddo + else if(iuse.lt.n) then +c if(icycle.eq.0) then +c do i=1,n +c ind=mod(i-1,iuse)+1 +c is(i)=itag(ind) +c call save_is(i) +c enddo +c else +c endif + do i=1,iuse + is(i)=itag(i) + call save_is(i) + enddo + imade=iuse +c call get_is_ran(idum,n,imade,1) + call get_is(idum,ifar,n,imade,1) +ctest3 call get_is_max(idum,ifar,n,imade,1) +c if(iusesv.le.n/10) then + if(iusesv.le.0) then + icycle=icycle+1 + do i=1,nbank +c if(ibank(i).eq.2) then +c ibank(i)=1 + if(ibank(i).ge.2) then + ibank(i)=ibank(i)-1 + else + ibank(i)=0 + endif + enddo + endif + else + imade=0 + call get_is(idum,ifar,n,imade,0) +ctest3 call get_is_max(idum,ifar,n,imade,0) + endif + iuse=iusesv + + return + end +c--------------------------------- + subroutine get_is_ran(idum,n,imade,k) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + real ran1,ran2 + dimension itag(mxio),adiff(mxio) + + do j=imade+1,n + iuse=0 + do i=1,nbank + if(ibank(i).eq.k) then + iuse=iuse+1 + itag(iuse)=i + endif + enddo + iran=iuse* ran1(idum)+1 + is(j)=itag(iran) + call save_is(j) + enddo + + return + end +c--------------------------------- + subroutine get_is(idum,ifar,n,imade,k) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + real ran1,ran2 + dimension itag(mxio),adiff(mxio) + + iuse=0 + do i=1,nbank + if(ibank(i).eq.k) then + iuse=iuse+1 + itag(iuse)=i + endif + enddo + iran=iuse* ran1(idum)+1 + imade=imade+1 + is(imade)=itag(iran) + call save_is(imade) + + do i=imade+1,ifar-1 + if(icycle.eq.-1) then + call select_iseed_max(i,k) + else + call select_iseed_min(i,k) +ctest4 call select_iseed_max(i,k) + endif + call save_is(i) + enddo + + do i=ifar,n + call select_iseed_far(i,k) + call save_is(i) + enddo + + return + end +c--------------------------------- + subroutine select_iseed_max(imade1,ik) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + dimension itag(mxio),adiff(mxio) + + iuse=0 + avedif=0.d0 + difmax=0.d0 + do n=1,nbank + if(ibank(n).eq.ik) then + iuse=iuse+1 + diffmn=9.d190 + do imade=1,imade1-1 +c m=nbank+imade +c call get_diff12(bvar(1,1,1,n),bvar(1,1,1,m),diff,idiff) + m=is(imade) + diff=dij(n,m) + if(diff.lt.diffmn) diffmn=diff + enddo + if(diffmn.gt.difmax) difmax=diffmn + adiff(iuse)=diffmn + itag(iuse)=n + avedif=avedif+diffmn + endif + enddo + + avedif=avedif/iuse +c avedif=(avedif+difmax)/2 + emax=-9.d190 + do i=1,iuse + if(adiff(i).ge.avedif) then + itagi=itag(i) + benei=bene(itagi) + if(benei.gt.emax) then + emax=benei + is(imade1)=itagi + endif + endif + enddo + + if(ik.eq.0) iuse=iuse-1 + + return + end +c--------------------------------- + subroutine select_iseed_min(imade1,ik) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + dimension itag(mxio),adiff(mxio) + + iuse=0 + avedif=0.d0 + difmax=0.d0 + do n=1,nbank + if(ibank(n).eq.ik) then + iuse=iuse+1 + diffmn=9.d190 + do imade=1,imade1-1 +c m=nbank+imade +c call get_diff12(bvar(1,1,1,n),bvar(1,1,1,m),diff,idiff) + m=is(imade) + diff=dij(n,m) + if(diff.lt.diffmn) diffmn=diff + enddo + if(diffmn.gt.difmax) difmax=diffmn + adiff(iuse)=diffmn + itag(iuse)=n + avedif=avedif+diffmn + endif + enddo + + avedif=avedif/iuse +c avedif=(avedif+difmax)/2 + emin=9.d190 + do i=1,iuse +c print *,"i, adiff(i),avedif : ",i,adiff(i),avedif + if(adiff(i).ge.avedif) then + itagi=itag(i) + benei=bene(itagi) +c print *,"i, benei,emin : ",i,benei,emin + if(benei.lt.emin) then + emin=benei + is(imade1)=itagi + endif + endif + enddo + + if(ik.eq.0) iuse=iuse-1 + +c print *, "exiting select_iseed_min",is(imade1) + + return + end +c--------------------------------- + subroutine select_iseed_far(imade1,ik) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + + dmax=-9.d190 + do n=1,nbank + if(ibank(n).eq.ik) then + diffmn=9.d190 + do imade=1,imade1-1 +c m=nbank+imade +c call get_diff12(bvar(1,1,1,n),bvar(1,1,1,m),diff,idiff) + m=is(imade) + diff=dij(n,m) + if(diff.lt.diffmn) diffmn=diff + enddo + endif + if(diffmn.gt.dmax) then + dmax=diffmn + is(imade1)=n + endif + enddo + + return + end +c--------------------------------- + subroutine find_min + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + + ebmin=9.d190 + + do i=1,nbank + benei=bene(i) + if(benei.lt.ebmin) then + ebmin=benei + ibmin=i + endif + enddo + + return + end +c--------------------------------- + subroutine write_csa_pdb(var,ene,nft,ik,iw_pdb) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.MINIM' + include 'COMMON.SETUP' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.SBRIDGE' + integer lenpre,lenpot,ilen + external ilen + dimension var(maxvar) + character*50 titelloc + character*3 zahl + + nmin_csa=nmin_csa+1 + if(ene.lt.eglob_csa) then + eglob_csa=ene + nglob_csa=nglob_csa+1 + call numstr(nglob_csa,zahl) + + call var_to_geom(nvar,var) + call chainbuild + call secondary2(.false.) + + lenpre=ilen(prefix) + open(icsa_pdb,file=prefix(:lenpre)//'@'//zahl//'.pdb') + + if (iw_pdb.eq.1) then + write(titelloc,'(a2,i3,a3,i9,a3,i6)') + & 'GM',nglob_csa,' e ',nft,' m ',nmin_csa + else + write(titelloc,'(a2,i3,a3,i9,a3,i6,a5,f5.2,a5,f5.1)') + & 'GM',nglob_csa,' e ',nft,' m ',nmin_csa,' rms ' + & ,rmsn(ik),' %NC ',pncn(ik)*100 + endif + call pdbout(eglob_csa,titelloc,icsa_pdb) + close(icsa_pdb) + endif + + return + end +c--------------------------------- + subroutine find_max + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + + ebmax=-9.d190 + + do i=1,nbank + benei=bene(i) + if(benei.gt.ebmax) then + ebmax=benei + ibmax=i + endif + enddo + + return + end +c--------------------------------- + subroutine get_diff + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + + tdiff=0.d0 + difmin=9.d190 + do i1=1,nbank-1 + do i2=i1+1,nbank + if(jbank(i1).eq.0.or.jbank(i2).eq.0) then + call get_diff12(bvar(1,1,1,i1),bvar(1,1,1,i2),diff) + dij(i1,i2)=diff + dij(i2,i1)=diff + else + diff=dij(i1,i2) + endif + tdiff=tdiff+diff + if(diff.lt.difmin) difmin=diff + enddo + dij(i1,i1)=0.0 + enddo + + do i=1,nbank + jbank(i)=1 + enddo + + avedif=tdiff/nbank/(nbank-1)*2 + + return + end +c--------------------------------- + subroutine estimate_cutdif(adif,xct,cutdifr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + + ctdif1=adif/cut2 + + exponent = cutdifr*cut1/adif + exponent = dlog(exponent)/dlog(xct) + + nexp=exponent+0.25 + cutdif= adif/cut1*xct**nexp + if(cutdif.lt.ctdif1) cutdif=ctdif1 + + return + end +c--------------------------------- + subroutine get_is_max(idum,ifar,n,imade,k) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + double precision emax + + do i=imade+1,n + emax=-9.d190 + do j=1,nbank + if(ibank(j).eq.k .and. bene(j).gt.emax) then + emax=bene(j) + is(i)=j + endif + enddo + call save_is(i) + enddo + + return + end diff --git a/source/unres/src_MD-M-newcorr/big-sizes b/source/unres/src_MD-M-newcorr/big-sizes new file mode 100644 index 0000000..0a40187 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/big-sizes @@ -0,0 +1,9 @@ +contacts_hb_ 0x4e483c0 unres.o +contdistrib_ 0x2c0944c unres.o +derivat_ 0x436dbe8 initialize_p.o +dipmat_ 0xafc8000 unres.o +lagrange_ 0x1085e2b8 unres.o +langforc_ 0x26782534 readrtns_CSA.o +langmat_ 0x83d6000 readrtns_CSA.o +links_ 0x107035c unres.o +przechowalnia_ 0x7080000 MREMD.o diff --git a/source/unres/src_MD-M-newcorr/bigsymbols-lang0.txt b/source/unres/src_MD-M-newcorr/bigsymbols-lang0.txt new file mode 100644 index 0000000..54c4d37 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/bigsymbols-lang0.txt @@ -0,0 +1,7 @@ +contacts_hb_ 0x4e483c0 unres.o +contdistrib_ 0x2c0944c unres.o +dipmat_ 0xafc8000 unres.o +lagrange_ 0x1085e2b8 unres.o +langforc_ 0x582a594 readrtns_CSA.o +links_ 0x107035c unres.o +przechowalnia_ 0x7080000 MREMD.o diff --git a/source/unres/src_MD-M-newcorr/blas.f b/source/unres/src_MD-M-newcorr/blas.f new file mode 100644 index 0000000..142d821 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/bond_move.f b/source/unres/src_MD-M-newcorr/bond_move.f new file mode 100644 index 0000000..4843f60 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/brown_step.F b/source/unres/src_MD-M-newcorr/brown_step.F new file mode 100644 index 0000000..0be97f5 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/brown_step.F @@ -0,0 +1,395 @@ +c------------------------------------------------------------------------------- + subroutine brown_step(itime) +c------------------------------------------------ +c Perform a single Euler integration step of Brownian dynamics +c------------------------------------------------ + 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 zapas(MAXRES6) + integer ilen,rstcount + external ilen + double precision stochforcvec(MAXRES6) + double precision Bmat(MAXRES6,MAXRES2),Cmat(maxres2,maxres2), + & Cinv(maxres2,maxres2),GBmat(MAXRES6,MAXRES2), + & Tmat(MAXRES6,MAXRES2),Pmat(maxres6,maxres6),Td(maxres6), + & ppvec(maxres2) + common /stochcalc/ stochforcvec + common /gucio/ cm + integer itime + logical lprn /.false./,lprn1 /.false./ + integer maxiter /5/ + double precision difftol /1.0d-5/ + nbond=nct-nnt + do i=nnt,nct + if (itype(i).ne.10) nbond=nbond+1 + enddo +c + if (lprn1) then + write (iout,*) "Generalized inverse of fricmat" + call matout(dimen,dimen,MAXRES6,MAXRES6,fricmat) + endif + do i=1,dimen + do j=1,nbond + Bmat(i,j)=0.0d0 + enddo + enddo + ind=3 + ind1=0 + do i=nnt,nct-1 + ind1=ind1+1 + do j=1,3 + Bmat(ind+j,ind1)=dC_norm(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind1=ind1+1 + do j=1,3 + Bmat(ind+j,ind1)=dC_norm(j,i+nres) + enddo + ind=ind+3 + endif + enddo + if (lprn1) then + write (iout,*) "Matrix Bmat" + call MATOUT(nbond,dimen,MAXRES6,MAXRES2,Bmat) + endif + do i=1,dimen + do j=1,nbond + GBmat(i,j)=0.0d0 + do k=1,dimen + GBmat(i,j)=GBmat(i,j)+fricmat(i,k)*Bmat(k,j) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix GBmat" + call MATOUT(nbond,dimen,MAXRES6,MAXRES2,Gbmat) + endif + do i=1,nbond + do j=1,nbond + Cmat(i,j)=0.0d0 + do k=1,dimen + Cmat(i,j)=Cmat(i,j)+Bmat(k,i)*GBmat(k,j) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix Cmat" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat) + endif + call matinvert(nbond,MAXRES2,Cmat,Cinv) + if (lprn1) then + write (iout,*) "Matrix Cinv" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cinv) + endif + do i=1,dimen + do j=1,nbond + Tmat(i,j)=0.0d0 + do k=1,nbond + Tmat(i,j)=Tmat(i,j)+GBmat(i,k)*Cinv(k,j) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix Tmat" + call MATOUT(nbond,dimen,MAXRES6,MAXRES2,Tmat) + endif + do i=1,dimen + do j=1,dimen + if (i.eq.j) then + Pmat(i,j)=1.0d0 + else + Pmat(i,j)=0.0d0 + endif + do k=1,nbond + Pmat(i,j)=Pmat(i,j)-Tmat(i,k)*Bmat(j,k) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix Pmat" + call MATOUT(dimen,dimen,MAXRES6,MAXRES6,Pmat) + endif + do i=1,dimen + Td(i)=0.0d0 + ind=0 + do k=nnt,nct-1 + ind=ind+1 + Td(i)=Td(i)+vbl*Tmat(i,ind) + enddo + do k=nnt,nct + if (itype(k).ne.10) then + ind=ind+1 + Td(i)=Td(i)+vbldsc0(1,itype(k))*Tmat(i,ind) + endif + enddo + enddo + if (lprn1) then + write (iout,*) "Vector Td" + do i=1,dimen + write (iout,'(i5,f10.5)') i,Td(i) + enddo + endif + call stochastic_force(stochforcvec) + if (lprn) then + write (iout,*) "stochforcvec" + do i=1,dimen + write (iout,*) i,stochforcvec(i) + enddo + endif + do j=1,3 + zapas(j)=-gcart(j,0)+stochforcvec(j) + d_t_work(j)=d_t(j,0) + dC_work(j)=dC_old(j,0) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + ind=ind+1 + zapas(ind)=-gcart(j,i)+stochforcvec(ind) + dC_work(ind)=dC_old(j,i) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + ind=ind+1 + zapas(ind)=-gxcart(j,i)+stochforcvec(ind) + dC_work(ind)=dC_old(j,i+nres) + enddo + endif + enddo + + if (lprn) then + write (iout,*) "Initial d_t_work" + do i=1,dimen + write (iout,*) i,d_t_work(i) + enddo + endif + + do i=1,dimen + d_t_work(i)=0.0d0 + do j=1,dimen + d_t_work(i)=d_t_work(i)+fricmat(i,j)*zapas(j) + enddo + enddo + + do i=1,dimen + zapas(i)=Td(i) + do j=1,dimen + zapas(i)=zapas(i)+Pmat(i,j)*(dC_work(j)+d_t_work(j)*d_time) + enddo + enddo + if (lprn1) then + write (iout,*) "Final d_t_work and zapas" + do i=1,dimen + write (iout,*) i,d_t_work(i),zapas(i) + enddo + endif + + do j=1,3 + d_t(j,0)=d_t_work(j) + dc(j,0)=zapas(j) + dc_work(j)=dc(j,0) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=d_t_work(i) + dc(j,i)=zapas(ind+j) + dc_work(ind+j)=dc(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + do j=1,3 + d_t(j,i+nres)=d_t_work(ind+j) + dc(j,i+nres)=zapas(ind+j) + dc_work(ind+j)=dc(j,i+nres) + enddo + ind=ind+3 + enddo + if (lprn) then + call chainbuild_cart + write (iout,*) "Before correction for rotational lengthening" + write (iout,*) "New coordinates", + & " and differences between actual and standard bond lengths" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + xx=vbld(i+1)-vbl + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i),j=1,3),xx + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + xx=vbld(i+nres)-vbldsc0(1,itype(i)) + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i+nres),j=1,3),xx + endif + enddo + endif +c Second correction (rotational lengthening) +c do iter=1,maxiter + diffmax=0.0d0 + ind=0 + do i=nnt,nct-1 + ind=ind+1 + blen2 = scalar(dc(1,i),dc(1,i)) + ppvec(ind)=2*vbl**2-blen2 + diffbond=dabs(vbl-dsqrt(blen2)) + if (diffbond.gt.diffmax) diffmax=diffbond + if (ppvec(ind).gt.0.0d0) then + ppvec(ind)=dsqrt(ppvec(ind)) + else + ppvec(ind)=0.0d0 + endif + if (lprn) then + write (iout,'(i5,3f10.5)') ind,diffbond,ppvec(ind) + endif + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + blen2 = scalar(dc(1,i+nres),dc(1,i+nres)) + ppvec(ind)=2*vbldsc0(1,itype(i))**2-blen2 + diffbond=dabs(vbldsc0(1,itype(i))-dsqrt(blen2)) + if (diffbond.gt.diffmax) diffmax=diffbond + if (ppvec(ind).gt.0.0d0) then + ppvec(ind)=dsqrt(ppvec(ind)) + else + ppvec(ind)=0.0d0 + endif + if (lprn) then + write (iout,'(i5,3f10.5)') ind,diffbond,ppvec(ind) + endif + endif + enddo + if (lprn) write (iout,*) "iter",iter," diffmax",diffmax + if (diffmax.lt.difftol) goto 10 + do i=1,dimen + Td(i)=0.0d0 + do j=1,nbond + Td(i)=Td(i)+ppvec(j)*Tmat(i,j) + enddo + enddo + do i=1,dimen + zapas(i)=Td(i) + do j=1,dimen + zapas(i)=zapas(i)+Pmat(i,j)*dc_work(j) + enddo + enddo + do j=1,3 + dc(j,0)=zapas(j) + dc_work(j)=zapas(j) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + dc(j,i)=zapas(ind+j) + dc_work(ind+j)=zapas(ind+j) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + dc(j,i+nres)=zapas(ind+j) + dc_work(ind+j)=zapas(ind+j) + enddo + ind=ind+3 + endif + enddo +c Building the chain from the newly calculated coordinates + call chainbuild_cart + 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,'(a)') "Potential forces" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(-gcart(j,i),j=1,3), + & (-gxcart(j,i),j=1,3) + enddo + write (iout,'(a)') "Stochastic forces" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(stochforc(j,i),j=1,3), + & (stochforc(j,i+nres),j=1,3) + enddo + write (iout,'(a)') "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 + endif + endif + if (lprn) then + write (iout,*) "After correction for rotational lengthening" + write (iout,*) "New coordinates", + & " and differences between actual and standard bond lengths" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + xx=vbld(i+1)-vbl + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i),j=1,3),xx + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + xx=vbld(i+nres)-vbldsc0(1,itype(i)) + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i+nres),j=1,3),xx + endif + enddo + endif +c ENDDO +c write (iout,*) "Too many attempts at correcting the bonds" +c stop + 10 continue +#ifdef MPI + tt0 =MPI_Wtime() +#else + tt0 = tcpu() +#endif +c Calculate energy and forces + call zerograd + call etotal(potEcomp) + potE=potEcomp(0)-potEcomp(20) + call cartgrad + totT=totT+d_time +c Calculate the kinetic and total energy and the kinetic temperature + call kinetic(EK) +#ifdef MPI + t_enegrad=t_enegrad+MPI_Wtime()-tt0 +#else + t_enegrad=t_enegrad+tcpu()-tt0 +#endif + totE=EK+potE + kinetic_T=2.0d0/(dimen*Rb)*EK + return + end + diff --git a/source/unres/src_MD-M-newcorr/cartder.F b/source/unres/src_MD-M-newcorr/cartder.F new file mode 100644 index 0000000..dd2b3f1 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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) + 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-M-newcorr/cartprint.f b/source/unres/src_MD-M-newcorr/cartprint.f new file mode 100644 index 0000000..d79409e --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/chainbuild.F b/source/unres/src_MD-M-newcorr/chainbuild.F new file mode 100644 index 0000000..45a1a53 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/change.awk b/source/unres/src_MD-M-newcorr/change.awk new file mode 100644 index 0000000..d192a6e --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/check_bond.f b/source/unres/src_MD-M-newcorr/check_bond.f new file mode 100644 index 0000000..c8a4ad1 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/check_sc_distr.f b/source/unres/src_MD-M-newcorr/check_sc_distr.f new file mode 100644 index 0000000..db2ed1b --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/check_sc_map.f b/source/unres/src_MD-M-newcorr/check_sc_map.f new file mode 100644 index 0000000..4314e16 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/check_sc_map.f @@ -0,0 +1,49 @@ + subroutine check_sc_map +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' + real*8 xx,yy,zz,al,om + real*8 escloc, escloc_ene(50000), escloc_min, alph_plot(50000), + & beta_plot(50000) + integer al_plot(5000),be_plot(5000) + integer iialph, iibet,it + write (2,*) "Side-chain-rotamer potential energy map!!!!" + escloc_min = 1000000.00 +C it=itype(2) + i = 0 + do iialph=0,18 + do iibet=-18,18 + i = i + 1 + al = iialph*10.0d0*deg2rad + om = iibet*10.0d0*deg2rad + zz = dcos(al) + xx = -dsin(al)*dcos(om) + yy = -dsin(al)*dsin(om) + alph(2)=dacos(xx) + omeg(2)=-datan2(zz,yy) + al_plot(i)=alph(2)*rad2deg + be_plot(i)=omeg(2)*rad2deg +C write(2,*) alph(2)*rad2deg, omeg(2)*rad2deg + alph_plot(i) = al*rad2deg + beta_plot(i) = om*rad2deg + call chainbuild + call vec_and_deriv + call esc(escloc) + escloc_ene(i) = escloc + if (escloc_min.gt.escloc_ene(i)) escloc_min=escloc_ene(i) + enddo + enddo +C write (2,*) "escloc_min = ", escloc_min + print *,"i",i + do j = 1,i + write (2,'(3f10.3,2i9,f12.5)') alph_plot(j), + & beta_plot(j),theta(3)*rad2deg, al_plot(j),be_plot(j), + & escloc_ene(j) !- escloc_min + enddo + return + end diff --git a/source/unres/src_MD-M-newcorr/checkder_p.F b/source/unres/src_MD-M-newcorr/checkder_p.F new file mode 100644 index 0000000..0539e48 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/checkder_p.F @@ -0,0 +1,700 @@ + 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' + 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' + 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' + 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)) + etot=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 + 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)) + 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 +#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-M-newcorr/common.size b/source/unres/src_MD-M-newcorr/common.size new file mode 100644 index 0000000..3bc1f47 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/common.size @@ -0,0 +1,130 @@ +info 0x4010 gen_rand_conf.o +from_zscore 0x8 unres.o +mdcalc 0x108 unres.o +bank_disulfid 0x1f0 readrtns_CSA.o +parfiles 0xb00 unres.o +body 0x6180 unres.o +pool 0x697dc readrtns_CSA.o +interact 0xed94 unres.o +sclocal 0x22cc chainbuild.o +restraints 0x8 unres.o +peptbond 0x28 chainbuild.o +srutu 0x4 unres.o +mucarem 0x8000 readrtns_CSA.o +oldgeo 0xd2ff4 unres.o +minvar 0xe278 readrtns_CSA.o +spinka 0x2a3c newconf.o +torsiond 0x14200 initialize_p.o +przechowalnia 0x7b98a04 rattle.o +langforc 0x31a5054 readrtns_CSA.o +thetas 0x960 chainbuild.o +iounits 0x6c unres.o +rotat_old 0xa8c0 unres.o +remdcommon 0x6030 unres.o +chuju 0x4 minimize_p.o +refstruct 0x151ec unres.o +traj1cache 0x3679c unres.o +stretch 0x600 unres.o +mvstat 0x250 readrtns_CSA.o +thread 0x148 readrtns_CSA.o +dih_control 0xc readrtns_CSA.o +mdpar 0x6c unres.o +types 0x14 unres.o +par 0x20 eigen.o +bounds 0x3840 readrtns_CSA.o +pizda 0xe10 readrtns_CSA.o +machsw 0xc initialize_p.o +links_split 0x8 unres.o +integer_muca 0xc readrtns_CSA.o +calc 0x1f0 gen_rand_conf.o +csafiles 0xc00 unres.o +sbridge 0x9c unres.o +back_constr 0x11acc unres.o +rotat 0x2a300 unres.o +mpipriv2 0x18 unres.o +remdrestart 0x411808 unres.o +stochcalc 0xa8c0 MD_A-MTS.o +scrot 0x28a0 parmread.o +stoptim 0x4 unres.o +c_frag 0x1c28 geomout.o +precomp2 0x54600 unres.o +move 0x38b8 initialize_p.o +loc_work 0x30c local_move.o +store0 0x4 geomout.o +torsion 0x5adc parmread.o +wagi 0x10 geomout.o +vrandd 0x3f0 randgens.o +lagrange 0x15a93de0 unres.o +accept_stats 0x2008 initialize_p.o +mdpmpi 0x8010 unres.o +invlen 0x3840 chainbuild.o +locel 0x208 energy_p_new.o +frag 0xa0 geomout.o +inertia 0x160 unres.o +time1 0x30 unres.o +derivat 0x2638028 initialize_p.o +langmat 0xc readrtns_CSA.o +banii 0xa8c0 banach.o +mdgrad 0x151b0 unres.o +bank 0x1c320 readrtns_CSA.o +refer 0x98 bond_move.o +diploc 0x3938 unres.o +syfek 0xa8c0 stochfric.o +fnames 0x1007 unres.o +$BLNK_COM 0xc djacob.o +sccalc 0x28 energy_p_new.o +geo 0x40 unres.o +iofile 0x65c initialize_p.o +mapp 0x2a304 readrtns_CSA.o +theta_abinitio 0x24a70 chainbuild.o +sumsl_flag 0x4 unres.o +restr 0xd2f4 unres.o +chain 0x3f500 unres.o +torcnstr 0x5478 initialize_p.o +cipiszcze 0x4 lagrangian_lesyng.o +double_muca 0x1c228 readrtns_CSA.o +links 0x93d24c unres.o +deriv_loc 0x1e0 initialize_p.o +cache 0x69850 mcm.o +minimm 0x20 initialize_p.o +diffcuta 0x8 readrtns_CSA.o +aaaa 0x8 MP.o +fourier 0x344 initialize_p.o +mce 0x230 readrtns_CSA.o +var 0x286f0 unres.o +csa_input 0x98 readrtns_CSA.o +header 0x50 unres.o +splitele 0x10 initialize_p.o +setup 0x4028 unres.o +mcm 0x20a4 initialize_p.o +mce_counters 0x14 readrtns_CSA.o +frozen 0xe10 geomout.o +struct 0xa2c readrtns_CSA.o +info1 0x4024 gen_rand_conf.o +cntrl 0x78 unres.o +mpiprivc 0x2 unres.o +timing 0x58 unres.o +kutas 0x4 energy_p_new.o +precomp1 0x50dc0 unres.o +loc_const 0x40 local_move.o +contacts1 0x18c630 unres.o +alphaa 0x16da8 readrtns_CSA.o +thread1 0x1cd0 readrtns_CSA.o +qmeas 0x6f2bc unres.o +dipmat 0x15f9000 unres.o +indices 0x8040 chainbuild.o +ffield 0x174 unres.o +vectors 0x49d40 energy_p_new.o +varin 0xe248 readrtns_CSA.o +csaunits 0x34 unres.o +contacts_hb 0x9c9c30 unres.o +contacts 0x2a308 unres.o +deriv_scloc 0x2f760 initialize_p.o +secondarys 0x384 dihed_cons.o +pochodne 0x6318d0 geomout.o +maxgrad 0xa8 energy_p_new.o +send2 0xfd50 readrtns_CSA.o +windows 0x2a34 initialize_p.o +gucio 0x18 MD_A-MTS.o +rotmat 0x3f480 unres.o + diff --git a/source/unres/src_MD-M-newcorr/common.size.orig b/source/unres/src_MD-M-newcorr/common.size.orig new file mode 100644 index 0000000..d009a52 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/common.size.orig @@ -0,0 +1,130 @@ +from_zscore 8 unres.o +mdcalc 108 unres.o +bank_disulfid 1f0 readrtns_CSA.o +parfiles b00 unres.o +body 6180 unres.o +mpipriv1 1c unres.o +pool 2459c readrtns_CSA.o +interact 6c84 unres.o +sclocal 22cc chainbuild.o +restraints 8 unres.o +peptbond 28 chainbuild.o +srutu 4 unres.o +mucarem 8000 readrtns_CSA.o +oldgeo 48b74 unres.o +minvar 4ef8 readrtns_CSA.o +spinka e88 newconf.o +torsiond 14200 initialize_p.o +langforc 34dc434 readrtns_CSA.o +thetas 960 chainbuild.o +iounits 6c unres.o +rotat_old 3a20 unres.o +remdcommon 6030 unres.o +chuju 4 minimize_p.o +dipint 31db480 unres.o +refstruct 74ac unres.o +traj1cache 13e7c unres.o +stretch 600 unres.o +mvstat 250 readrtns_CSA.o +thread 148 readrtns_CSA.o +dih_control c readrtns_CSA.o +mdpar 6c unres.o +types 14 unres.o +rattlemat ea9e84 rattle.o +par 20 eigen.o +bounds 1360 readrtns_CSA.o +pizda 4d8 readrtns_CSA.o +machsw c initialize_p.o +links_split 8 unres.o +integer_muca c readrtns_CSA.o +calc 1f0 gen_rand_conf.o +csafiles c00 unres.o +sbridge 9c unres.o +back_constr 874c unres.o +rotat e880 unres.o +mpipriv2 18 unres.o +remdrestart 411808 unres.o +stochcalc 3a20 MD_A-MTS.o +scrot 28a0 parmread.o +stoptim 4 unres.o +c_frag 9b0 geomout.o +precomp2 1d100 unres.o +move 13d8 initialize_p.o +loc_work 30c local_move.o +store0 4 geomout.o +torsion 5adc parmread.o +wagi bc4d0 geomout.o +vrandd 3f0 randgens.o +lagrange a468980 unres.o +accept_stats 2008 initialize_p.o +mdpmpi 8010 unres.o +invlen 1360 chainbuild.o +locel 208 energy_p_new.o +frag a0 geomout.o +inertia 160 unres.o +time1 30 unres.o +derivat 4cab48 initialize_p.o +langmat c readrtns_CSA.o +banii 3a20 banach.o +mdgrad 7470 unres.o +bank 9c20 readrtns_CSA.o +refer 98 bond_move.o +diploc 3938 unres.o +syfek 3a20 stochfric.o +fnames 1007 unres.o +$BLNK_COM c djacob.o +sccalc 28 energy_p_new.o +geo 40 unres.o +iofile 65c initialize_p.o +mapp e884 readrtns_CSA.o +theta_abinitio 24a70 chainbuild.o +sumsl_flag 4 unres.o +restr 48ac unres.o +chain 15d40 unres.o +torcnstr 1d28 initialize_p.o +cipiszcze 4 lagrangian_lesyng.o +double_muca 9b28 readrtns_CSA.o +links 116d34 unres.o +deriv_loc 1e0 initialize_p.o +cache 24610 mcm.o +minimm 20 initialize_p.o +diffcuta 8 readrtns_CSA.o +aaaa 8 MP.o +fourier 344 initialize_p.o +mce 230 readrtns_CSA.o +var dee0 unres.o +csa_input 98 readrtns_CSA.o +header 50 unres.o +splitele 10 initialize_p.o +setup 4028 unres.o +mcm 20a4 initialize_p.o +mce_counters 14 readrtns_CSA.o +frozen 4d8 geomout.o +struct a2c readrtns_CSA.o +info1 4024 gen_rand_conf.o +cntrl 78 unres.o +mpiprivc 2 unres.o +timing 58 unres.o +kutas 4 energy_p_new.o +precomp1 1bda0 unres.o +loc_const 40 local_move.o +contacts1 34cee8 unres.o +alphaa 7df8 readrtns_CSA.o +thread1 1cd0 readrtns_CSA.o +qmeas 6157c unres.o +dipmat 2eec800 unres.o +indices 8040 chainbuild.o +ffield 174 unres.o +vectors 196e0 energy_p_new.o +varin 4ec8 readrtns_CSA.o +csaunits 34 unres.o +contacts_hb 14e59e8 unres.o +contacts e888 unres.o +deriv_scloc 10590 initialize_p.o +secondarys 136 dihed_cons.o +pochodne 731d130 geomout.o +maxgrad a8 energy_p_new.o +send2 5760 readrtns_CSA.o +windows e8c initialize_p.o +gucio 18 MD_A-MTS.o +rotmat 15cc0 unres.o diff --git a/source/unres/src_MD-M-newcorr/compare_s1.F b/source/unres/src_MD-M-newcorr/compare_s1.F new file mode 100644 index 0000000..4e77c21 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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,1)=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,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,1),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-M-newcorr/compinfo.c b/source/unres/src_MD-M-newcorr/compinfo.c new file mode 100644 index 0000000..e28f686 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/contact.f b/source/unres/src_MD-M-newcorr/contact.f new file mode 100644 index 0000000..24b11d6 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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=iabs(itype(i)) + do j=nnt,i-kkk + itj=iabs(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-M-newcorr/convert.f b/source/unres/src_MD-M-newcorr/convert.f new file mode 100644 index 0000000..dc0cccd --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/cored.f b/source/unres/src_MD-M-newcorr/cored.f new file mode 100644 index 0000000..1cf25e5 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/csa.f b/source/unres/src_MD-M-newcorr/csa.f new file mode 100644 index 0000000..3c2e8e9 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/csa.f @@ -0,0 +1,364 @@ + subroutine make_array + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.CSA' + +ccccccccccccccccccccccccc +c Level-2: group +ccccccccccccccccccccccccc + + indg=0 + do k=1,numch +ccccccccccccccccccccccccccccccccccccccccc +! Groups the THETAs and the GAMMAs + do j=2,nres-1 + indg=indg+1 + if (j.lt.nres-1) then + ngroup(indg)=2 + else + ngroup(indg)=1 + endif + do i=1,ngroup(indg) + igroup(1,i,indg)=i + igroup(2,i,indg)=j + igroup(3,i,indg)=k + enddo + enddo +ccccccccccccccccccccccccccccccccccccccccc + enddo +! Groups the ALPHAs and the BETAs + do k=1,numch + do j=2,nres-1 + if(itype(j).ne.10) then + indg=indg+1 + ngroup(indg)=2 + do i=1,ngroup(indg) + igroup(1,i,indg)=i+2 + igroup(2,i,indg)=j + igroup(3,i,indg)=k + enddo + endif + enddo + enddo + + ntotgr=indg + write(iout,*) + write(iout,*) "# of groups: ",ntotgr + do i=1,ntotgr + write(iout,41) i,ngroup(i),((igroup(k,j,i),k=1,3),j=1,ngroup(i)) + enddo +! close(iout) + + 40 format(i3,3x,3i3) + 41 format(2i3,3x,6(3i3,2x)) + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine make_ranvar(n,m,idum) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.BANK' +c al m=0 + print *,'HOHOHOHO Make_RanVar!!!!!',n,m + itrial=0 + do while(m.lt.n .and. itrial.le.10000) + itrial=itrial+1 + jeden=1 + call gen_rand_conf(jeden,*10) +! call intout + m=m+1 + do j=2,nres-1 + dihang_in(1,j,1,m)=theta(j+1) + dihang_in(2,j,1,m)=phi(j+2) + dihang_in(3,j,1,m)=alph(j) + dihang_in(4,j,1,m)=omeg(j) + enddo + dihang_in(2,nres-1,1,m)=0.0d0 + goto 20 + 10 write (iout,*) 'Failed to generate conformation #',m+1, + & ' itrial=',itrial + 20 continue + enddo + print *,'Make_RanVar!!!!! m=',m,' itrial=',itrial + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine make_ranvar_reg(n,idum) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.BANK' + include 'COMMON.GEO' + m=0 + print *,'HOHOHOHO Make_RanVar!!!!!' + itrial=0 + do while(m.lt.n .and. itrial.le.10000) + itrial=itrial+1 + jeden=1 + call gen_rand_conf(jeden,*10) +! call intout + m=m+1 + do j=2,nres-1 + dihang_in(1,j,1,m)=theta(j+1) + dihang_in(2,j,1,m)=phi(j+2) + dihang_in(3,j,1,m)=alph(j) + dihang_in(4,j,1,m)=omeg(j) + if(m.le.n*0.1) then + dihang_in(1,j,1,m)=90.0*deg2rad + dihang_in(2,j,1,m)=50.0*deg2rad + endif + enddo + dihang_in(2,nres-1,1,m)=0.0d0 + goto 20 + 10 write (iout,*) 'Failed to generate conformation #',m+1, + & ' itrial=',itrial + 20 continue + enddo + print *,'Make_RanVar!!!!! m=',m,' itrial=',itrial + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine from_pdb(n,idum) +c This subroutine stores the UNRES int variables generated from +c subroutine readpdb into the 1st conformation of in dihang_in. +c Subsequent n-1 conformations of dihang_in have identical values +c of theta and phi as the 1st conformation but random values for +c alph and omeg. +c The array cref (also generated from subroutine readpdb) is stored +c to crefjlee to be used for rmsd calculation in CSA, if necessary. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.BANK' + include 'COMMON.GEO' + + m=1 + do j=2,nres-1 + dihang_in(1,j,1,m)=theta(j+1) + dihang_in(2,j,1,m)=phi(j+2) + dihang_in(3,j,1,m)=alph(j) + dihang_in(4,j,1,m)=omeg(j) + enddo + dihang_in(2,nres-1,1,k)=0.0d0 + + do m=2,n + do k=2,nres-1 + dihang_in(1,k,1,m)=dihang_in(1,k,1,1) + dihang_in(2,k,1,m)=dihang_in(2,k,1,1) + if(dabs(dihang_in(3,k,1,1)).gt.1.d-6) then + dihang_in(3,k,1,m)=90.d0*ran1(idum)+90.d0 + dihang_in(3,k,1,m)=dihang_in(3,k,1,m)*deg2rad + endif + if(dabs(dihang_in(4,k,1,1)).gt.1.d-6) then + dihang_in(4,k,1,m)=360.d0*ran1(idum)-180.d0 + dihang_in(4,k,1,m)=dihang_in(4,k,1,m)*deg2rad + endif + enddo + enddo + +c Store cref to crefjlee (they are in COMMON.CHAIN). + do k=1,2*nres + do kk=1,3 + kkk=1 + crefjlee(kk,k)=cref(kk,k,kkk) + enddo + enddo + + open(icsa_native_int,file=csa_native_int,status="old") + do m=1,n + write(icsa_native_int,*) m,e + write(icsa_native_int,200) + & (dihang_in(1,k,1,m)*rad2deg,k=2,nres-1) + write(icsa_native_int,200) + & (dihang_in(2,k,1,m)*rad2deg,k=2,nres-2) + write(icsa_native_int,200) + & (dihang_in(3,k,1,m)*rad2deg,k=2,nres-1) + write(icsa_native_int,200) + & (dihang_in(4,k,1,m)*rad2deg,k=2,nres-1) + enddo + + do k=1,nres + write(icsa_native_int,200) (crefjlee(i,k),i=1,3) + enddo + close(icsa_native_int) + + 200 format (8f10.4) + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine from_int(n,mm,idum) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.BANK' + include 'COMMON.GEO' + include 'COMMON.CONTACTS' + integer ilen + external ilen + logical fail + double precision energia(0:n_ene) + + open(icsa_native_int,file=csa_native_int,status="old") + read (icsa_native_int,*) + call read_angles(icsa_native_int,*10) + goto 11 + 10 write (iout,'(2a)') "CHUJ NASTAPIL - error in ", + & csa_native_int(:ilen(csa_native_int)) + 11 continue + call intout + do j=2,nres-1 + dihang_in(1,j,1,1)=theta(j+1) + dihang_in(2,j,1,1)=phi(j+2) + dihang_in(3,j,1,1)=alph(j) + dihang_in(4,j,1,1)=omeg(j) + enddo + dihang_in(2,nres-1,1,1)=0.0d0 + +c read(icsa_native_int,*) ind,e +c read(icsa_native_int,200) (dihang_in(1,k,1,1),k=2,nres-1) +c read(icsa_native_int,200) (dihang_in(2,k,1,1),k=2,nres-2) +c read(icsa_native_int,200) (dihang_in(3,k,1,1),k=2,nres-1) +c read(icsa_native_int,200) (dihang_in(4,k,1,1),k=2,nres-1) +c dihang_in(2,nres-1,1,1)=0.d0 + + maxsi=100 + maxcount_fail=100 + + do m=mm+2,n +c do k=2,nres-1 +c dihang_in(1,k,1,m)=dihang_in(1,k,1,1) +c dihang_in(2,k,1,m)=dihang_in(2,k,1,1) +c if(abs(dihang_in(3,k,1,1)).gt.1.d-3) then +c dihang_in(3,k,1,m)=90.d0*ran1(idum)+90.d0 +c endif +c if(abs(dihang_in(4,k,1,1)).gt.1.d-3) then +c dihang_in(4,k,1,m)=360.d0*ran1(idum)-180.d0 +c endif +c enddo +c call intout + fail=.true. + + icount_fail=0 + + DO WHILE (FAIL .AND. ICOUNT_FAIL .LE. MAXCOUNT_FAIL) + + do i=nnt,nct + if (itype(i).ne.10) then +cd print *,'i=',i,' itype=',itype(i),' theta=',theta(i+1) + fail=.true. + ii=0 + do while (fail .and. ii .le. maxsi) + call gen_side(itype(i),theta(i+1),alph(i),omeg(i),fail) + ii = ii+1 + enddo + endif + enddo + call chainbuild + call etotal(energia(0)) + fail = (energia(0).ge.1.0d20) + icount_fail=icount_fail+1 + + ENDDO + + if (icount_fail.gt.maxcount_fail) then + write (iout,*) + & 'Failed to generate non-overlaping near-native conf.', + & m + endif + + do j=2,nres-1 + dihang_in(1,j,1,m)=theta(j+1) + dihang_in(2,j,1,m)=phi(j+2) + dihang_in(3,j,1,m)=alph(j) + dihang_in(4,j,1,m)=omeg(j) + enddo + dihang_in(2,nres-1,1,m)=0.0d0 + enddo + +c do m=1,n +c write(icsa_native_int,*) m,e +c write(icsa_native_int,200) (dihang_in(1,k,1,m),k=2,nres-1) +c write(icsa_native_int,200) (dihang_in(2,k,1,m),k=2,nres-2) +c write(icsa_native_int,200) (dihang_in(3,k,1,m),k=2,nres-1) +c write(icsa_native_int,200) (dihang_in(4,k,1,m),k=2,nres-1) +c enddo +c close(icsa_native_int) + +c do m=mm+2,n +c do i=1,4 +c do j=2,nres-1 +c dihang_in(i,j,1,m)=dihang_in(i,j,1,m)*deg2rad +c enddo +c enddo +c enddo + + call dihang_to_c(dihang_in(1,1,1,1)) + +c Store c to cref (they are in COMMON.CHAIN). + do k=1,2*nres + do kk=1,3 + crefjlee(kk,k)=c(kk,k) + enddo + enddo + + call contact(.true.,ncont_ref,icont_ref,co) + +c do k=1,nres +c write(icsa_native_int,200) (crefjlee(i,k),i=1,3) +c enddo + close(icsa_native_int) + + 200 format (8f10.4) + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine dihang_to_c(aarray) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.VAR' + + dimension aarray(mxang,maxres,mxch) + +c do i=4,nres +c phi(i)=dihang_in(1,i-2,1,1) +c enddo + do i=2,nres-1 + theta(i+1)=aarray(1,i,1) + phi(i+2)=aarray(2,i,1) + alph(i)=aarray(3,i,1) + omeg(i)=aarray(4,i,1) + enddo + + call chainbuild + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc diff --git a/source/unres/src_MD-M-newcorr/diff12.f b/source/unres/src_MD-M-newcorr/diff12.f new file mode 100644 index 0000000..3d347ed --- /dev/null +++ b/source/unres/src_MD-M-newcorr/diff12.f @@ -0,0 +1,27 @@ +cccccccccccccccccccccccccccccccccc + subroutine get_diff12(aarray,barray,diff) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + dimension aarray(mxang,maxres,mxch), + & barray(mxang,maxres,mxch) + + diff=0.d0 + do k=1,numch + do j=2,nres-1 +c do i=1,4 +c do i=1,2 + do i=1,ndiff + dif=rad2deg*dabs(aarray(i,j,k)-barray(i,j,k)) + if(dif.gt.180.) dif=360.-dif + if (dif.gt.diffcut) diff=diff+dif + enddo + enddo + enddo + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc diff --git a/source/unres/src_MD-M-newcorr/dihed_cons.F b/source/unres/src_MD-M-newcorr/dihed_cons.F new file mode 100644 index 0000000..1fb6c53 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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',readonly) +#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-M-newcorr/distfit.f b/source/unres/src_MD-M-newcorr/distfit.f new file mode 100644 index 0000000..80e8fe4 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/distfit.f @@ -0,0 +1,207 @@ + subroutine distfit(debug,maxit) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.DISTFIT' + DIMENSION X(MAXRES),DIAGH(MAXRES),phiold(maxres) + logical debug,sing + +cinput------------------------------------ +c NX=NRES-3 +c NY=((NRES-4)*(NRES-5))/2 +cinput------------------------------------ +ctest MAXIT=20 + TOL=0.5 + MAXMAR=10 + RL=100.0 + + CALL TRANSFER(NRES,phi,phiold) + + F0=RDIF() + +cd WRITE (IOUT,*) 'DISTFIT: F0=',F0 + + + DO IT=1,MAXIT + CALL RDERIV + CALL HEVAL + + DO I=1,NX + DIAGH(I)=H(I,I) + ENDDO + RL=RL*0.1 + + DO IMAR=1,MAXMAR + DO I=1,NX + H(I,I)=DIAGH(I)+RL + ENDDO + CALL TRANSFER(NX,XX,X) + CALL BANACH(NX,MAXRES,H,X,sing) + AIN=0.0 + DO I=1,NX + AIN=AIN+DABS(X(I)) + ENDDO + IF (AIN.LT.0.1*TOL .AND. RL.LT.1.0E-4) THEN + if (debug) then + WRITE (IOUT,*) 'DISTFIT: CONVERGENCE HAS BEEN ACHIEVED' + WRITE (IOUT,*) 'IT=',it,'F=',F0 + endif + RETURN + ENDIF + DO I=4,NRES + phi(I)=phiold(I)+mask(i)*X(I-3) +c print *,X(I-3) + ENDDO + + F1=RDIF() +cd WRITE (IOUT,*) 'IMAR=',IMAR,' RL=',RL,' F1=',F1 + IF (F1.LT.F0) THEN + CALL TRANSFER(NRES,phi,phiold) + F0=F1 + GOTO 1 + ELSE IF (DABS(F1-F0).LT.1.0E-5) THEN + if (debug) then + WRITE (IOUT,*) 'DISTFIT: CANNOT IMPROVE DISTANCE FIT' + WRITE (IOUT,*) 'IT=',it,'F=',F1 + endif + RETURN + ENDIF + RL=RL*10.0 + ENDDO + WRITE (IOUT,*) 'DISTFIT: MARQUARDT PROCEDURE HAS FAILED' + WRITE (IOUT,*) 'IT=',it,'F=',F0 + CALL TRANSFER(NRES,phiold,phi) + RETURN + 1 continue +cd write (iout,*) "it",it," imar",imar," f0",f0 + enddo + WRITE (IOUT,*) 'DISTFIT: FINAL F=',F0,'after MAXIT=',maxit + return + END + + double precision FUNCTION RDIF() + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DISTFIT' + +c print *,'in rdif' + + suma=0.0 + ind=0 + call chainbuild + do i=1,nres-3 + do j=i+3,nres + ind=ind+1 + if (w(ind).ne.0.0) then + DIJ=DIST(i,j) + suma=suma+w(ind)*(DIJ-d0(ind))*(DIJ-d0(ind)) + DD(ind)=DIJ +c print '(2i3,i4,4f12.2)',i,j,ind,dij,d0(ind),w(ind),suma + endif + enddo + enddo + + RDIF=suma + RETURN + END + + SUBROUTINE RDERIV + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DISTFIT' + include 'COMMON.GEO' + DIMENSION E12(3),R13(3),R24(3),PRODU(3) + + DO I=1,NY + DO J=1,NX + DRDG(I,J)=0.0 + ENDDO + ENDDO + DO I=1,NX + I1=I+1 + I2=I+2 + CALL VEC(I1,I2,E12) + DO J=1,I + DO K=1,3 + R13(K)=C(K,J)-C(K,I1) + ENDDO + DO K=I2+1,NRES + DO L=1,3 + R24(L)=C(L,K)-C(L,I2) + ENDDO + IND=((J-1)*(2*NRES-J-6))/2+K-3 + PRODU(1)=R13(2)*R24(3)-R13(3)*R24(2) + PRODU(2)=R13(3)*R24(1)-R13(1)*R24(3) + PRODU(3)=R13(1)*R24(2)-R13(2)*R24(1) + DRDG(IND,I)=SCALAR(E12,PRODU)/DIST(J,K) + ENDDO + ENDDO + ENDDO + RETURN + END + + SUBROUTINE HEVAL + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DISTFIT' + + DO I=1,NX + XI=0.0 + HII=0.0 + DO K=1,NY + BKI=DRDG(K,I) + BKIWK=w(K)*BKI + XI=XI+BKIWK*(D0(K)-DD(K)) + HII=HII+BKI*BKIWK + ENDDO + H(I,I)=HII + XX(I)=XI + DO J=I+1,NX + HIJ=0.0 + DO K=1,NY + HIJ=HIJ+DRDG(K,I)*DRDG(K,J)*w(K) + ENDDO + H(I,J)=HIJ + H(J,I)=HIJ + ENDDO + ENDDO + RETURN + END + + + SUBROUTINE VEC(I,J,U) +* +* Find the unit vector from atom (I) to atom (J). Store in U. +* + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + DIMENSION U(3) + + ANORM=0.0 + DO K=1,3 + UK=C(K,J)-C(K,I) + ANORM=ANORM+UK*UK + U(K)=UK + ENDDO + ANORM=SQRT(ANORM) + DO K=1,3 + U(K)=U(K)/ANORM + ENDDO + RETURN + END + + SUBROUTINE TRANSFER(N,X1,X2) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION X1(N),X2(N) + DO 1 I=1,N + 1 X2(I)=X1(I) + RETURN + END + diff --git a/source/unres/src_MD-M-newcorr/djacob.f b/source/unres/src_MD-M-newcorr/djacob.f new file mode 100644 index 0000000..e3f46bc --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/econstr_local.F b/source/unres/src_MD-M-newcorr/econstr_local.F new file mode 100644 index 0000000..f11acfb --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/ecorr_num.f b/source/unres/src_MD-M-newcorr/ecorr_num.f new file mode 100644 index 0000000..3afecb9 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/ecorr_num.f @@ -0,0 +1,593 @@ +C------------------------------------------------------------------------------ +C Set of diagnostic routines for checking cumulant terms by numerical +C integration. They are not required unless new correlation terms need +C to be checked. +C------------------------------------------------------------------------------ + subroutine checkint3(i,j,mu1,mu2,a22,a23,a32,a33,acipa, + & eel_loc_ij) +C Calculate third-order correlation terms by numerical integration. + 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' +! real*8 mu(2,maxres),muder(2,maxres), +! & muij(4),mu1(2,maxres),mu2(2,maxres),auxvec(2) + real*8 muij(4),auxvec(2) + iti=itortyp(itype(i)) + itj=itortyp(itype(j)) + eel_loc_1=a22*b1(1,iti)*b1(1,itj)+a23*b1(1,iti)*b1(2,itj)+ + & a32*b1(2,iti)*b1(1,itj)+a33*b1(2,iti)*b1(2,itj) + eel_loc_2=a22*b1(1,iti)*Ub2(1,j)+a23*b1(1,iti)*Ub2(2,j)+ + & a32*b1(2,iti)*Ub2(1,j)+a33*b1(2,iti)*Ub2(2,j) + eel_loc_3=a22*Ub2(1,i)*b1(1,itj)+a23*Ub2(1,i)*b1(2,itj)+ + & a32*Ub2(2,i)*b1(1,itj)+a33*Ub2(2,i)*b1(2,itj) + eel_loc_4=a22*Ub2(1,i)*Ub2(1,j)+a23*Ub2(1,i)*Ub2(2,j)+ + & a32*Ub2(2,i)*Ub2(1,j)+a33*Ub2(2,i)*Ub2(2,j) + if (i.gt.iatel_s) then + iti1=itortyp(itype(i)) + else + iti1=4 + endif + iti2=itortyp(itype(i+1)) + itj1=itortyp(itype(j)) + if (j.lt.iatel_e+2) then + itj2=itortyp(itype(j+1)) + else + itj2=4 + endif + if (j.lt.nres-1) then + call integral3(phi(i+2),phi(j+2),iti1,iti2,itj1,itj2, + & acipa,.false.,eel_1,eel_2,eel_3,eel_4) + else + call integral3(phi(i+2),phi(j+2),iti1,iti2,itj1,itj2, + & acipa,.true.,eel_1,eel_2,eel_3,eel_4) + endif +cd write (iout,*) 'eel_1',eel_loc_1,' eel_1_num',4*eel_1 +cd write (iout,*) 'eel_2',eel_loc_2,' eel_2_num',4*eel_2 +cd write (iout,*) 'eel_3',eel_loc_3,' eel_3_num',4*eel_3 +cd write (iout,*) 'eel_4',eel_loc_4,' eel_4_num',4*eel_4 + write (iout,*) 'eel',eel_loc_ij,' eel_num', + &4*(eel_1+eel_2+eel_3+eel_4) + return + end +c---------------------------------------------------------------------- + subroutine checkint4(i,j,k,l,jj,kk,eel4_num) +c Calculate fourth-order correlation terms by numerical integration. + 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 gx(3),gx1(3) + double precision ee1t(2,2),ee2t(2,2),ee1ta1(2,2),ee2ta2(2,2), + & ee1ta1_der(2,2,3,5),ee2ta2_der(2,2,3,5),aa1(2,2),aa2(2,2), + & aa2t(2,2),uugk(2,2),uugl(2,2),uugj(2,2),pizda(2,2) + itk = itortyp(itype(k)) +C Check integrals +C Copy dipole matrices to temporary arrays + 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 +C Apply inverse transformation + do iii=1,2 + aa1(1,iii)=-aa1(1,iii) + enddo + if (j.lt.nres-1) then + do iii=1,2 + aa1(iii,1)=-aa1(iii,1) + enddo + else + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=-aa1(iii,jjj) + enddo + enddo + endif + if (k.lt.nres-1) then + do iii=1,2 + aa2(1,iii)=-aa2(1,iii) + enddo + else + do iii=1,2 + do jjj=1,2 + aa2(iii,jjj)=-aa2(iii,jjj) + enddo + enddo + endif + if (l.lt.nres-1) then + do iii=1,2 + aa2(iii,1)=-aa2(iii,1) + enddo + else + do iii=1,2 + do jjj=1,2 + aa2(iii,jjj)=-aa2(iii,jjj) + enddo + enddo + endif + if (l.eq.j+1) then + itl = itortyp(itype(l)) +c Compute numerical integrals + print *,phi(k+2),phi(l+2),itk,itl + if (l.lt.nres-1) then +cd write(2,*)'1 ',itk,itl,a_chuj(:,:,jj,i),a_chuj(:,:,kk,k) +c call integral(0.0d0,0.0d0,itk,itl,aa1(1,1), +c & aa2(1,1),1.0d0,1.0d0,-1.0d0,-1.0d0,.false.,eel4_num) + call integral(0.0d0,phi(k+2)-pi,0.0d0,phi(l+2)-pi,itk,itl, + & aa1(1,1),aa2(1,1), + & 1.0d0,-1.0d0,1.0d0,-1.0d0,.false.,eel4_num) + else +cd write(2,*)'2 ',itk,itl,a_chuj(:,:,jj,i),a_chuj(:,:,kk,k) +c call integral(0.0d0,0.0d0,itk,itl,aa1(1,1), +c & aa2(1,1),1.0d0,1.0d0,1.0d0,1.0d0,.false.,eel4_num) + call integral(0.0d0,phi(k+2)-pi,0.0d0,0.0d0,itk,itl, + & aa1(1,1),aa2(1,1), + & 1.0d0,-1.0d0,1.0d0,-1.0d0,.false.,eel4_num) + endif + else + itl = itortyp(itype(j)) + if (j.lt.nres-1) then + call integral(0.0d0,phi(k+2)-pi,phi(j+2)-pi,0.0d0,itk,itl, + & aa1(1,1),aa2(1,1),1.0d0,-1.0d0,-1.0d0,1.0d0,.true.,eel4_num) + else + call integral(0.0d0,phi(k+2)-pi,0.0d0,0.0d0,itk,itl,aa1(1,1), + & aa2(1,1),1.0d0,-1.0d0,-1.0d0,1.0d0,.true.,eel4_num) + endif + endif +c end check + return + end +c----------------------------------------------------------------------------- + subroutine checkint5(i,j,k,l,jj,kk,eel5_1_num,eel5_2_num, + & eel5_3_num,eel5_4_num) +c Calculate fifth-order correlation terms by numerical integration. + 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 gx(3),gx1(3) + double precision ee1t(2,2),ee2t(2,2),ee1ta1(2,2),ee2ta2(2,2), + & ee1ta1_der(2,2,3,5),ee2ta2_der(2,2,3,5),aa1(2,2),aa2(2,2), + & aa2t(2,2),uugk(2,2),uugl(2,2),uugj(2,2),pizda(2,2) + iti = itortyp(itype(i)) + itk = itortyp(itype(k)) + itk1= itortyp(itype(k+1)) +C Check integrals +C Copy dipole matrices to temporary arrays + 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 +C Apply inverse transformation + do iii=1,2 + aa1(1,iii)=-aa1(1,iii) + enddo + if (j.lt.nres-1) then + do iii=1,2 + aa1(iii,1)=-aa1(iii,1) + enddo + else + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=-aa1(iii,jjj) + enddo + enddo + endif + if (k.lt.nres-1) then + do iii=1,2 + aa2(1,iii)=-aa2(1,iii) + enddo + else + do iii=1,2 + do jjj=1,2 + aa2(iii,jjj)=-aa2(iii,jjj) + enddo + enddo + endif + if (l.lt.nres-1) then + do iii=1,2 + aa2(iii,1)=-aa2(iii,1) + enddo + else + do iii=1,2 + do jjj=1,2 + aa2(iii,jjj)=-aa2(iii,jjj) + enddo + enddo + endif + eel5_1_num=0.0d0 + eel5_2_num=0.0d0 + eel5_3_num=0.0d0 + eel5_4_num=0.0d0 + if (l.eq.j+1) then + itj = itortyp(itype(j)) + itl = itortyp(itype(l)) + itl1= itortyp(itype(l+1)) +c Compute numerical integrals + if (l.lt.nres-1) then + if (i.gt.1) then + call integral5(phi(i+2),phi(k+2),phi(j+2),phi(l+2), + & iti,itk,itk1,itj,itl,itl1,aa1(1,1),aa2(1,1), + & 1,1,1,1,.false.,eel5_1_num,eel5_2_num,eel5_3_num,eel5_4_num) + else + call integral5(phi(i+2),phi(k+2),phi(j+2),phi(l+2), + & iti,itk,itk1,itj,itl,itl1,aa1(1,1),aa2(1,1), + & -1,1,1,1,.false.,eel5_1_num,eel5_2_num,eel5_3_num,eel5_4_num) + endif + else + if (i.gt.1) then + call integral5(phi(i+2),phi(k+2),phi(j+2),pi, + & iti,itk,itk1,itj,itl,itl1,aa1(1,1),aa2(1,1), + & 1,1,1,-1,.false.,eel5_1_num,eel5_2_num,eel5_3_num,eel5_4_num) + else + call integral5(phi(i+2),phi(k+2),phi(j+2),pi, + & iti,itk,itk1,itj,itl,itl1,aa1(1,1),aa2(1,1), + & -1,1,1,-1,.false.,eel5_1_num,eel5_2_num,eel5_3_num,eel5_4_num) + endif + endif + else + itj = itortyp(itype(j)) + itl = itortyp(itype(l)) + itj1= itortyp(itype(j+1)) + if (j.lt.nres-1) then + if (i.gt.1) then + call integral5(phi(i+2),phi(k+2),phi(l+2),phi(j+2), + & iti,itk,itk1,itl,itj,itj1,aa1(1,1),aa2(1,1), + & 1,1,1,1,.true.,eel5_1_num,eel5_2_num,eel5_3_num,eel5_4_num) + else + call integral5(phi(i+2),phi(k+2),phi(l+2),phi(j+2), + & iti,itk,itk1,itl,itj,itj1,aa1(1,1),aa2(1,1), + & -1,1,1,1,.true.,eel5_1_num,eel5_2_num,eel5_3_num,eel5_4_num) + endif + else + if (i.gt.1) then + call integral5(phi(i+2),phi(k+2),phi(l+2),pi, + & iti,itk,itk1,itl,itj,itj1,aa1(1,1),aa2(1,1), + & 1,1,1,-1,.true.,eel5_1_num,eel5_2_num,eel5_3_num,eel5_4_num) + else + call integral5(phi(i+2),phi(k+2),phi(l+2),pi, + & iti,itk,itk1,itl,itj,itj1,aa1(1,1),aa2(1,1), + & -1,1,1,-1,.true.,eel5_1_num,eel5_2_num,eel5_3_num,eel5_4_num) + endif + endif + endif +c end check + return + end +c----------------------------------------------------------------------------- + subroutine checkint6(i,j,k,l,jj,kk,eel6_1_num,eel6_2_num, + & eel6_3_num,eel6_4_num,eel6_5_num,eel6_6_num) +c Calculate sixth-order correlation terms by numerical integration. + 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 gx(3),gx1(3) + double precision ee1t(2,2),ee2t(2,2),ee1ta1(2,2),ee2ta2(2,2), + & ee1ta1_der(2,2,3,5),ee2ta2_der(2,2,3,5),aa1(2,2),aa2(2,2), + & aa2t(2,2),uugk(2,2),uugl(2,2),uugj(2,2),pizda(2,2) + iti = itortyp(itype(i)) + itk = itortyp(itype(k)) + itk1= itortyp(itype(k+1)) +C Check integrals +C Copy dipole matrices to temporary arrays + 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 +C Apply inverse transformation + do iii=1,2 + aa1(1,iii)=-aa1(1,iii) + enddo + if (j.lt.nres-1) then + do iii=1,2 + aa1(iii,1)=-aa1(iii,1) + enddo + else + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=-aa1(iii,jjj) + enddo + enddo + endif + if (k.lt.nres-1) then + do iii=1,2 + aa2(1,iii)=-aa2(1,iii) + enddo + else + do iii=1,2 + do jjj=1,2 + aa2(iii,jjj)=-aa2(iii,jjj) + enddo + enddo + endif + if (l.lt.nres-1) then + do iii=1,2 + aa2(iii,1)=-aa2(iii,1) + enddo + else + do iii=1,2 + do jjj=1,2 + aa2(iii,jjj)=-aa2(iii,jjj) + enddo + enddo + endif + eel6_1_num=0.0d0 + eel6_2_num=0.0d0 + eel6_3_num=0.0d0 + eel6_4_num=0.0d0 + eel6_5_num=0.0d0 + eel6_6_num=0.0d0 + if (l.eq.j+1) then + itj = itortyp(itype(j)) + itl = itortyp(itype(l)) + itl1= itortyp(itype(l+1)) +c Compute numerical integrals + if (l.lt.nres-1) then + if (i.gt.1) then + call integral6(phi(i+2),phi(k+2),phi(j+2),phi(l+2), + & iti,itk,itk1,itj,itl,itl1,aa1(1,1),aa2(1,1), + & 1,1,1,1,.false.,eel6_1_num,eel6_2_num,eel6_3_num,eel6_4_num, + & eel6_5_num,eel6_6_num) + else + call integral6(phi(i+2),phi(k+2),phi(j+2),phi(l+2), + & iti,itk,itk1,itj,itl,itl1,aa1(1,1),aa2(1,1), + & -1,1,1,1,.false.,eel6_1_num,eel6_2_num,eel6_3_num,eel6_4_num, + & eel6_5_num,eel6_6_num) + endif + else + if (i.gt.1) then + call integral6(phi(i+2),phi(k+2),phi(j+2),pi, + & iti,itk,itk1,itj,itl,itl1,aa1(1,1),aa2(1,1), + & 1,1,1,-1,.false.,eel6_1_num,eel6_2_num,eel6_3_num,eel6_4_num, + & eel6_5_num,eel6_6_num) + else + call integral6(phi(i+2),phi(k+2),phi(j+2),pi, + & iti,itk,itk1,itj,itl,itl1,aa1(1,1),aa2(1,1), + & -1,1,1,-1,.false.,eel6_1_num,eel6_2_num,eel6_3_num,eel6_4_num, + & eel6_5_num,eel6_6_num) + endif + endif + else + itj = itortyp(itype(j)) + itl = itortyp(itype(l)) + itj1= itortyp(itype(j+1)) + if (j.lt.nres-1) then + if (i.gt.1) then + call integral6(phi(i+2),phi(k+2),phi(l+2),phi(j+2), + & iti,itk,itk1,itl,itj,itj1,aa1(1,1),aa2(1,1), + & 1,1,1,1,.true.,eel6_1_num,eel6_2_num,eel6_3_num,eel6_4_num, + & eel6_5_num,eel6_6_num) + else + call integral6(phi(i+2),phi(k+2),phi(l+2),phi(j+2), + & iti,itk,itk1,itl,itj,itj1,aa1(1,1),aa2(1,1), + & -1,1,1,1,.true.,eel6_1_num,eel6_2_num,eel6_3_num,eel6_4_num, + & eel6_5_num,eel6_6_num) + endif + else + if (i.gt.1) then + call integral6(phi(i+2),phi(k+2),phi(l+2),pi, + & iti,itk,itk1,itl,itj,itj1,aa1(1,1),aa2(1,1), + & 1,1,1,-1,.true.,eel6_1_num,eel6_2_num,eel6_3_num,eel6_4_num, + & eel6_5_num,eel6_6_num) + else + call integral6(phi(i+2),phi(k+2),phi(l+2),pi, + & iti,itk,itk1,itl,itj,itj1,aa1(1,1),aa2(1,1), + & -1,1,1,-1,.true.,eel6_1_num,eel6_2_num,eel6_3_num,eel6_4_num, + & eel6_5_num,eel6_6_num) + endif + endif + endif +c end check + return + end +c----------------------------------------------------------------------------- + subroutine checkint_turn6(i,jj,kk,eel_turn6_num) +c Calculate sixth-order turn correlation terms by numerical integration. + 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 gx(3),gx1(3) + double precision ee1t(2,2),ee2t(2,2),ee1ta1(2,2),ee2ta2(2,2), + & ee1ta1_der(2,2,3,5),ee2ta2_der(2,2,3,5),aa1(2,2),aa2(2,2), + & aa2t(2,2),uugk(2,2),uugl(2,2),uugj(2,2),pizda(2,2) + k = i+1 + l = i+3 + j = i+4 + iti = itortyp(itype(i)) + itk = itortyp(itype(k)) + itk1= itortyp(itype(k+1)) +C Check integrals +C Copy dipole matrices to temporary arrays + 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 +C Apply inverse transformation + do iii=1,2 + aa1(1,iii)=-aa1(1,iii) + enddo + if (j.lt.nres-1) then + do iii=1,2 + aa1(iii,1)=-aa1(iii,1) + enddo + else + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=-aa1(iii,jjj) + enddo + enddo + endif + if (k.lt.nres-1) then + do iii=1,2 + aa2(1,iii)=-aa2(1,iii) + enddo + else + do iii=1,2 + do jjj=1,2 + aa2(iii,jjj)=-aa2(iii,jjj) + enddo + enddo + endif + if (l.lt.nres-1) then + do iii=1,2 + aa2(iii,1)=-aa2(iii,1) + enddo + else + do iii=1,2 + do jjj=1,2 + aa2(iii,jjj)=-aa2(iii,jjj) + enddo + enddo + endif + eel_turn6_num=0.0d0 + itj = itortyp(itype(j)) + itl = itortyp(itype(l)) + itj1= itortyp(itype(j+1)) + call integral_turn6(phi(i+2),phi(i+3),phi(i+4),phi(i+5), + & iti,itk,itk1,itl,itj,itj1,aa1(1,1),aa2(1,1),eel_turn6_num) + write (2,*) 'eel_turn6_num',eel_turn6_num +c end check + return + end +c----------------------------------------------------------------------------- + subroutine checkint_turn3(i,a_temp,eel_turn3_num) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +c Calculate third-order turn correlation terms by numerical integration. + 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 a_temp(2,2),aa1(2,2) + iti1 = itortyp(itype(i+1)) + iti2 = itortyp(itype(i+2)) +C Check integrals +C Apply inverse transformation + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=a_temp(iii,jjj) + enddo + enddo + do iii=1,2 + aa1(1,iii)=-aa1(1,iii) + enddo + if (i.lt.nres-3) then + do iii=1,2 + aa1(iii,1)=-aa1(iii,1) + enddo + else + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=-aa1(iii,jjj) + enddo + enddo + endif + eel_turn3_num=0.0d0 +c Compute numerical integrals + if (i.lt.nres-3) then + call integral3a(phi(i+3),phi(i+4),iti1,iti2, + & aa1(1,1), 1,eel_turn3_num) + else + call integral3a(phi(i+3),phi(i+4),iti1,iti2, + & aa1(1,1),-1,eel_turn3_num) + endif +c end check + return + end +c----------------------------------------------------------------------------- + subroutine checkint_turn4(i,a_temp,eel_turn4_num) +c Calculate fourth-order turn correlation terms by numerical integration. + 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 a_temp(2,2),aa1(2,2) + iti1 = itortyp(itype(i+1)) + iti2 = itortyp(itype(i+2)) + iti3 = itortyp(itype(i+3)) +C Check integrals +C Apply inverse transformation + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=a_temp(iii,jjj) + enddo + enddo + do iii=1,2 + aa1(1,iii)=-aa1(1,iii) + enddo + if (i.lt.nres-4) then + do iii=1,2 + aa1(iii,1)=-aa1(iii,1) + enddo + else + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=-aa1(iii,jjj) + enddo + enddo + endif + eel_turn4_num=0.0d0 +c Compute numerical integrals + if (i.lt.nres-4) then + call integral4a(phi(i+3),phi(i+4),phi(i+5), + & iti1,iti2,iti3,aa1(1,1),1,eel_turn4_num) + else + call integral4a(phi(i+3),phi(i+4),phi(i+5), + & iti1,iti2,iti3,aa1(1,1),-1,eel_turn4_num) + endif +c end check + return + end diff --git a/source/unres/src_MD-M-newcorr/eelec.F b/source/unres/src_MD-M-newcorr/eelec.F new file mode 100644 index 0000000..492d5db --- /dev/null +++ b/source/unres/src_MD-M-newcorr/eelec.F @@ -0,0 +1,278 @@ + 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) + 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),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,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 + call set_matrices + 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 + num_conti_hb=0 + 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 + 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 + 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 + aaa=app(iteli,itelj) + bbb=bpp(iteli,itelj) + ael6i=ael6(iteli,itelj) + ael3i=ael3(iteli,itelj) +C Diagnostics only!!! +c aaa=0.0D0 +c bbb=0.0D0 +c ael6i=0.0D0 +c ael3i=0.0D0 +C End diagnostics + 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 + do k=1,3 + ghalf=0.5D0*ggg(k) + gelc(k,i)=gelc(k,i)+ghalf + gelc(k,j)=gelc(k,j)+ghalf + enddo +* +* Loop over residues i+1 thru j-1. +* +caug8 do k=i+1,j-1 +caug8 do l=1,3 +caug8 gelc(l,k)=gelc(l,k)+ggg(l) +caug8 enddo +caug8 enddo + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj + do k=1,3 + ghalf=0.5D0*ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)+ghalf + gvdwpp(k,j)=gvdwpp(k,j)+ghalf + enddo +* +* Loop over residues i+1 thru j-1. +* +caug8 do k=i+1,j-1 +caug8 do l=1,3 +caug8 gvdwpp(l,k)=gvdwpp(l,k)+ggg(l) +caug8 enddo +caug8 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 + do k=1,3 + ghalf=0.5D0*ggg(k) + gelc(k,i)=gelc(k,i)+ghalf + gelc(k,j)=gelc(k,j)+ghalf + enddo +* +* Loop over residues i+1 thru j-1. +* +caug8 do k=i+1,j-1 +caug8 do l=1,3 +caug8 gelc(l,k)=gelc(l,k)+ggg(l) +caug8 enddo +caug8 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 + do k=1,3 + ghalf=0.5D0*ggg(k) + gelc(k,i)=gelc(k,i)+ghalf + & +(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)+ghalf + & +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + enddo +caug8 do k=i+1,j-1 +caug8 do l=1,3 +caug8 gelc(l,k)=gelc(l,k)+ggg(l) +caug8 enddo +caug8 enddo + + 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 + return + end + diff --git a/source/unres/src_MD-M-newcorr/eigen.f b/source/unres/src_MD-M-newcorr/eigen.f new file mode 100644 index 0000000..e4088ee --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/elecont.f b/source/unres/src_MD-M-newcorr/elecont.f new file mode 100644 index 0000000..a962630 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/elecont.f @@ -0,0 +1,511 @@ + 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 + if (itype(i).eq.ntyp1 .or. itype(i+1).eq.ntyp1) goto 1 + 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 + if (itype(j).eq.ntyp1 .or. itype(j+1).eq.ntyp1) goto 4 + 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-M-newcorr/energy_p_new-sep.F b/source/unres/src_MD-M-newcorr/energy_p_new-sep.F new file mode 100644 index 0000000..0b8f27b --- /dev/null +++ b/source/unres/src_MD-M-newcorr/energy_p_new-sep.F @@ -0,0 +1,2505 @@ +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 + 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) + enddo + do k=i,j-1 + do l=1,3 + gvdwc(l,k)=gvdwc(l,k)+gg(l) + enddo + 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 +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.gt.0.0d0) then + rrij=1.0D0/rij + 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) + enddo + do k=i,j-1 + do l=1,3 + gvdwc(l,k)=gvdwc(l,k)+gg(l) + enddo + 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+evdwij*(1.0d0-sss) +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) + enddo + do k=i,j-1 + do l=1,3 + gvdwc(l,k)=gvdwc(l,k)+gg(l) + enddo + 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+evdwij*sss +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) + enddo + do k=i,j-1 + do l=1,3 + gvdwc(l,k)=gvdwc(l,k)+gg(l) + enddo + 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) +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) +cd if (icall.eq.0) then +cd rrsave(ind)=rrij +cd else +cd rrij=rrsave(ind) +cd endif + 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) +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) +cd if (icall.eq.0) then +cd rrsave(ind)=rrij +cd else +cd rrij=rrsave(ind) +cd endif + 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) +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 +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) +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) +c write (iout,*) "dcnorj",dxi*dxi+dyi*dyi+dzi*dzi +c write (iout,*) "j",j," dc_norm", +c & dc_norm(1,nres+j),dc_norm(2,nres+j),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))) +c write(iout,*) "long",i,itypi,j,itypj," rij",1.0d0/rij, +c & " sigmaii",sigmaii(itypi,itypj)," sss",sss + + 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 + evdw=evdw+evdwij*(1.0d0-sss) +c write (iout,*) "evdwij",evdwij," evdw",evdw + 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. + call sc_grad_scale(1.0d0-sss) + + endif + + enddo ! j + enddo ! iint + enddo ! i +cccc energy_dec=.false. + return + end +C----------------------------------------------------------------------------- + subroutine egb_short(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 +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) +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) +c write (iout,*) "dcnorj",dxi*dxi+dyi*dyi+dzi*dzi +c write (iout,*) "j",j," dc_norm", +c & dc_norm(1,nres+j),dc_norm(2,nres+j),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))) +c write(iout,*) "short",i,itypi,j,itypj," rij",1.0d0/rij, +c & " sigmaii",sigmaii(itypi,itypj)," sss",sss + 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 + evdw=evdw+evdwij*sss +c write (iout,*) "evdwij",evdwij," evdw",evdw + 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. + call sc_grad_scale(sss) + + endif + + enddo ! j + enddo ! iint + enddo ! i +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) +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) + + 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) +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) + + 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 k=i,j-1 + do l=1,3 + gvdwc(l,k)=gvdwc(l,k)+gg(l) + enddo + 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) + 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),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,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 + call set_matrices + 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 + num_conti_hb=0 + 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 +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 +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=0 + 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_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 + num_conti=0 +c write (iout,*) 'i',i,' ielstart',ielstart(i),' ielend',ielend(i) + do j=ielstart(i),ielend(i) + call eelecij_scale(i,j,ees,evdw1,eel_loc) + enddo ! j + num_cont_hb(i)=num_cont_hb(i)+num_conti + enddo ! i + return + end +C------------------------------------------------------------------------------- + subroutine eelecij_scale(i,j,ees,evdw1,eel_loc) +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) + 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),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/ + 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) +C Diagnostics only!!! +c aaa=0.0D0 +c bbb=0.0D0 +c ael6i=0.0D0 +c ael3i=0.0D0 +C End diagnostics + 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)) +c + 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)') '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)*(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 + do k=1,3 + ghalf=0.5D0*ggg(k) + gelc(k,i)=gelc(k,i)+ghalf + gelc(k,j)=gelc(k,j)+ghalf + enddo +* +* Loop over residues i+1 thru j-1. +* + do k=i+1,j-1 + do l=1,3 + gelc(l,k)=gelc(l,k)+ggg(l) + enddo + enddo + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj + do k=1,3 + ghalf=0.5D0*ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)+ghalf + gvdwpp(k,j)=gvdwpp(k,j)+ghalf + enddo +* +* Loop over residues i+1 thru j-1. +* + do k=i+1,j-1 + do l=1,3 + gvdwpp(l,k)=gvdwpp(l,k)+ggg(l) + enddo + 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 + do k=1,3 + ghalf=0.5D0*ggg(k) + gelc(k,i)=gelc(k,i)+ghalf + gelc(k,j)=gelc(k,j)+ghalf + enddo +* +* Loop over residues i+1 thru j-1. +* + do k=i+1,j-1 + do l=1,3 + gelc(l,k)=gelc(l,k)+ggg(l) + enddo + 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 + do k=1,3 + ghalf=0.5D0*ggg(k) + gelc(k,i)=gelc(k,i)+ghalf + & +(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)+ghalf + & +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + enddo + do k=i+1,j-1 + do l=1,3 + gelc(l,k)=gelc(l,k)+ggg(l) + enddo + 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 +C For diagnostics only +cd a22=1.0d0 +cd a23=1.0d0 +cd a32=1.0d0 +cd a33=1.0d0 + fac=dsqrt(-ael6i)*r3ij +cd write (2,*) 'fac=',fac +C For diagnostics only +cd fac=1.0d0 + 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)) +cd do k=1,3 +cd do l=1,3 +cd erder(k,l)=0.0d0 +cd enddo +cd enddo + 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 +cd do k=1,3 +cd do l=1,3 +cd uryg(k,l)=0.0d0 +cd urzg(k,l)=0.0d0 +cd vryg(k,l)=0.0d0 +cd vrzg(k,l)=0.0d0 +cd enddo +cd enddo +C Compute radial contributions to the gradient + facr=-3.0d0*rrmij + a22der=a22*facr + a23der=a23*facr + a32der=a32*facr + a33der=a33*facr +cd a22der=0.0d0 +cd a23der=0.0d0 +cd a32der=0.0d0 +cd a33der=0.0d0 + 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) + ghalf1=0.5d0*agg(k,1) + ghalf2=0.5d0*agg(k,2) + ghalf3=0.5d0*agg(k,3) + 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) +cd aggi(k,1)=ghalf1 +cd aggi(k,2)=ghalf2 +cd aggi(k,3)=ghalf3 +cd aggi(k,4)=ghalf4 +C Derivatives in DC(i+1) +cd aggi1(k,1)=agg(k,1) +cd aggi1(k,2)=agg(k,2) +cd aggi1(k,3)=agg(k,3) +cd aggi1(k,4)=agg(k,4) +C Derivatives in DC(j) +cd aggj(k,1)=ghalf1 +cd aggj(k,2)=ghalf2 +cd aggj(k,3)=ghalf3 +cd aggj(k,4)=ghalf4 +C Derivatives in DC(j+1) +cd aggj1(k,1)=0.0d0 +cd aggj1(k,2)=0.0d0 +cd aggj1(k,3)=0.0d0 +cd aggj1(k,4)=0.0d0 + if (j.eq.nres-1 .and. i.lt.j-2) then + do l=1,4 + aggj1(k,l)=aggj1(k,l)+agg(k,l) +cd aggj1(k,l)=agg(k,l) + enddo + endif + enddo +c goto 11111 +C Check the loc-el terms by numerical integration + 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 +11111 continue + 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) +cd call checkint3(i,j,mu1,mu2,a22,a23,a32,a33,acipa,eel_loc_ij) +cd write(iout,*) 'agg ',agg +cd write(iout,*) 'aggi ',aggi +cd write(iout,*) 'aggi1',aggi1 +cd write(iout,*) 'aggj ',aggj +cd write(iout,*) 'aggj1',aggj1 + +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) + enddo + do k=i+2,j2 + do l=1,3 + gel_loc(l,k)=gel_loc(l,k)+ggg(l) + enddo + 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 + if (j.gt.i+1 .and. num_conti.le.maxconts) then +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 + 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 +c if (i.eq.1) then +c a_chuj(1,1,num_conti,i)=-0.61d0 +c a_chuj(1,2,num_conti,i)= 0.4d0 +c a_chuj(2,1,num_conti,i)= 0.65d0 +c a_chuj(2,2,num_conti,i)= 0.50d0 +c else if (i.eq.2) then +c a_chuj(1,1,num_conti,i)= 0.0d0 +c a_chuj(1,2,num_conti,i)= 0.0d0 +c a_chuj(2,1,num_conti,i)= 0.0d0 +c a_chuj(2,2,num_conti,i)= 0.0d0 +c endif +C --- and its gradients +cd write (iout,*) 'i',i,' j',j +cd do kkk=1,3 +cd write (iout,*) 'iii 1 kkk',kkk +cd write (iout,*) agg(kkk,:) +cd enddo +cd do kkk=1,3 +cd write (iout,*) 'iii 2 kkk',kkk +cd write (iout,*) aggi(kkk,:) +cd enddo +cd do kkk=1,3 +cd write (iout,*) 'iii 3 kkk',kkk +cd write (iout,*) aggi1(kkk,:) +cd enddo +cd do kkk=1,3 +cd write (iout,*) 'iii 4 kkk',kkk +cd write (iout,*) aggj(kkk,:) +cd enddo +cd do kkk=1,3 +cd write (iout,*) 'iii 5 kkk',kkk +cd write (iout,*) aggj1(kkk,:) +cd 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) +c do mm=1,5 +c a_chuj_der(k,l,m,mm,num_conti,i)=0.0d0 +c enddo + 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 + ghalfp=0.5D0*gggp(k) + 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 + return + end +C----------------------------------------------------------------------- + subroutine evdwpp_long(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 + 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 + 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 + 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.lt.1.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)') 'evdw1',i,j,evdwij + write (iout,'(a6,2i5,0pf7.3)') 'ees',i,j,eesij + endif + evdw1=evdw1+evdwij*(1.0d0-sss) +C +C Calculate contributions to the Cartesian gradient. +C + facvdw=-6*rrmij*(ev1+evdwij)*(1.0d0-sss) + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj + + do k=1,3 + ghalf=0.5D0*ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)+ghalf + gvdwpp(k,j)=gvdwpp(k,j)+ghalf + enddo +* +* Loop over residues i+1 thru j-1. +* + do k=i+1,j-1 + do l=1,3 + gvdwpp(l,k)=gvdwpp(l,k)+ggg(l) + enddo + enddo + endif + enddo ! j + enddo ! i + 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 + 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 + 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 + 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)') 'evdw1',i,j,evdwij + write (iout,'(a6,2i5,0pf7.3)') 'ees',i,j,eesij + 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 + ghalf=0.5D0*ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)+ghalf + gvdwpp(k,j)=gvdwpp(k,j)+ghalf + enddo +* +* Loop over residues i+1 thru j-1. +* + do k=i+1,j-1 + do l=1,3 + gvdwpp(l,k)=gvdwpp(l,k)+ggg(l) + enddo + 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 + if (j.lt.i) then +cd write (iout,*) 'ji' + do k=1,3 + ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) + enddo + endif + do k=1,3 + gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) + enddo + kstart=min0(i+1,j) + 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) + do k=kstart,kend + do l=1,3 + gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) + enddo + enddo + + endif + + enddo + + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(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 + if (j.lt.i) then +cd write (iout,*) 'ji' + do k=1,3 + ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) + enddo + endif + do k=1,3 + gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) + enddo + kstart=min0(i+1,j) + 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) + do k=kstart,kend + do l=1,3 + gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) + enddo + enddo + + endif + + enddo + + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(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-M-newcorr/energy_p_new-sep_barrier.F b/source/unres/src_MD-M-newcorr/energy_p_new-sep_barrier.F new file mode 100644 index 0000000..6592ace --- /dev/null +++ b/source/unres/src_MD-M-newcorr/energy_p_new-sep_barrier.F @@ -0,0 +1,2268 @@ +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) + if (itypi.eq.ntyp1) cycle + 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) + if (itypj.eq.ntyp1) cycle + 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) + if (itypi.eq.ntyp1) 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.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 + 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) + if (itypi.eq.ntyp1) cycle + 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) + if (itypj.eq.ntyp1) cycle + 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) + if (itypi.eq.ntyp1) cycle + 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) + if (itypj.eq.ntyp1) cycle + 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) + if (itypi.eq.ntyp1) cycle + 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) + if (itypj.eq.ntyp1) cycle +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) + if (itypi.eq.ntyp1) cycle + 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) + if (itypj.eq.ntyp1) cycle +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) +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 +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) + if (itypi.eq.ntyp1) cycle + 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) + if (itypj.eq.ntyp1) cycle +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 + 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) + 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. + call sc_grad_scale(1.0d0-sss) + 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) +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 +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) + if (itypi.eq.ntyp1) cycle + 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) + if (itypj.eq.ntyp1) cycle +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 + 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) + 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. + call sc_grad_scale(sss) + 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) + if (itypi.eq.ntyp1) cycle + 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) + if (itypj.eq.ntyp1) cycle +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) + if (itypi.eq.ntyp1) cycle + 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) + if (itypj.eq.ntyp1) cycle +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 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 + if (itype(i).eq.ntyp1.or. itype(i+1).eq.ntyp1 + & .or. itype(i+2).eq.ntyp1 .or. itype(i+3).eq.ntyp1) cycle + 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 + if (itype(i).eq.ntyp1 .or. itype(i+1).eq.ntyp1 + & .or. itype(i+3).eq.ntyp1 + & .or. itype(i+4).eq.ntyp1) cycle + 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 .and. itype(i+2).ne.ntyp1) + & 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 + if (itype(i).eq.ntyp1 .or. itype(i+1).eq.ntyp1) cycle + 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) + if (itype(j).eq.ntyp1 .or. itype(j+1).eq.ntyp1) cycle + 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 + if (itype(i).eq.ntyp1.or. itype(i+1).eq.ntyp1) cycle + 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) + if (itype(j).eq.ntyp1 .or. itype(j+1).eq.ntyp1) cycle + 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 + 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) + itypj=itype(j) + if (itypj.eq.ntyp1) 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) + + 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,2(0pf7.3))') + & 'evdw2',i,j,sss,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 + 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) + itypj=itype(j) + if (itypj.eq.ntyp1) 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) + + 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,2(0pf7.3))') + & 'evdw2',i,j,sss,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-M-newcorr/energy_p_new.F b/source/unres/src_MD-M-newcorr/energy_p_new.F new file mode 100644 index 0000000..0b25cb2 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/energy_p_new.F @@ -0,0 +1,8381 @@ + 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 +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 +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" + call vec_and_deriv +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) then +#else + if (welec.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0) then +#endif + call eelec(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 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) +c write (2,*) 'n_corr=',n_corr,' n_corr1=',n_corr1, +c &" ecorr",ecorr," ecorr5",ecorr5," ecorr6",ecorr6," eturn6",eturn6 + else + ecorr=0 + ecorr5=0 + ecorr6=0 + eturn6=0 + 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) + else + ecorr=0 + ecorr5=0 + ecorr6=0 + eturn6=0 + 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 +c print *,"Processor",myrank," computed Uconstr" +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" + 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_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+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' + double precision gradbufc(3,maxres),gradbufx(3,maxres), + & glocbuf(4*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' +C +C 9/29/08 AL Transform parts of gradients in site coordinates to the gradient +C in virtual-bond-vector coordinates +C +#ifdef TIMING + time01=MPI_Wtime() +#endif +#ifdef DEBUG + write (iout,*) "gel_loc gel_loc_long and gel_loc_loc" + do i=1,nres-1 + write (iout,'(i5,3f10.5,2x,3f10.5,2x,f10.5)') + & i,(gel_loc(j,i),j=1,3),(gel_loc_long(j,i),j=1,3),gel_loc_loc(i) + enddo + write (iout,*) "gcorr4_turn, gel_loc_turn4" + do i=1,nres-1 + write (iout,'(i5,3f10.5,2x,f10.5)') + & i,(gcorr4_turn(j,i),j=1,3),gel_loc_turn4(i) + enddo +#endif + do i=nnt,nres-1 + do k=1,3 + gvdwc(k,i)=0.0d0 + gvdwc_scp(k,i)=0.0d0 + enddo + do j=i+1,nres + do k=1,3 + gvdwc(k,i)=gvdwc(k,i)+gvdwc(k,j) + gvdwc_scp(k,i)=gvdwc_scp(k,i)+gvdwc_scp(k,j) + enddo + enddo + enddo + do i=nnt,nct-1 + do k=1,3 + gelc(k,i)=gelc(k,i)+0.5d0*gelc_long(k,i) + gvdwpp(k,i)=0.5d0*gvdwpp(k,i) + gvdwc_scp(k,i)=gvdwc_scp(k,i)+0.5d0*gvdwc_scpp(k,i) + enddo + do j=i+1,nct-1 + do k=1,3 + gelc(k,i)=gelc(k,i)+gelc_long(k,j) + gvdwpp(k,i)=gvdwpp(k,i)+gvdwpp(k,j) + gvdwc_scp(k,i)=gvdwc_scp(k,i)+gvdwc_scpp(k,j) + enddo + enddo + enddo + do i=nnt,nct-1 + do k=1,3 + gel_loc(k,i)=gel_loc(k,i)+0.5d0*gel_loc_long(k,i) + enddo + do j=i+1,nres-1 + do k=1,3 + gel_loc(k,i)=gel_loc(k,i)+gel_loc_long(k,j) + enddo + enddo + enddo + do k=1,3 + gvdwc_scp(k,nres)=0.0d0 + gvdwc(k,nres)=0.0d0 + gel_loc(k,nres)=0.0d0 + enddo +C +C Sum up the components of the Cartesian gradient. +C +#ifdef SPLITELE + do i=1,nct + do j=1,3 + gradc(j,i,icg)=wsc*gvdwc(j,i)+wscp*gvdwc_scp(j,i)+ + & welec*gelc(j,i)+wvdwpp*gvdwpp(j,i)+ + & wbond*gradb(j,i)+ + & wstrain*ghpbc(j,i)+ + & wcorr*gradcorr(j,i)+ + & wel_loc*gel_loc(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) + 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 +#else + do i=1,nct + do j=1,3 + gradc(j,i,icg)=wsc*gvdwc(j,i)+wscp*gvdwc_scp(j,i)+ + & welec*gelc(j,i)+wstrain*ghpbc(j,i)+ + & wbond*gradb(j,i)+ + & wcorr*gradcorr(j,i)+ + & wel_loc*gel_loc(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) + 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 +#endif +#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 +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (fg_rank.eq.0) call MPI_Bcast(1,1,MPI_INTEGER, + & king,FG_COMM,IERROR) + 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) + 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) + 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' + do k=1,3 + ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) + enddo + endif + do k=1,3 + gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) + enddo + kstart=min0(i+1,j) + 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) + do k=kstart,kend + do l=1,3 + gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) + enddo + 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' + dimension ggg(3) + ehpb=0.0D0 +cd print *,'edis: nhpb=',nhpb,' fbr=',fbr +cd print *,'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 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 + 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 + do j=iii,jjj-1 + do k=1,3 + ghpbc(k,j)=ghpbc(k,j)+ggg(k) + enddo + 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) + dsci_inv=dsc_inv(itypi) + itypj=itype(j) + dscj_inv=dsc_inv(itypj) + 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 + gg(k)=ed*erij(k)+eom1*dcosom1(k)+eom2*dcosom2(k) + enddo + do k=1,3 + ghpbx(k,i)=ghpbx(k,i)-gg(k) + & +(eom12*dc_norm(k,nres+j)+eom1*erij(k))*dsci_inv + ghpbx(k,j)=ghpbx(k,j)+gg(k) + & +(eom12*dc_norm(k,nres+i)+eom2*erij(k))*dscj_inv + enddo +C +C Calculate the components of the gradient in DC and X +C + do k=i,j-1 + do l=1,3 + ghpbc(l,k)=ghpbc(l,k)+gg(l) + enddo + 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 + 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 + 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------------------------------------------------------------------------------ +#ifdef MPI + subroutine pack_buffer(dimen1,dimen2,atom,indx,buffer) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer dimen1,dimen2,atom,indx + double precision buffer(dimen1,dimen2) + double precision zapas + common /contacts_hb/ zapas(3,maxconts,maxres,8), + & facont_hb(maxconts,maxres),ees0p(maxconts,maxres), + & ees0m(maxconts,maxres),d_cont(maxconts,maxres), + & num_cont_hb(maxres),jcont_hb(maxconts,maxres) + num_kont=num_cont_hb(atom) + do i=1,num_kont + do k=1,8 + do j=1,3 + buffer(i,indx+(k-1)*3+j)=zapas(j,i,atom,k) + enddo ! j + enddo ! k + buffer(i,indx+25)=facont_hb(i,atom) + buffer(i,indx+26)=ees0p(i,atom) + buffer(i,indx+27)=ees0m(i,atom) + buffer(i,indx+28)=d_cont(i,atom) + buffer(i,indx+29)=dfloat(jcont_hb(i,atom)) + enddo ! i + buffer(1,indx+30)=dfloat(num_kont) + return + end +c------------------------------------------------------------------------------ + subroutine unpack_buffer(dimen1,dimen2,atom,indx,buffer) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer dimen1,dimen2,atom,indx + double precision buffer(dimen1,dimen2) + double precision zapas + common /contacts_hb/ zapas(3,maxconts,maxres,8), + & facont_hb(maxconts,maxres),ees0p(maxconts,maxres), + & ees0m(maxconts,maxres),d_cont(maxconts,maxres), + & num_cont_hb(maxres),jcont_hb(maxconts,maxres) + num_kont=buffer(1,indx+30) + num_kont_old=num_cont_hb(atom) + num_cont_hb(atom)=num_kont+num_kont_old + do i=1,num_kont + ii=i+num_kont_old + do k=1,8 + do j=1,3 + zapas(j,ii,atom,k)=buffer(i,indx+(k-1)*3+j) + enddo ! j + enddo ! k + facont_hb(ii,atom)=buffer(i,indx+25) + ees0p(ii,atom)=buffer(i,indx+26) + ees0m(ii,atom)=buffer(i,indx+27) + d_cont(i,atom)=buffer(i,indx+28) + jcont_hb(ii,atom)=buffer(i,indx+29) + enddo ! i + return + end +c------------------------------------------------------------------------------ +#endif + 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=2*(8*3+6)) + parameter (msglen1=max_cont*max_dim) + parameter (msglen2=2*msglen1) + integer source,CorrelType,CorrelID,Error + double precision buffer(max_cont,max_dim) + integer status(MPI_STATUS_SIZE) +#endif + include 'COMMON.SETUP' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + 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:' + 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 +C Caution! Following code assumes that electrostatic interactions concerning +C a given atom are split among at most two processors! + CorrelType=477 + CorrelID=fg_rank+1 + ldone=.false. + do i=1,max_cont + do j=1,max_dim + buffer(i,j)=0.0D0 + enddo + enddo + mm=mod(fg_rank,2) +c write (*,*) 'MyRank',MyRank,' mm',mm + if (mm) 20,20,10 + 10 continue +c write (*,*) 'Sending: MyRank',MyRank,' mm',mm,' ldone',ldone + if (fg_rank.gt.0) then +C Send correlation contributions to the preceding processor + msglen=msglen1 + nn=num_cont_hb(iatel_s) + call pack_buffer(max_cont,max_dim,iatel_s,0,buffer) +c write (*,*) 'The BUFFER array:' +c do i=1,nn +c write (*,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,30) +c enddo + if (ielstart(iatel_s).gt.iatel_s+ispp) then + msglen=msglen2 + call pack_buffer(max_cont,max_dim,iatel_s+1,30,buffer) +C Clear the contacts of the atom passed to the neighboring processor + nn=num_cont_hb(iatel_s+1) +c do i=1,nn +c write (*,'(i2,9(3f8.3,2x))') i,(buffer(i,j+30),j=1,30) +c enddo + num_cont_hb(iatel_s)=0 + endif +cd write (iout,*) 'Processor ',fg_rank,MyRank, +cd & ' is sending correlation contribution to processor',fg_rank-1, +cd & ' msglen=',msglen +c write (*,*) 'Processor ',fg_rank,MyRank, +c & ' is sending correlation contribution to processor',fg_rank-1, +c & ' msglen=',msglen,' CorrelType=',CorrelType + time00=MPI_Wtime() + call MPI_Send(buffer,msglen,MPI_DOUBLE_PRECISION,fg_rank-1, + & CorrelType,FG_COMM,IERROR) + time_sendrecv=time_sendrecv+MPI_Wtime()-time00 +cd write (iout,*) 'Processor ',fg_rank, +cd & ' has sent correlation contribution to processor',fg_rank-1, +cd & ' msglen=',msglen,' CorrelID=',CorrelID +c write (*,*) 'Processor ',fg_rank, +c & ' has sent correlation contribution to processor',fg_rank-1, +c & ' msglen=',msglen,' CorrelID=',CorrelID +c msglen=msglen1 + endif ! (fg_rank.gt.0) + if (ldone) goto 30 + ldone=.true. + 20 continue +c write (*,*) 'Receiving: MyRank',MyRank,' mm',mm,' ldone',ldone + if (fg_rank.lt.nfgtasks-1) then +C Receive correlation contributions from the next processor + msglen=msglen1 + if (ielend(iatel_e).lt.nct-1) msglen=msglen2 +cd write (iout,*) 'Processor',fg_rank, +cd & ' is receiving correlation contribution from processor',fg_rank+1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType +c write (*,*) 'Processor',fg_rank, +c &' is receiving correlation contribution from processor',fg_rank+1, +c & ' msglen=',msglen,' CorrelType=',CorrelType + time00=MPI_Wtime() + nbytes=-1 + do while (nbytes.le.0) + call MPI_Probe(fg_rank+1,CorrelType,FG_COMM,status,IERROR) + call MPI_Get_count(status,MPI_DOUBLE_PRECISION,nbytes,IERROR) + enddo +c print *,'Processor',myrank,' msglen',msglen,' nbytes',nbytes + call MPI_Recv(buffer,nbytes,MPI_DOUBLE_PRECISION, + & fg_rank+1,CorrelType,FG_COMM,status,IERROR) + time_sendrecv=time_sendrecv+MPI_Wtime()-time00 +c write (*,*) 'Processor',fg_rank, +c &' has received correlation contribution from processor',fg_rank+1, +c & ' msglen=',msglen,' nbytes=',nbytes +c write (*,*) 'The received BUFFER array:' +c do i=1,max_cont +c write (*,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,60) +c enddo + if (msglen.eq.msglen1) then + call unpack_buffer(max_cont,max_dim,iatel_e+1,0,buffer) + else if (msglen.eq.msglen2) then + call unpack_buffer(max_cont,max_dim,iatel_e,0,buffer) + call unpack_buffer(max_cont,max_dim,iatel_e+1,30,buffer) + else + write (iout,*) + & 'ERROR!!!! message length changed while processing correlations.' + write (*,*) + & 'ERROR!!!! message length changed while processing correlations.' + call MPI_Abort(MPI_COMM_WORLD,Error,IERROR) + endif ! msglen.eq.msglen1 + endif ! fg_rank.lt.nfgtasks-1 + if (ldone) goto 30 + ldone=.true. + goto 10 + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + 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 + 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=iatel_s,iatel_e+1 + 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) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if (j1.eq.j+1 .or. j1.eq.j-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,j,i+1,j1,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 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=2*(8*3+6)) +c parameter (msglen1=max_cont*max_dim*4) + parameter (msglen1=max_cont*max_dim/2) + parameter (msglen2=2*msglen1) + integer source,CorrelType,CorrelID,Error + double precision buffer(max_cont,max_dim) + integer status(MPI_STATUS_SIZE) +#endif + include 'COMMON.SETUP' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + double precision gx(3),gx1(3) + logical lprn,ldone +C Set lprn=.true. for debugging + lprn=.false. + eturn6=0.0d0 +#ifdef MPI + n_corr=0 + n_corr1=0 + if (fgProcs.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values:' + 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 +C Caution! Following code assumes that electrostatic interactions concerning +C a given atom are split among at most two processors! + CorrelType=477 + CorrelID=MyID+1 + ldone=.false. + do i=1,max_cont + do j=1,max_dim + buffer(i,j)=0.0D0 + enddo + enddo + mm=mod(MyRank,2) +cd write (iout,*) 'MyRank',MyRank,' mm',mm + if (mm) 20,20,10 + 10 continue +cd write (iout,*) 'Sending: MyRank',MyRank,' mm',mm,' ldone',ldone + if (MyRank.gt.0) then +C Send correlation contributions to the preceding processor + msglen=msglen1 + nn=num_cont_hb(iatel_s) + call pack_buffer(max_cont,max_dim,iatel_s,0,buffer) +cd write (iout,*) 'The BUFFER array:' +cd do i=1,nn +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,30) +cd enddo + if (ielstart(iatel_s).gt.iatel_s+ispp) then + msglen=msglen2 + call pack_buffer(max_cont,max_dim,iatel_s+1,30,buffer) +C Clear the contacts of the atom passed to the neighboring processor + nn=num_cont_hb(iatel_s+1) +cd do i=1,nn +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j+30),j=1,30) +cd enddo + num_cont_hb(iatel_s)=0 + endif +cd write (*,*) 'Processor ',fg_rank,MyRank, +cd & ' is sending correlation contribution to processor',fg_rank-1, +cd & ' msglen=',msglen +cd write (*,*) 'Processor ',MyID,MyRank, +cd & ' is sending correlation contribution to processor',fg_rank-1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType + time00=MPI_Wtime() + call MPI_Send(buffer,msglen,MPI_DOUBLE_PRECISION,fg_rank-1, + & CorrelType,FG_COMM,IERROR) + time_sendrecv=time_sendrecv+MPI_Wtime()-time00 +cd write (*,*) 'Processor ',fg_rank,MyRank, +cd & ' has sent correlation contribution to processor',fg_rank-1, +cd & ' msglen=',msglen,' CorrelID=',CorrelID +cd write (*,*) 'Processor ',fg_rank, +cd & ' has sent correlation contribution to processor',fg_rank-1, +cd & ' msglen=',msglen,' CorrelID=',CorrelID + msglen=msglen1 + endif ! (MyRank.gt.0) + if (ldone) goto 30 + ldone=.true. + 20 continue +cd write (iout,*) 'Receiving: MyRank',MyRank,' mm',mm,' ldone',ldone + if (fg_rank.lt.nfgtasks-1) then +C Receive correlation contributions from the next processor + msglen=msglen1 + if (ielend(iatel_e).lt.nct-1) msglen=msglen2 +cd write (iout,*) 'Processor',fg_rank, +cd & ' is receiving correlation contribution from processor',fg_rank+1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType +cd write (*,*) 'Processor',fg_rank, +cd & ' is receiving correlation contribution from processor',fg_rank+1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType + time00=MPI_Wtime() + nbytes=-1 + do while (nbytes.le.0) + call MPI_Probe(fg_rank+1,CorrelType,FG_COMM,status,IERROR) + call MPI_Get_count(status,MPI_DOUBLE_PRECISION,nbytes,IERROR) + enddo +cd print *,'Processor',MyID,' msglen',msglen,' nbytes',nbytes + call MPI_Recv(buffer,nbytes,MPI_DOUBLE_PRECISION, + & fg_rank+1,CorrelType,status,IERROR) + time_sendrecv=time_sendrecv+MPI_Wtime()-time00 +cd write (iout,*) 'Processor',fg_rank, +cd & ' has received correlation contribution from processor',fg_rank+1, +cd & ' msglen=',msglen,' nbytes=',nbytes +cd write (iout,*) 'The received BUFFER array:' +cd do i=1,max_cont +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,52) +cd enddo + if (msglen.eq.msglen1) then + call unpack_buffer(max_cont,max_dim,iatel_e+1,0,buffer) + else if (msglen.eq.msglen2) then + call unpack_buffer(max_cont,max_dim,iatel_e,0,buffer) + call unpack_buffer(max_cont,max_dim,iatel_e+1,30,buffer) + else + write (iout,*) + & 'ERROR!!!! message length changed while processing correlations.' + write (*,*) + & 'ERROR!!!! message length changed while processing correlations.' + call MPI_Abort(MPI_COMM_WORLD,Error,IERROR) + endif ! msglen.eq.msglen1 + endif ! fg_rank.lt.nfgtasks-1 + if (ldone) goto 30 + ldone=.true. + goto 10 + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + 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 + 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 + do i=iatel_s,iatel_e+1 + 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) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if (j1.eq.j+1 .or. j1.eq.j-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=',j,' i1=',i1,' j1=',j1, +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 + call calc_eello(i,j,i+1,j1,jj,kk) + if (wcorr4.gt.0.0d0) + & ecorr=ecorr+eello4(i,j,i+1,j1,jj,kk) + if (energy_dec.and.wcorr4.gt.0.0d0) + 1 write (iout,'(a6,2i5,0pf7.3)') + 2 'ecorr4',i,j,eello4(i,j,i+1,j1,jj,kk) + if (wcorr5.gt.0.0d0) + & ecorr5=ecorr5+eello5(i,j,i+1,j1,jj,kk) + if (energy_dec.and.wcorr5.gt.0.0d0) + 1 write (iout,'(a6,2i5,0pf7.3)') + 2 'ecorr5',i,j,eello5(i,j,i+1,j1,jj,kk) +cd write(2,*)'wcorr6',wcorr6,' wturn6',wturn6 +cd write(2,*)'ijkl',i,j,i+1,j1 + if (wcorr6.gt.0.0d0 .and. (j.ne.i+4 .or. j1.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,j,i+1,j1,jj,kk) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + 1 'ecorr6',i,j,eello6(i,j,i+1,j1,jj,kk) +cd write (iout,*) 'ecorr',ecorr,' ecorr5=',ecorr5, +cd & 'ecorr6=',ecorr6 +cd write (iout,'(4e15.5)') sred_geom, +cd & dabs(eello4(i,j,i+1,j1,jj,kk)), +cd & dabs(eello5(i,j,i+1,j1,jj,kk)), +cd & dabs(eello6(i,j,i+1,j1,jj,kk)) + else if (wturn6.gt.0.0d0 + & .and. (j.eq.i+4 .and. j1.eq.i+3)) then +cd write (iout,*) '******eturn6: i,j,i+1,j1',i,j,i+1,j1 + eturn6=eturn6+eello_turn6(i,jj,kk) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + 1 'eturn6',i,j,eello_turn6(i,jj,kk) +cd write (2,*) 'multibody_eello:eturn6',eturn6 + endif + ENDIF +1111 continue + 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------------------------------------------------------------------------------ + 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,*)'Contacts have occurred for peptide groups',i,j, +c & ' and',k,l +c write (iout,*)'Contacts have occurred for peptide groups', +c & i,j,' fcont:',eij,' eij',' eesij',ees0pij,ees0mij,' and ',k,l +c & ,' fcont ',ekl,' eeskl',ees0pkl,ees0mkl,' ees=',ees +C Calculate the multi-body contribution to energy. + ecorr=ecorr+ekont*ees +C Calculate multi-body contributions to the gradient. + do ll=1,3 + ghalf=0.5D0*ees*ekl*gacont_hbr(ll,jj,i) + gradcorr(ll,i)=gradcorr(ll,i)+ghalf + & -ekont*(coeffp*ees0pkl*gacontp_hb1(ll,jj,i)+ + & coeffm*ees0mkl*gacontm_hb1(ll,jj,i)) + gradcorr(ll,j)=gradcorr(ll,j)+ghalf + & -ekont*(coeffp*ees0pkl*gacontp_hb2(ll,jj,i)+ + & coeffm*ees0mkl*gacontm_hb2(ll,jj,i)) + ghalf=0.5D0*ees*eij*gacont_hbr(ll,kk,k) + gradcorr(ll,k)=gradcorr(ll,k)+ghalf + & -ekont*(coeffp*ees0pij*gacontp_hb1(ll,kk,k)+ + & coeffm*ees0mij*gacontm_hb1(ll,kk,k)) + gradcorr(ll,l)=gradcorr(ll,l)+ghalf + & -ekont*(coeffp*ees0pij*gacontp_hb2(ll,kk,k)+ + & coeffm*ees0mij*gacontm_hb2(ll,kk,k)) + enddo + do m=i+1,j-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ + & ees*ekl*gacont_hbr(ll,jj,i)- + & ekont*(coeffp*ees0pkl*gacontp_hb3(ll,jj,i)+ + & coeffm*ees0mkl*gacontm_hb3(ll,jj,i)) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ + & ees*eij*gacont_hbr(ll,kk,k)- + & ekont*(coeffp*ees0pij*gacontp_hb3(ll,kk,k)+ + & coeffm*ees0mij*gacontm_hb3(ll,kk,k)) + enddo + enddo + 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 + 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 +cold ghalf=0.5d0*eel4*ekl*gacont_hbr(ll,jj,i) + ggg1(ll)=eel4*g_contij(ll,1) + ggg2(ll)=eel4*g_contij(ll,2) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr(ll,i)=gradcorr(ll,i)+ghalf+ekont*derx(ll,2,1) + gradcorr(ll,i+1)=gradcorr(ll,i+1)+ekont*derx(ll,3,1) + gradcorr(ll,j)=gradcorr(ll,j)+ghalf+ekont*derx(ll,4,1) + gradcorr(ll,j1)=gradcorr(ll,j1)+ekont*derx(ll,5,1) +cold ghalf=0.5d0*eel4*eij*gacont_hbr(ll,kk,k) + ghalf=0.5d0*ggg2(ll) +cd ghalf=0.0d0 + gradcorr(ll,k)=gradcorr(ll,k)+ghalf+ekont*derx(ll,2,2) + gradcorr(ll,k+1)=gradcorr(ll,k+1)+ekont*derx(ll,3,2) + gradcorr(ll,l)=gradcorr(ll,l)+ghalf+ekont*derx(ll,4,2) + gradcorr(ll,l1)=gradcorr(ll,l1)+ekont*derx(ll,5,2) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 +cold gradcorr(ll,m)=gradcorr(ll,m)+eel4*ekl*gacont_hbr(ll,jj,i) + gradcorr(ll,m)=gradcorr(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 +cold gradcorr(ll,m)=gradcorr(ll,m)+eel4*eij*gacont_hbr(ll,kk,k) + gradcorr(ll,m)=gradcorr(ll,m)+ggg2(ll) + enddo + enddo +1112 continue + do m=i+2,j2 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,2) + enddo + 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 + do ll=1,3 + ggg1(ll)=eel5*g_contij(ll,1) + ggg2(ll)=eel5*g_contij(ll,2) +cold ghalf=0.5d0*eel5*ekl*gacont_hbr(ll,jj,i) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr5(ll,i)=gradcorr5(ll,i)+ghalf+ekont*derx(ll,2,1) + gradcorr5(ll,i+1)=gradcorr5(ll,i+1)+ekont*derx(ll,3,1) + gradcorr5(ll,j)=gradcorr5(ll,j)+ghalf+ekont*derx(ll,4,1) + gradcorr5(ll,j1)=gradcorr5(ll,j1)+ekont*derx(ll,5,1) +cold ghalf=0.5d0*eel5*eij*gacont_hbr(ll,kk,k) + 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) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*ekl*gacont_hbr(ll,jj,i) + gradcorr5(ll,m)=gradcorr5(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*eij*gacont_hbr(ll,kk,k) + gradcorr5(ll,m)=gradcorr5(ll,m)+ggg2(ll) + enddo + enddo +c1112 continue + do m=i+2,j2 + do ll=1,3 + gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,2) + enddo + 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 + ggg1(ll)=eel6*g_contij(ll,1) + ggg2(ll)=eel6*g_contij(ll,2) +cold ghalf=0.5d0*eel6*ekl*gacont_hbr(ll,jj,i) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr6(ll,i)=gradcorr6(ll,i)+ghalf+ekont*derx(ll,2,1) + gradcorr6(ll,i+1)=gradcorr6(ll,i+1)+ekont*derx(ll,3,1) + gradcorr6(ll,j)=gradcorr6(ll,j)+ghalf+ekont*derx(ll,4,1) + gradcorr6(ll,j1)=gradcorr6(ll,j1)+ekont*derx(ll,5,1) + 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)+ghalf+ekont*derx(ll,2,2) + gradcorr6(ll,k+1)=gradcorr6(ll,k+1)+ekont*derx(ll,3,2) + gradcorr6(ll,l)=gradcorr6(ll,l)+ghalf+ekont*derx(ll,4,2) + gradcorr6(ll,l1)=gradcorr6(ll,l1)+ekont*derx(ll,5,2) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*ekl*gacont_hbr(ll,jj,i) + gradcorr6(ll,m)=gradcorr6(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*eij*gacont_hbr(ll,kk,k) + gradcorr6(ll,m)=gradcorr6(ll,m)+ggg2(ll) + enddo + enddo +1112 continue + do m=i+2,j2 + do ll=1,3 + gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,2) + enddo + 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 +#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 + ggg1(ll)=eel_turn6*g_contij(ll,1) + ggg2(ll)=eel_turn6*g_contij(ll,2) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + 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) + 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) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg2(ll) + enddo + enddo +1112 continue + do m=i+2,j2 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,2) + enddo + 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-M-newcorr/energy_p_new_barrier.F b/source/unres/src_MD-M-newcorr/energy_p_new_barrier.F new file mode 100644 index 0000000..42005e1 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/energy_p_new_barrier.F @@ -0,0 +1,9245 @@ + 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 Here are the energies showed per procesor if the are more processors +c per molecule then we sum it up in sum_energy subroutine +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),gloc_scbuf(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' + include 'COMMON.SCCOR' +#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) + 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 +#define DEBUG +#ifdef DEBUG + write (iout,*) "gloc_sc before reduce" + do i=1,nres + do j=1,1 + write (iout,*) i,j,gloc_sc(j,i,icg) + enddo + enddo +#endif +#undef DEBUG + 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) + time_reduce=time_reduce+MPI_Wtime()-time00 + 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 +#define DEBUG +#ifdef DEBUG + write (iout,*) "gloc_sc after reduce" + do i=1,nres + do j=1,1 + write (iout,*) i,j,gloc_sc(j,i,icg) + enddo + enddo +#endif +#undef DEBUG +#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=iabs(itype(i)) + if (itypi.eq.ntyp1) cycle + itypi1=iabs(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=iabs(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) + 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.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) + itypj=iabs(itype(j)) + if (itypj.eq.ntyp1) 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,2i3,3e11.3)') + & 'evdw2',i,j,evdwij,iteli,itypj,fac,aad(itypj,iteli), + & bad(itypj,iteli) +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. iabs(itype(iii)).eq.1 .and. + & iabs(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=iabs(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=iabs(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.ntyp1 .or. itype(i).eq.ntyp1) 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=iabs(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,*) + & "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.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) + ichir1=isign(1,itype(i-2)) + ichir2=isign(1,itype(i)) + if (itype(i-2).eq.10) ichir1=isign(1,itype(i-1)) + if (itype(i).eq.10) ichir2=isign(1,itype(i-1)) + if (itype(i-1).eq.10) then + itype1=isign(10,itype(i-2)) + ichir11=isign(1,itype(i-2)) + ichir12=isign(1,itype(i-2)) + itype2=isign(10,itype(i)) + ichir21=isign(1,itype(i)) + ichir22=isign(1,itype(i)) + endif + + if (i.gt.3 .and. itype(i-2).ne.ntyp1) 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.ntyp1) 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,ichir1,ichir2) + bthetk=bthet(k,it,ichir1,ichir2) + if (it.eq.10) then + athetk=athet(k,itype1,ichir11,ichir12) + bthetk=bthet(k,itype2,ichir21,ichir22) + endif + 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,ichir1,ichir2)*y(2) + &+athet(2,it,ichir1,ichir2)*y(1))*ss + dthetg2=(-bthet(1,it,ichir1,ichir2)*z(2) + & +bthet(2,it,ichir1,ichir2)*z(1))*ss + if (it.eq.10) then + dthetg1=(-athet(1,itype1,ichir11,ichir12)*y(2) + &+athet(2,itype1,ichir11,ichir12)*y(1))*ss + dthetg2=(-bthet(1,itype2,ichir21,ichir22)*z(2) + & +bthet(2,itype2,ichir21,ichir22)*z(1))*ss + endif + 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)+gloc(nphi+i-2,icg) + 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.ntyp1) cycle + if (iabs(itype(i+1)).eq.20) iblock=2 + if (iabs(itype(i+1)).ne.20) iblock=1 + 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.ntyp1) then +#ifdef OSF + phii=phi(i) + if (phii.ne.phii) phii=150.0 +#else + phii=phi(i) +#endif + ityp1=ithetyp((itype(i-2))) +C propagation of chirality for glycine type + 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.ntyp1) 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,iblock) + 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,iblock)*sinkt(k) + dethetai=dethetai+0.5d0*k*aathet(k,ityp1,ityp2,ityp3,iblock) + & *coskt(k) + if (lprn) + & write (iout,*) "k",k," + & aathet",aathet(k,ityp1,ityp2,ityp3,iblock), + & " 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,iblock)*cosph1(k) + & +ccthet(k,m,ityp1,ityp2,ityp3,iblock)*sinph1(k) + & +ddthet(k,m,ityp1,ityp2,ityp3,iblock)*cosph2(k) + & +eethet(k,m,ityp1,ityp2,ityp3,iblock)*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,iblock)*cosph1(k)- + & bbthet(k,m,ityp1,ityp2,ityp3,iblock)*sinph1(k)) + dephii1=dephii1+k*sinkt(m)*( + & eethet(k,m,ityp1,ityp2,ityp3,iblock)*cosph2(k)- + & ddthet(k,m,ityp1,ityp2,ityp3,iblock)*sinph2(k)) + if (lprn) + & write (iout,*) "m",m," k",k," bbthet", + & bbthet(k,m,ityp1,ityp2,ityp3,iblock)," ccthet", + & ccthet(k,m,ityp1,ityp2,ityp3,iblock)," ddthet", + & ddthet(k,m,ityp1,ityp2,ityp3,iblock)," eethet", + & eethet(k,m,ityp1,ityp2,ityp3,iblock)," 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,iblock)*cosph1ph2(l,k)+ + & ffthet(k,l,m,ityp1,ityp2,ityp3,iblock)*cosph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3,iblock)*sinph1ph2(l,k)+ + & ggthet(k,l,m,ityp1,ityp2,ityp3,iblock)*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,iblock)*sinph1ph2(l,k)- + & ffthet(k,l,m,ityp1,ityp2,ityp3,iblock)*sinph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3,iblock)*cosph1ph2(l,k)+ + & ggthet(k,l,m,ityp1,ityp2,ityp3,iblock)*cosph1ph2(k,l)) + dephii1=dephii1+(k-l)*sinkt(m)*( + & -ffthet(l,k,m,ityp1,ityp2,ityp3,iblock)*sinph1ph2(l,k)+ + & ffthet(k,l,m,ityp1,ityp2,ityp3,iblock)*sinph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3,iblock)*cosph1ph2(l,k)- + & ggthet(k,l,m,ityp1,ityp2,ityp3,iblock)*cosph1ph2(k,l)) + if (lprn) then + write (iout,*) "m",m," k",k," l",l," ffthet", + & ffthet(l,k,m,ityp1,ityp2,ityp3,iblock), + & ffthet(k,l,m,ityp1,ityp2,ityp3,iblock)," ggthet", + & ggthet(l,k,m,ityp1,ityp2,ityp3,iblock), + & ggthet(k,l,m,ityp1,ityp2,ityp3,iblock), + & " 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 +c lprn1=.true. + if (lprn1) + & write (iout,'(i2,3f8.1,9h ethetai ,f10.5)') + & i,theta(i)*rad2deg,phii*rad2deg, + & phii1*rad2deg,ethetai +c lprn1=.false. + 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+gloc(nphi+i-2,icg) + 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.ntyp1) cycle + if (it.eq.10) goto 1 + nlobit=nlob(iabs(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,iabs(it))-0.5D0*contr(j,iii)+emin + if(adexp.ne.adexp) adexp=1.0 + expfac=dexp(adexp) +#else + expfac=dexp(bsc(j,iabs(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,iabs(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.ntyp1) 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=iabs(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)*dsign(1.0d0,dfloat(itype(i))) + 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=iabs(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 = -dsign(1.0,dfloat(itype(i)))*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,it,itype(i) +c & ,zz,xx,yy +c#define DEBUG +#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 +c zz=zz*dsign(1.0,dfloat(itype(i))) + 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,itype(i) +#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,itype(i) +#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,itype(i) +#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,itype(i) +#endif +c#undef DEBUG +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) + & *dsign(1.0d0,dfloat(itype(i)))*dC_norm(j,i+nres) + dZZ_Ci1(k)=dZZ_Ci1(k)-uzgrad(j,k,1,i-1) + & *dsign(1.0d0,dfloat(itype(i)))*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.ntyp1.or. itype(i-1).eq.ntyp1 + & .or. itype(i).eq.ntyp1) 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.ntyp1 .or. itype(i-1).eq.ntyp1 + & .or. itype(i).eq.ntyp1) cycle + etors_ii=0.0D0 + if (iabs(itype(i)).eq.20) then + iblock=2 + else + iblock=1 + endif + 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,iblock) + v1ij=v1(j,itori,itori1,iblock) + v2ij=v2(j,itori,itori1,iblock) + 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,iblock) + 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,iblock) + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'etor',i,etors_ii-v0(itori,itori1,iblock) + 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,iblock),j=1,6), + & (v2(j,itori,itori1,iblock),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 +c write(iout,*) "a tu??" + do i=iphid_start,iphid_end + if (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 + iblock=1 + if (iabs(itype(i+1)).eq.20) iblock=2 + +C Regular cosine and sine terms + do j=1,ntermd_1(itori,itori1,itori2,iblock) + v1cij=v1c(1,j,itori,itori1,itori2,iblock) + v1sij=v1s(1,j,itori,itori1,itori2,iblock) + v2cij=v1c(2,j,itori,itori1,itori2,iblock) + v2sij=v1s(2,j,itori,itori1,itori2,iblock) + 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,iblock) + do l=1,k-1 + v1cdij = v2c(k,l,itori,itori1,itori2,iblock) + v2cdij = v2c(l,k,itori,itori1,itori2,iblock) + v1sdij = v2s(k,l,itori,itori1,itori2,iblock) + v2sdij = v2s(l,k,itori,itori1,itori2,iblock) + 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",itau_start,itau_end + esccor=0.0D0 + do i=itau_start,itau_end + if ((itype(i-2).eq.ntyp1).or.(itype(i-1).eq.ntyp1)) cycle + esccor_ii=0.0D0 + isccori=isccortyp(itype(i-2)) + isccori1=isccortyp(itype(i-1)) +c write (iout,*) "EBACK_SC_COR",i,nterm_sccor(isccori,isccori1) + phii=phi(i) + 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.(itype(i-1).eq.ntyp1) + & .or.(itype(i).eq.ntyp1))) + & .or.((intertyp.eq.2).and.((itype(i-1).eq.10).or. + & (itype(i-1).eq.ntyp1).or.(itype(i-2).eq.ntyp1).or. + & (itype(i-3).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 + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo +c write (iout,*) "EBACK_SC_COR",i,v1ij*cosphi+v2ij*sinphi,intertyp + gloc_sc(intertyp,i-3,icg)=gloc_sc(intertyp,i-3,icg)+wsccor*gloci + 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,isccori,isccori1, + & (v1sccor(j,intertyp,isccori,isccori1),j=1,6) + & ,(v2sccor(j,intertyp,isccori,isccori1),j=1,6) + gsccor_loc(i-3)=gsccor_loc(i-3)+gloci + enddo !intertyp + 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,i+1) + dipj(iii,1)=Ub2(iii,j) + dipderj(iii)=Ub2der(iii,j) + dipj(iii,2)=b1(iii,j+1) + 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,i),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,i),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,k+1),AEAb1(1,2,1)) + call matvec2(AEAderg(1,1,1),b1(1,k+1),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,j),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,j),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,l+1),AEAb1(1,2,2)) + call matvec2(AEAderg(1,1,2),b1(1,l+1),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,i), + & 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,k+1), + & 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,j), + & 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,l+1), + & 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,i),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,i),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,k+1),AEAb1(1,2,1)) + call matvec2(AEAderg(1,1,1),b1(1,k+1),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,j+1),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,l),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,j+1),AEAb1(1,2,2)) + call matvec2(AEAderg(1,1,2),b1(1,j+1),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,i), + & 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,k+1), + & 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,l), + & 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,j+1), + & 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,k)) + & -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,k)) + & -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,k)) + & -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,k)) + & -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,l)) + & -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,l)) + & -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,l)) + & -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,j)) + & -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,j)) + & -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,j)) + & -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,k)-AEAb1(2,2,imat)*b1(2,k) + vv(2)=AEAb1(1,2,imat)*b1(2,k)+AEAb1(2,2,imat)*b1(1,k) + 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,k)-AEAb1derg(2,2,imat)*b1(2,k) + vv(2)=AEAb1derg(1,2,imat)*b1(2,k)+AEAb1derg(2,2,imat)*b1(1,k) + 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,k) + & -AEAb1derx(2,lll,kkk,iii,2,imat)*b1(2,k) + vv(2)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(2,k) + & +AEAb1derx(2,lll,kkk,iii,2,imat)*b1(1,k) + 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,k+1),auxvec(1)) + s2=0.5d0*scalar2(b1(1,k),auxvec(1)) + call matvec2(AECA(1,1,2),b1(1,l+1),auxvec(1)) + s3=0.5d0*scalar2(b1(1,j+1),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,l+1),auxvec(1)) + s3=0.5d0*scalar2(b1(1,j+1),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,k+1),auxvec(1)) + s2=0.5d0*scalar2(b1(1,k),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,k+1), + & auxvec(1)) + s2=0.5d0*scalar2(b1(1,k),auxvec(1)) + call matvec2(AECAderx(1,1,lll,kkk,iii,2),b1(1,l+1), + & auxvec(1)) + s3=0.5d0*scalar2(b1(1,j+1),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,j+1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,j),auxvec1(1)) + else + call matvec2(ADtEA1(1,1,3-imat),b1(1,l+1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,l),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,j+1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,j),auxvec1(1)) + else + call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,l+1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,l),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,j+1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,j),auxvec1(1)) + else + call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,l+1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,l),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,j+1),auxvec(1)) + s3=-0.5d0*scalar2(b1(1,j),auxvec(1)) + else + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,3-imat), + & b1(1,l+1),auxvec(1)) + s3=-0.5d0*scalar2(b1(1,l),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,l)) + s1 = (auxmat(1,1)+auxmat(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,l),vtemp1(1)) + call matvec2(AEA(1,1,1),vtemp1(1),vtemp1(1)) + s2 = scalar2(b1(1,k),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,k),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,l)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1d +#endif + call matvec2(EUgder(1,1,i+2),b1(1,l),vtemp1d(1)) + call matvec2(AEA(1,1,1),vtemp1d(1),vtemp1d(1)) + s2d = scalar2(b1(1,k),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,l),vtemp1d(1)) + call matvec2(AEAderg(1,1,1),vtemp1d(1),vtemp1d(1)) + s2d = scalar2(b1(1,k),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,k),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,l),vtemp1(1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),vtemp1(1), + & vtemp1d(1)) + s2d = scalar2(b1(1,k),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,k),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-M-newcorr/energy_p_new_barrier.F.safe b/source/unres/src_MD-M-newcorr/energy_p_new_barrier.F.safe new file mode 100644 index 0000000..828b4cd --- /dev/null +++ b/source/unres/src_MD-M-newcorr/energy_p_new_barrier.F.safe @@ -0,0 +1,8916 @@ + 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+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' + 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 + call MPI_AllReduce(gradbufc(1,1),gradbufc_sum(1,1),3*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,FG_COMM,IERR) + time_reduce=time_reduce+MPI_Wtime()-time00 +#ifdef DEBUG + write (iout,*) "gradbufc_sum after allreduce" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc_sum(j,i),j=1,3) + enddo + call flush(iout) +#endif +#ifdef TIMING + 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 +c gradc(j,i,icg)=gradbufc(j,i)+welec*gelc(j,i)+ + gradc(j,i,icg)=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 +c gradc(j,i,icg)=gradbufc(j,i)+welec*gelc(j,i)+ + gradc(j,i,icg)=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_sum(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_sum(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 + do i=1,nres + do j=1,3 + gradc(j,i,icg)=gradc(j,i,icg)+gradbufc(j,i) + enddo + enddo + 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 +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) 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.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 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-M-newcorr/energy_split-sep.F b/source/unres/src_MD-M-newcorr/energy_split-sep.F new file mode 100644 index 0000000..24ab8dd --- /dev/null +++ b/source/unres/src_MD-M-newcorr/energy_split-sep.F @@ -0,0 +1,472 @@ + 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) + 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 + 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) + 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 +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-M-newcorr/energy_split.F b/source/unres/src_MD-M-newcorr/energy_split.F new file mode 100644 index 0000000..4a09d29 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/energy_split.F @@ -0,0 +1,417 @@ + 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' +c write(iout,'(a,i2)')'Calling etotal_long ipot=',ipot + 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_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" + 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) + 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 +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.) + call flush(iout) +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(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" + call vec_and_deriv +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) then +#else + if (welec.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0) then +#endif + call eelec(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 + call escp(evdw2,evdw2_14) + else +c write (iout,*) "Soft-sphere SCP potential" + 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 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(12)=escloc + 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) + 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 +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 + call flush(iout) +c print *,'Processor',myrank,' nnt=',nnt,' nct=',nct +#endif +c call int_from_cart1(.false.) +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) + do i=1,n_ene + energia(i)=0.0d0 + enddo + energia(11)=ebe + energia(12)=escloc + energia(13)=etors + energia(14)=etors_d + energia(15)=ehpb + energia(17)=estr +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-M-newcorr/entmcm.F b/source/unres/src_MD-M-newcorr/entmcm.F new file mode 100644 index 0000000..14576d5 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/entmcm.F @@ -0,0 +1,688 @@ + 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 + kkk=1 + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup,kkk), + &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 + kkk=1 + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup,kkk), + & 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-M-newcorr/env.log b/source/unres/src_MD-M-newcorr/env.log new file mode 100644 index 0000000..2e32370 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/env.log @@ -0,0 +1,97 @@ +USER=liwo +LOGNAME=liwo +HOME=/usr/users/7/liwo +PATH=/usr/users/9/amorris/java/bin:/usr/local/packages/TAU-2.17/tau-2.17/x86_64/bin:/usr/local/packages/TAU-2.17/tau-2.17/xt3/bin:/usr/psc/bin:/opt/kde3/bin:/opt/gnome/bin:/usr/games:/usr/bin/X11:/usr/local/packages/dmover/1.0/bin:/usr/psc/gnu/bin:/usr/psc/krb5/bin:/usr/local/bin:/usr/local/packages/tg/bin:/opt/xt-lustre-ss/1.5.60/usr/sbin:/opt/xt-lustre-ss/1.5.60/usr/bin:/opt/cray/bin:/opt/cray/etc:/opt/xt-boot/1.5.60/bin/snos64:/opt/xt-catamount/1.5.60/bin/snos64:/opt/xt-os/1.5.60/bin/snos64:/opt/xt-service/1.5.60/bin/snos64:/opt/xt-pbs/5.3.5-6xt_psc/bin:/opt/xt-prgenv/1.5.60/bin:/opt/xt-pe/1.5.60/cnos/linux/64/bin:/opt/xt-pe/1.5.60/bin/snos64:/opt/xt-mpt/1.5.60/mpich2-64/P2/bin:/opt/toolworks/totalview.8.4.1b/bin:/opt/totalview-support/1.0.5/bin:/opt/pgi/7.2.2/linux86-64/7.2/bin:/opt/modules/3.1.6/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/psc/gsissh/bin +MAIL=/var/mail/liwo +SHELL=/bin/tcsh +SSH_CLIENT=83.11.114.54 4271 22 +SSH_CONNECTION=83.11.114.54 4271 128.182.112.209 22 +SSH_TTY=/dev/pts/2 +TERM=xterm +KRB5CCNAME=FILE:/tmp/krb5cc_18087_SQvLWm6509 +HOSTTYPE=x86_64-linux +VENDOR=suse +OSTYPE=linux +MACHTYPE=x86_64 +SHLVL=1 +PWD=/usr/users/7/liwo/UNRES/src_TC_newmat.tau +GROUP=mtuamnp +HOST=tg-login9 +HOSTNAME=tg-login9.bigben.psc.teragrid.org +MANPATH=/usr/local/packages/dmover/1.0/man:/opt/xt-lustre-ss/1.5.60/lustre/man:/opt/cray_1.5.60/man:/opt/xt-os/1.5.60/ros/man:/opt/xt-libc/1.5.60/xt3_glibc/man:/opt/xt-pbs/5.3.5-6xt_psc/man:/opt/xt-pe/1.5.60/pe/man:/opt/xt-pe/1.5.60/papi/man:/opt/xt-mpt/1.5.60/romio/man:/opt/xt-mpt/1.5.60/mpich2-64/man:/opt/xt-libsci/10.0.0/man:/opt/toolworks/totalview.8.4.1b/man:/opt/pgi/7.2.2/linux86-64/7.2/man:/usr/share/man:/usr/X11R6/man:/usr/local/man:/opt/gnome/share/man +MINICOM=-c on +INFODIR=/usr/local/info:/usr/share/info:/usr/info +INFOPATH=/usr/local/info:/usr/share/info:/usr/info +LESS=-M -I +LESSOPEN=lessopen.sh %s +LESSCLOSE=lessclose.sh %s %s +LESSKEY=/etc/lesskey.bin +PAGER=/usr/bin/less +MORE=-sl +GZIP=-9 +CSHEDIT=emacs +COLORTERM=1 +NNTPSERVER=news +XFILESEARCHPATH=/usr/lib/X11/%L/%T/%N%C:/usr/lib/X11/%l/%T/%N%C:/usr/lib/X11/%T/%N%C:/usr/lib/X11/%L/%T/%N:/usr/lib/X11/%l/%T/%N:/usr/lib/X11/%T/%N:/var/X11R6/%T/%N%C:/var/X11R6/%T/%N +INPUTRC=/etc/inputrc +LANG=en_US.UTF-8 +QTDIR=/usr/lib/qt3 +no_proxy=localhost +WINDOWMANAGER=/usr/X11R6/bin/kde +CVS_RSH=ssh +G_BROKEN_FILENAMES=1 +GTK_PATH=/usr/local/lib64/gtk-2.0:/opt/gnome/lib64/gtk-2.0:/usr/lib64/gtk-2.0 +WHATAMI=x86_64 +TVDSVRLAUNCHCMD=ssh +CSHRCREAD=true +LS_COLORS=no=00:fi=00:di=01;34:ln=00;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31:ex=00;32:*.cmd=00;32:*.exe=01;32:*.com=01;32:*.bat=01;32:*.btm=01;32:*.dll=01;32:*.tar=00;31:*.tbz=00;31:*.tgz=00;31:*.rpm=00;31:*.deb=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.zoo=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.tb2=00;31:*.tz2=00;31:*.tbz2=00;31:*.avi=01;35:*.bmp=01;35:*.fli=01;35:*.gif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mng=01;35:*.mov=01;35:*.mpg=01;35:*.pcx=01;35:*.pbm=01;35:*.pgm=01;35:*.png=01;35:*.ppm=01;35:*.tga=01;35:*.tif=01;35:*.xbm=01;35:*.xpm=01;35:*.dl=01;35:*.gl=01;35:*.aiff=00;32:*.au=00;32:*.mid=00;32:*.mp3=00;32:*.ogg=00;32:*.voc=00;32:*.wav=00;32: +LS_OPTIONS=-N --color=tty -T 0 +MODULEPATH=/opt/modulefiles:/usr/local/modulefiles +MODULE_VERSION=3.1.6 +MODULE_VERSION_STACK=3.1.6 +MODULESHOME=/opt/modules/3.1.6 +LOADEDMODULES=modules/3.1.6:pgi/7.2.2:totalview-support/1.0.5:xt-totalview/8.4.1b:xt-libsci/10.0.0:xt-mpt/1.5.60:xt-pe/1.5.60:PrgEnv-pgi/1.5.60:xt-pbs/5.3.5-6xt_psc:xt-service/1.5.60:xt-libc/1.5.60:xt-os/1.5.60:xt-catamount/1.5.60:xt-boot/1.5.60:xt-crms/1.5.60:xt-lustre-ss/1.5.60:Base-opts/1.5.60:psc_path/1.0:dmover/1.0:tau/tau-2.17 +_MODULESBEGINENV_=/usr/users/7/liwo/.modulesbeginenv +_LMFILES_=/opt/modulefiles/modules/3.1.6:/opt/modulefiles/pgi/7.2.2:/opt/modulefiles/totalview-support/1.0.5:/opt/modulefiles/xt-totalview/8.4.1b:/opt/modulefiles/xt-libsci/10.0.0:/opt/modulefiles/xt-mpt/1.5.60:/opt/modulefiles/xt-pe/1.5.60:/opt/modulefiles/PrgEnv-pgi/1.5.60:/opt/modulefiles/xt-pbs/5.3.5-6xt_psc:/opt/modulefiles/xt-service/1.5.60:/opt/modulefiles/xt-libc/1.5.60:/opt/modulefiles/xt-os/1.5.60:/opt/modulefiles/xt-catamount/1.5.60:/opt/modulefiles/xt-boot/1.5.60:/opt/modulefiles/xt-crms/1.5.60:/opt/modulefiles/xt-lustre-ss/1.5.60:/opt/modulefiles/Base-opts/1.5.60:/usr/local/modulefiles/psc_path/1.0:/usr/local/modulefiles/dmover/1.0:/usr/local/modulefiles/tau/tau-2.17 +PE_PRODUCT_LIST=LUSTRE:CRMS:MPT:LIBSCI:TOTALVIEW:TOTALVIEW-SUPPORT:PGI +PE_PGI_VARIANT=P2 +LD_LIBRARY_PATH=/opt/cray/lib:/opt/xt-os/1.5.60/lib:/opt/xt-libc/1.5.60/amd64/lib:/opt/xt-pe/1.5.60/lib:/opt/xt-mpt/1.5.60/mpich2-64/P2/lib:/opt/pgi/7.2.2/linux86-64/7.2/libso:/opt/pgi/7.2.2/linux86-64/7.2/lib +C_DIR=/opt/xt-libc/1.5.60 +CATAMOUNT_DIR=/opt/xt-catamount/1.5.60 +LM_LICENSE_FILE=/opt/pgi/7.2.2/license.dat +CRMS_DIR=/opt/cray +PE_DIR=/opt/xt-pe/1.5.60 +MPICHBASEDIR=/opt/xt-mpt/1.5.60/mpich2-64 +PGI_PATH=/opt/pgi/7.2.2 +LUSTRE_DIR=/opt/xt-lustre-ss/1.5.60 +BUILD_OPTS=/opt/xt-pe/1.5.60/bin/snos64/build-opts +PE_ENV=PGI +MPICH_DIR=/opt/xt-mpt/1.5.60/mpich2-64/P2 +PGI_VERS_STR=7.2.2 +OS_DIR=/opt/xt-os/1.5.60 +PRGENV_DIR=/opt/xt-prgenv/1.5.60 +PGI=/opt/pgi/7.2.2 +TOTALVIEW_SUPPORT_LIB=/opt/totalview-support/1.0.5/lib +BOOT_DIR=/opt/xt-boot/1.5.60 +XTOS_VERSION=1.5.60 +MPICH_DIR_FTN_DEFAULT64=/opt/xt-mpt/1.5.60/mpich2-64/P2W +PGI_VERSION=7.2 +SE_DIR=/opt/xt-service/1.5.60 +LIBSCI_BASE_DIR=/opt/xt-libsci/10.0.0 +MPT_DIR=/opt/xt-mpt/1.5.60 +PTL_SNOS_NAL=SS +YOD_LOGFILE=syslog +RCLOCAL_PRGENV=true +DMOVER_HOME=/usr/users/3/rbudden/work/dmover +LIBLUSTRE_DEBUG_CONSOLE=0 +SCRATCH=/scratcha/liwo +TG_EXAMPLES=/usr/local/packages/tg/examples +TG_COMMUNITY=/usr/local/packages/tg +TG_CLUSTER_HOME=/usr/users/7/liwo +MYPROXY_SERVER=myproxy.teragrid.org +GLOBUS_LOCATION=/usr/local/globus/packages/globus/globus-4.0.1 +CORE_ACTION_FIRST=KILL +CORE_ACTION_OTHER=KILL +JAVA_ROOT_DIR=/usr/users/9/amorris/java/bin +TAU_MAKEFILE=/usr/local/packages/TAU-2.17/tau-2.17/xt3/lib/Makefile.tau-mpi-pdt-pgi +TAU_ROOT_DIR=/usr/local/packages/TAU-2.17/tau-2.17 diff --git a/source/unres/src_MD-M-newcorr/fitsq.f b/source/unres/src_MD-M-newcorr/fitsq.f new file mode 100644 index 0000000..1c97e6d --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/gauss.f b/source/unres/src_MD-M-newcorr/gauss.f new file mode 100644 index 0000000..7ba6e1d --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/gen_rand_conf.F b/source/unres/src_MD-M-newcorr/gen_rand_conf.F new file mode 100644 index 0000000..6caa718 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/gen_rand_conf.F @@ -0,0 +1,911 @@ + 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=iabs(itype(2)) + phi(4)=gen_phi(4,iabs(itype(2)),iabs(itype(3))) +c write(iout,*)'phi(4)=',rad2deg*phi(4) + if (nstart.lt.3) theta(3)=gen_theta(iabs(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=iabs(itype(i-1)) + it2=iabs(itype(i-2)) + it=iabs(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=iabs(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=iabs(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=iabs(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,1,1)*y(k) + & +bthet(k,it,1,1)*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=iabs(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=iabs(itype(i)) + itypi1=iabs(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=iabs(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-M-newcorr/geomout.F b/source/unres/src_MD-M-newcorr/geomout.F new file mode 100644 index 0000000..c6a3944 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/geomout.F @@ -0,0 +1,488 @@ + 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 + character*1 chainid(10) /'A','B','C','D','E','F','G','H','I','J'/ + 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 + ichain=1 + ires=0 + do i=nnt,nct + iti=itype(i) + if (iti.eq.ntyp1) then + ichain=ichain+1 + ires=0 + write (iunit,'(a)') 'TER' + else + ires=ires+1 + iatom=iatom+1 + ica(i)=iatom + write (iunit,10) iatom,restyp(iti),chainid(ichain), + & ires,(c(j,i),j=1,3),vtot(i) + if (iti.ne.10) then + iatom=iatom+1 + write (iunit,20) iatom,restyp(iti),chainid(ichain), + & ires,(c(j,nres+i),j=1,3), + & vtot(i+nres) + endif + endif + enddo + write (iunit,'(a)') 'TER' + do i=nnt,nct-1 + if (itype(i).eq.ntyp1) cycle + if (itype(i).eq.10 .and. itype(i+1).ne.ntyp1) then + write (iunit,30) ica(i),ica(i+1) + else if (itype(i).ne.10 .and. itype(i+1).ne.ntyp1) then + write (iunit,30) ica(i),ica(i+1),ica(i)+1 + else if (itype(i).ne.10 .and. itype(i+1).eq.ntyp1) then + write (iunit,30) ica(i),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,1X,A1,I4,4X,3F8.3,f15.3) + 20 FORMAT ('ATOM',I7,' CB ',A3,1X,A1,I4,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' + include 'COMMON.TORSION' + write (iout,'(/a)') 'Geometry of the virtual chain.' + write (iout,'(7a)') ' Res ',' d',' Theta', + & ' Phi',' Dsc',' Alpha',' Omega' + 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.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.) + 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" + else + write (line1,'(i10,f15.2,7f12.3,i5,$)') + & itime,totT,EK,potE,totE, + & amax,kinetic_T,t_bath,gyrate(),me + format1="a114" + 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 + else + format2="a001" + line2=' ' + endif + if (print_compon) then + 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-M-newcorr/gnmr1.f b/source/unres/src_MD-M-newcorr/gnmr1.f new file mode 100644 index 0000000..905e746 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/gradient_p.F b/source/unres/src_MD-M-newcorr/gradient_p.F new file mode 100644 index 0000000..2c670f2 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/gradient_p.F @@ -0,0 +1,418 @@ + 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' + 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' +c +c This subrouting calculates total Cartesian coordinate gradient. +c The subroutine chainbuild_cart and energy MUST be called beforehand. +c +#ifdef TIMING + time00=MPI_Wtime() +#endif + icg=1 + call sum_gradient +#ifdef TIMING +#endif +#ifdef DEBUG + write (iout,*) "After sum_gradient" + do i=1,nres-1 + write (iout,*) i," gradc ",(gradc(j,i,icg),j=1,3) + write (iout,*) i," gradx ",(gradx(j,i,icg),j=1,3) + enddo +#endif +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' +#ifdef DEBUG + write (iout,*) "gcart, gxcart, gloc before int_to_cart" +#endif + do i=1,nct + do j=1,3 + gcart(j,i)=gradc(j,i,icg) + gxcart(j,i)=gradx(j,i,icg) + enddo +#ifdef DEBUG + write (iout,'(i5,2(3f10.5,5x),f10.5)') i,(gcart(j,i),j=1,3), + & (gxcart(j,i),j=1,3),gloc(i,icg) +#endif + enddo +#ifdef TIMING + time01=MPI_Wtime() +#endif + call int_to_cart +#ifdef TIMING + time_inttocart=time_inttocart+MPI_Wtime()-time01 +#endif +#ifdef DEBUG + write (iout,*) "gcart and gxcart after int_to_cart" + do i=0,nres-1 + write (iout,'(i5,3f10.5,5x,3f10.5)') i,(gcart(j,i),j=1,3), + & (gxcart(j,i),j=1,3) + enddo +#endif +#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 + gradx_scp(j,i)=0.0D0 + gvdwc(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-M-newcorr/indexx.f b/source/unres/src_MD-M-newcorr/indexx.f new file mode 100644 index 0000000..b903862 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/indexx.f @@ -0,0 +1,81 @@ + SUBROUTINE indexx(n,arr,indx) + implicit real*8 (a-h,o-z) + INTEGER n,indx(n),M,NSTACK + REAL*8 arr(n) +c PARAMETER (M=7,NSTACK=50) + PARAMETER (M=7,NSTACK=500) + INTEGER i,indxt,ir,itemp,j,jstack,k,l,istack(NSTACK) + REAL*8 a + do 11 j=1,n + indx(j)=j +11 continue + jstack=0 + l=1 + ir=n +1 if(ir-l.lt.M)then + do 13 j=l+1,ir + indxt=indx(j) + a=arr(indxt) + do 12 i=j-1,1,-1 + if(arr(indx(i)).le.a)goto 2 + indx(i+1)=indx(i) +12 continue + i=0 +2 indx(i+1)=indxt +13 continue + if(jstack.eq.0)return + ir=istack(jstack) + l=istack(jstack-1) + jstack=jstack-2 + else + k=(l+ir)/2 + itemp=indx(k) + indx(k)=indx(l+1) + indx(l+1)=itemp + if(arr(indx(l+1)).gt.arr(indx(ir)))then + itemp=indx(l+1) + indx(l+1)=indx(ir) + indx(ir)=itemp + endif + if(arr(indx(l)).gt.arr(indx(ir)))then + itemp=indx(l) + indx(l)=indx(ir) + indx(ir)=itemp + endif + if(arr(indx(l+1)).gt.arr(indx(l)))then + itemp=indx(l+1) + indx(l+1)=indx(l) + indx(l)=itemp + endif + i=l+1 + j=ir + indxt=indx(l) + a=arr(indxt) +3 continue + i=i+1 + if(arr(indx(i)).lt.a)goto 3 +4 continue + j=j-1 + if(arr(indx(j)).gt.a)goto 4 + if(j.lt.i)goto 5 + itemp=indx(i) + indx(i)=indx(j) + indx(j)=itemp + goto 3 +5 indx(l)=indx(j) + indx(j)=indxt + jstack=jstack+2 + if(jstack.gt.NSTACK)pause 'NSTACK too small in indexx' + if(ir-i+1.ge.j-l)then + istack(jstack)=ir + istack(jstack-1)=i + ir=j-1 + else + istack(jstack)=j-1 + istack(jstack-1)=l + l=i + endif + endif + goto 1 + END +C (C) Copr. 1986-92 Numerical Recipes Software *11915aZ%. diff --git a/source/unres/src_MD-M-newcorr/initialize_p.F b/source/unres/src_MD-M-newcorr/initialize_p.F new file mode 100644 index 0000000..a650241 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/initialize_p.F @@ -0,0 +1,1423 @@ + 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'/ +c Conversion from poises to molecular unit and the gas constant + data cPoise /2.9361d0/, Rb /0.001986d0/ + 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 + rr=dacos(100.0d0) +#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 +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 + do ichir1=-1,1 + do ichir2=-1,1 + athet(j,i,ichir1,ichir2)=0.0D0 + bthet(j,i,ichir1,ichir2)=0.0D0 + enddo + enddo + 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=-maxtor,maxtor + itortyp(i)=0 +cc write (iout,*) "TU DOCHODZE",i,itortyp(i) + do iblock=1,2 + do j=-maxtor,maxtor + do k=1,maxterm + v1(k,j,i,iblock)=0.0D0 + v2(k,j,i,iblock)=0.0D0 + enddo + enddo + enddo + enddo + do iblock=1,2 + do i=-maxtor,maxtor + do j=-maxtor,maxtor + do k=-maxtor,maxtor + do l=1,maxtermd_1 + v1c(1,l,i,j,k,iblock)=0.0D0 + v1s(1,l,i,j,k,iblock)=0.0D0 + v1c(2,l,i,j,k,iblock)=0.0D0 + v1s(2,l,i,j,k,iblock)=0.0D0 + enddo !l + do l=1,maxtermd_2 + do m=1,maxtermd_2 + v2c(m,l,i,j,k,iblock)=0.0D0 + v2s(m,l,i,j,k,iblock)=0.0D0 + enddo !m + enddo !l + enddo !k + enddo !j + enddo !i + enddo !iblock + + 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 / + &'DD','DAU','DAI','DDB','DSM','DPR','DLY','DAR','DHI','DAS','DGL', + & 'DSG','DGN','DSN','DTH', + &'DYY','DAL','DTY','DTR','DVA','DLE','DIL','DPN','MED','DCY','ZER', + &'CYS','MET','PHE','ILE','LEU','VAL','TRP','TYR','ALA','GLY','THR', + &'SER','GLN','ASN','GLU','ASP','HIS','ARG','LYS','PRO','SME','DBZ', + &'AIB','ABU','D'/ + data onelet / + &'z','z','z','z','z','p','k','r','h','d','e','n','q','s','t','g', + &'a','y','w','v','l','i','f','m','c','x', + &'C','M','F','I','L','V','W','Y','A','G','T', + &'S','Q','N','E','D','H','R','K','P','z','z','z','z','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/ + 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=.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) +c print *,"Processor",myrank,fg_rank,fg_rank1, +c & " 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 +c nsumgrad=(nres-nnt)*(nres-nnt+1)/2 +c nlen=nres-nnt+1 + 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. .not. 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 + ibondp_end=nct-1 + 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' +#ifdef MPI + call int_bounds(nhpb,link_start,link_end) + 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 + return + end diff --git a/source/unres/src_MD-M-newcorr/int_to_cart.f b/source/unres/src_MD-M-newcorr/int_to_cart.f new file mode 100644 index 0000000..f413622 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/int_to_cart.f @@ -0,0 +1,273 @@ + 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) go to 18 + 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 .and. itype(i).ne.ntyp1) 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.ntyp1)) 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.ntyp1)) 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.ntyp1)) + & 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.ntyp1)) 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.ntyp1)) + & 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.ntyp1)) 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).and.(itype(i).ne.ntyp1)) 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.ntyp1)) 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.ntyp1)) 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.ntyp1)) 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.ntyp1)) 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).and. + & (itype(nres).ne.ntyp1))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-M-newcorr/intcartderiv.F b/source/unres/src_MD-M-newcorr/intcartderiv.F new file mode 100644 index 0000000..369a4f0 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/intcartderiv.F @@ -0,0 +1,754 @@ + 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 + do i=1,nres + do j=1,3 + dtheta(j,1,i)=0.0d0 + dtheta(j,2,i)=0.0d0 + dphi(j,1,i)=0.0d0 + dphi(j,2,i)=0.0d0 + dphi(j,3,i)=0.0d0 + enddo + enddo +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) + if (itype(i-1).ne.ntyp1) dtheta(j,1,i)=-dcostheta(j,1,i)/sint + dcostheta(j,2,i)=-(dc_norm(j,i-2)+cost*dc_norm(j,i-1))/ + & vbld(i) + if (itype(i-1).ne.ntyp1) dtheta(j,2,i)=-dcostheta(j,2,i)/sint + 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.ntyp1)) 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 if (itype(i-1).eq.21 .or. itype(i-2).eq.21 ) cycle +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 + if (itype(i-1).ne.ntyp1 .and. itype(i-2).ne.ntyp1) then + 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) + 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) + endif +c Bug fixed 3/24/05 (AL) + enddo +c Obtaining the gamma derivatives from cosine derivative + else + do j=1,3 + if (itype(i-1).ne.ntyp1 .and. itype(i-2).ne.ntyp1) then + 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) + endif + 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.ntyp1).or.(itype(i-2).eq.10)) cycle +c if ((itype(i-2).eq.ntyp1).or.(itype(i-2).eq.10).or. +c & (itype(i-1).eq.ntyp1).or.(itype(i).eq.ntyp1)) 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.ntyp1).or.(itype(i-1).eq.10).or. + & (itype(i-2).eq.ntyp1).or.(itype(i-3).eq.ntyp1)) 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.ntyp1).or.(itype(i-1).eq.10).or. + &(itype(i-2).eq.ntyp1).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 .and. itype(i).ne.ntyp1) 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)) +c write (iout,*) "i",i," cosa",cosa," sina",sina," sino",sino + 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 + else + do j=1,3 + do k=1,3 + dalpha(k,j,i)=0.0d0 + domega(k,j,i)=0.0d0 + enddo + enddo + endif + enddo +#endif +#if defined(MPI) && defined(PARINTDER) + if (nfgtasks.gt.1) then +#ifdef DEBUG +cd write (iout,*) "Gather dtheta" +cd call flush(iout) + write (iout,*) "dtheta before gather" + do i=1,nres + write (iout,'(i3,3(3f8.5,3x))') i,((dtheta(j,k,i),k=1,3),j=1,2) + 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),k=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 + write (iout,*) "dalpha after gather" + do i=1,nres + write (iout,'(i3,3(3f8.5,3x))') i,((dalpha(j,k,i),j=1,3),k=1,3) + enddo + write (iout,*) "domega after gather" + do i=1,nres + write (iout,'(i3,3(3f8.5,3x))') i,((domega(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-M-newcorr/intcor.f b/source/unres/src_MD-M-newcorr/intcor.f new file mode 100644 index 0000000..a3cd5d0 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/intlocal.f b/source/unres/src_MD-M-newcorr/intlocal.f new file mode 100644 index 0000000..2dbcc88 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/kinetic_lesyng.f b/source/unres/src_MD-M-newcorr/kinetic_lesyng.f new file mode 100644 index 0000000..db959b3 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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=iabs(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=iabs(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-M-newcorr/lagrangian_lesyng.F b/source/unres/src_MD-M-newcorr/lagrangian_lesyng.F new file mode 100644 index 0000000..f8834ea --- /dev/null +++ b/source/unres/src_MD-M-newcorr/lagrangian_lesyng.F @@ -0,0 +1,703 @@ + 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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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.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) + double precision work(8*maxres6) + integer iwork(maxres6) + common /przechowalnia/ Gcopy,Ghalf +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 + msc(ntyp1)=1.0d0 + do i=nnt,nct + ind=ind+1 + ii = ind+m + iti=itype(i) + massvec(ii)=msc(iabs(iti)) + if (iti.ne.10 .and. iti.ne.ntyp1) then + ind1=ind1+1 + ii1= ind1+m1 + A(ii,ii1)=1.0d0 + Gmat(ii1,ii1)=ISC(iabs(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) + 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) +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)) + enddo + do i=1,dimen + do j=1,dimen + Gsqrp(i,j)=0.0d0 + Gsqrm(i,j)=0.0d0 + Gcopy(i,j)=0.0d0 + do k=1,dimen + Gsqrp(i,j)=Gsqrp(i,j)+Gvec(i,k)*Gvec(j,k)*sqreig(k) + Gsqrm(i,j)=Gsqrm(i,j)+Gvec(i,k)*Gvec(j,k)/sqreig(k) + Gcopy(i,j)=Gcopy(i,j)+Gvec(i,k)*Gvec(j,k)*Geigen(k) + enddo + 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-M-newcorr/local_move.f b/source/unres/src_MD-M-newcorr/local_move.f new file mode 100644 index 0000000..763d3cc --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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=2 + 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-M-newcorr/make-tau.log b/source/unres/src_MD-M-newcorr/make-tau.log new file mode 100644 index 0000000..c108a58 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/make-tau.log @@ -0,0 +1,1960 @@ +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 unres.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse unres.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor unres.pdb unres.F -o unres.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 unres.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o unres.o +Looking for file: unres.o + + +Debug: cleaning inst file +Executing> /bin/rm -f unres.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f unres.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o arcos.o arcos.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse arcos.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor arcos.pdb arcos.f -o arcos.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c arcos.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o arcos.o +Looking for file: arcos.o + + +Debug: cleaning inst file +Executing> /bin/rm -f arcos.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f arcos.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o cartprint.o cartprint.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse cartprint.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor cartprint.pdb cartprint.f -o cartprint.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c cartprint.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o cartprint.o +Looking for file: cartprint.o + + +Debug: cleaning inst file +Executing> /bin/rm -f cartprint.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f cartprint.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 chainbuild.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse chainbuild.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor chainbuild.pdb chainbuild.F -o chainbuild.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 chainbuild.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o chainbuild.o +Looking for file: chainbuild.o + + +Debug: cleaning inst file +Executing> /bin/rm -f chainbuild.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f chainbuild.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o convert.o convert.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse convert.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor convert.pdb convert.f -o convert.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c convert.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o convert.o +Looking for file: convert.o + + +Debug: cleaning inst file +Executing> /bin/rm -f convert.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f convert.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 initialize_p.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse initialize_p.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor initialize_p.pdb initialize_p.F -o initialize_p.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 initialize_p.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o initialize_p.o +Looking for file: initialize_p.o + + +Debug: cleaning inst file +Executing> /bin/rm -f initialize_p.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f initialize_p.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 matmult.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse matmult.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor matmult.pdb matmult.f -o matmult.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 matmult.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o matmult.o +Looking for file: matmult.o + + +Debug: cleaning inst file +Executing> /bin/rm -f matmult.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f matmult.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 readrtns_CSA.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse readrtns_CSA.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor readrtns_CSA.pdb readrtns_CSA.F -o readrtns_CSA.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 readrtns_CSA.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o readrtns_CSA.o +Looking for file: readrtns_CSA.o + + +Debug: cleaning inst file +Executing> /bin/rm -f readrtns_CSA.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f readrtns_CSA.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 parmread.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse parmread.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor parmread.pdb parmread.F -o parmread.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 parmread.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o parmread.o +Looking for file: parmread.o + + +Debug: cleaning inst file +Executing> /bin/rm -f parmread.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f parmread.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 gen_rand_conf.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse gen_rand_conf.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor gen_rand_conf.pdb gen_rand_conf.F -o gen_rand_conf.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 gen_rand_conf.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o gen_rand_conf.o +Looking for file: gen_rand_conf.o + + +Debug: cleaning inst file +Executing> /bin/rm -f gen_rand_conf.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f gen_rand_conf.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o printmat.o printmat.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse printmat.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor printmat.pdb printmat.f -o printmat.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c printmat.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o printmat.o +Looking for file: printmat.o + + +Debug: cleaning inst file +Executing> /bin/rm -f printmat.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f printmat.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o map.o map.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse map.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor map.pdb map.f -o map.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c map.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o map.o +Looking for file: map.o + + +Debug: cleaning inst file +Executing> /bin/rm -f map.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f map.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o pinorm.o pinorm.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse pinorm.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor pinorm.pdb pinorm.f -o pinorm.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c pinorm.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o pinorm.o +Looking for file: pinorm.o + + +Debug: cleaning inst file +Executing> /bin/rm -f pinorm.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f pinorm.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o randgens.o randgens.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse randgens.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor randgens.pdb randgens.f -o randgens.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c randgens.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o randgens.o +Looking for file: randgens.o + + +Debug: cleaning inst file +Executing> /bin/rm -f randgens.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f randgens.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o rescode.o rescode.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse rescode.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor rescode.pdb rescode.f -o rescode.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c rescode.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o rescode.o +Looking for file: rescode.o + + +Debug: cleaning inst file +Executing> /bin/rm -f rescode.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f rescode.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 intcor.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse intcor.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor intcor.pdb intcor.f -o intcor.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 intcor.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o intcor.o +Looking for file: intcor.o + + +Debug: cleaning inst file +Executing> /bin/rm -f intcor.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f intcor.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 timing.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse timing.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor timing.pdb timing.F -o timing.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 timing.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o timing.o +Looking for file: timing.o + + +Debug: cleaning inst file +Executing> /bin/rm -f timing.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f timing.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o misc.o misc.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse misc.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor misc.pdb misc.f -o misc.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c misc.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o misc.o +Looking for file: misc.o + + +Debug: cleaning inst file +Executing> /bin/rm -f misc.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f misc.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o intlocal.o intlocal.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse intlocal.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor intlocal.pdb intlocal.f -o intlocal.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c intlocal.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o intlocal.o +Looking for file: intlocal.o + + +Debug: cleaning inst file +Executing> /bin/rm -f intlocal.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f intlocal.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 cartder.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse cartder.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor cartder.pdb cartder.F -o cartder.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 cartder.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o cartder.o +Looking for file: cartder.o + + +Debug: cleaning inst file +Executing> /bin/rm -f cartder.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f cartder.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 checkder_p.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse checkder_p.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor checkder_p.pdb checkder_p.F -o checkder_p.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 checkder_p.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o checkder_p.o +Looking for file: checkder_p.o + + +Debug: cleaning inst file +Executing> /bin/rm -f checkder_p.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f checkder_p.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 econstr_local.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse econstr_local.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor econstr_local.pdb econstr_local.F -o econstr_local.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 econstr_local.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o econstr_local.o +Looking for file: econstr_local.o + + +Debug: cleaning inst file +Executing> /bin/rm -f econstr_local.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f econstr_local.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 energy_p_new.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse energy_p_new.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor energy_p_new.pdb energy_p_new.F -o energy_p_new.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 energy_p_new.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o energy_p_new.o +Looking for file: energy_p_new.o + + +Debug: cleaning inst file +Executing> /bin/rm -f energy_p_new.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f energy_p_new.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 energy_p_new-sep.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse energy_p_new-sep.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor energy_p_new-sep.pdb energy_p_new-sep.F -o energy_p_new-sep.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 energy_p_new-sep.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o energy_p_new-sep.o +Looking for file: energy_p_new-sep.o + + +Debug: cleaning inst file +Executing> /bin/rm -f energy_p_new-sep.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f energy_p_new-sep.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 gradient_p.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse gradient_p.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor gradient_p.pdb gradient_p.F -o gradient_p.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 gradient_p.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o gradient_p.o +Looking for file: gradient_p.o + + +Debug: cleaning inst file +Executing> /bin/rm -f gradient_p.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f gradient_p.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 minimize_p.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse minimize_p.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor minimize_p.pdb minimize_p.F -o minimize_p.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 minimize_p.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o minimize_p.o +Looking for file: minimize_p.o + + +Debug: cleaning inst file +Executing> /bin/rm -f minimize_p.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f minimize_p.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 sumsld.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse sumsld.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor sumsld.pdb sumsld.f -o sumsld.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 sumsld.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o sumsld.o +Looking for file: sumsld.o + + +Debug: cleaning inst file +Executing> /bin/rm -f sumsld.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f sumsld.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 cored.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse cored.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor cored.pdb cored.f -o cored.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 cored.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o cored.o +Looking for file: cored.o + + +Debug: cleaning inst file +Executing> /bin/rm -f cored.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f cored.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 rmdd.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse rmdd.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor rmdd.pdb rmdd.f -o rmdd.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 rmdd.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o rmdd.o +Looking for file: rmdd.o + + +Debug: cleaning inst file +Executing> /bin/rm -f rmdd.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f rmdd.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 geomout.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse geomout.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor geomout.pdb geomout.F -o geomout.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 geomout.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o geomout.o +Looking for file: geomout.o + + +Debug: cleaning inst file +Executing> /bin/rm -f geomout.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f geomout.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 readpdb.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse readpdb.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor readpdb.pdb readpdb.f -o readpdb.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 readpdb.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o readpdb.o +Looking for file: readpdb.o + + +Debug: cleaning inst file +Executing> /bin/rm -f readpdb.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f readpdb.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 regularize.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse regularize.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor regularize.pdb regularize.F -o regularize.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 regularize.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o regularize.o +Looking for file: regularize.o + + +Debug: cleaning inst file +Executing> /bin/rm -f regularize.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f regularize.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 thread.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse thread.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor thread.pdb thread.F -o thread.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 thread.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o thread.o +Looking for file: thread.o + + +Debug: cleaning inst file +Executing> /bin/rm -f thread.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f thread.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o fitsq.o fitsq.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse fitsq.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor fitsq.pdb fitsq.f -o fitsq.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c fitsq.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o fitsq.o +Looking for file: fitsq.o + + +Debug: cleaning inst file +Executing> /bin/rm -f fitsq.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f fitsq.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 mcm.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse mcm.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor mcm.pdb mcm.F -o mcm.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 mcm.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o mcm.o +Looking for file: mcm.o + + +Debug: cleaning inst file +Executing> /bin/rm -f mcm.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f mcm.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 mc.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse mc.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor mc.pdb mc.F -o mc.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 mc.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o mc.o +Looking for file: mc.o + + +Debug: cleaning inst file +Executing> /bin/rm -f mc.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f mc.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o bond_move.o bond_move.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse bond_move.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor bond_move.pdb bond_move.f -o bond_move.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c bond_move.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o bond_move.o +Looking for file: bond_move.o + + +Debug: cleaning inst file +Executing> /bin/rm -f bond_move.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f bond_move.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o refsys.o refsys.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse refsys.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor refsys.pdb refsys.f -o refsys.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c refsys.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o refsys.o +Looking for file: refsys.o + + +Debug: cleaning inst file +Executing> /bin/rm -f refsys.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f refsys.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o check_sc_distr.o check_sc_distr.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse check_sc_distr.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor check_sc_distr.pdb check_sc_distr.f -o check_sc_distr.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c check_sc_distr.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o check_sc_distr.o +Looking for file: check_sc_distr.o + + +Debug: cleaning inst file +Executing> /bin/rm -f check_sc_distr.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f check_sc_distr.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o check_bond.o check_bond.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse check_bond.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor check_bond.pdb check_bond.f -o check_bond.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c check_bond.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o check_bond.o +Looking for file: check_bond.o + + +Debug: cleaning inst file +Executing> /bin/rm -f check_bond.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f check_bond.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o contact.o contact.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse contact.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor contact.pdb contact.f -o contact.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c contact.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o contact.o +Looking for file: contact.o + + +Debug: cleaning inst file +Executing> /bin/rm -f contact.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f contact.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o djacob.o djacob.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse djacob.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor djacob.pdb djacob.f -o djacob.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c djacob.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o djacob.o +Looking for file: djacob.o + + +Debug: cleaning inst file +Executing> /bin/rm -f djacob.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f djacob.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 eigen.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse eigen.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor eigen.pdb eigen.f -o eigen.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 eigen.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o eigen.o +Looking for file: eigen.o + + +Debug: cleaning inst file +Executing> /bin/rm -f eigen.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f eigen.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 blas.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse blas.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor blas.pdb blas.f -o blas.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 blas.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o blas.o +Looking for file: blas.o + + +Debug: cleaning inst file +Executing> /bin/rm -f blas.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f blas.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 add.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse add.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor add.pdb add.f -o add.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 add.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o add.o +Looking for file: add.o + + +Debug: cleaning inst file +Executing> /bin/rm -f add.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f add.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 entmcm.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse entmcm.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor entmcm.pdb entmcm.F -o entmcm.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 entmcm.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o entmcm.o +Looking for file: entmcm.o + + +Debug: cleaning inst file +Executing> /bin/rm -f entmcm.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f entmcm.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 minim_mcmf.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse minim_mcmf.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor minim_mcmf.pdb minim_mcmf.F -o minim_mcmf.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 minim_mcmf.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o minim_mcmf.o +Looking for file: minim_mcmf.o + + +Debug: cleaning inst file +Executing> /bin/rm -f minim_mcmf.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f minim_mcmf.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 together.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse together.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor together.pdb together.F -o together.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 together.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o together.o +Looking for file: together.o + + +Debug: cleaning inst file +Executing> /bin/rm -f together.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f together.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 csa.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse csa.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor csa.pdb csa.f -o csa.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 csa.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o csa.o +Looking for file: csa.o + + +Debug: cleaning inst file +Executing> /bin/rm -f csa.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f csa.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 minim_jlee.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse minim_jlee.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor minim_jlee.pdb minim_jlee.F -o minim_jlee.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 minim_jlee.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o minim_jlee.o +Looking for file: minim_jlee.o + + +Debug: cleaning inst file +Executing> /bin/rm -f minim_jlee.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f minim_jlee.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 shift.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse shift.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor shift.pdb shift.F -o shift.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 shift.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o shift.o +Looking for file: shift.o + + +Debug: cleaning inst file +Executing> /bin/rm -f shift.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f shift.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 diff12.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse diff12.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor diff12.pdb diff12.f -o diff12.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 diff12.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o diff12.o +Looking for file: diff12.o + + +Debug: cleaning inst file +Executing> /bin/rm -f diff12.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f diff12.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 bank.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse bank.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor bank.pdb bank.F -o bank.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 bank.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o bank.o +Looking for file: bank.o + + +Debug: cleaning inst file +Executing> /bin/rm -f bank.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f bank.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 newconf.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse newconf.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor newconf.pdb newconf.f -o newconf.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 newconf.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o newconf.o +Looking for file: newconf.o + + +Debug: cleaning inst file +Executing> /bin/rm -f newconf.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f newconf.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 ran.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse ran.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor ran.pdb ran.f -o ran.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 ran.inst.f -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o ran.o +Looking for file: ran.o + + +Debug: cleaning inst file +Executing> /bin/rm -f ran.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f ran.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o indexx.o indexx.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse indexx.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor indexx.pdb indexx.f -o indexx.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c indexx.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o indexx.o +Looking for file: indexx.o + + +Debug: cleaning inst file +Executing> /bin/rm -f indexx.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f indexx.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 MP.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse MP.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor MP.pdb MP.F -o MP.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 MP.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o MP.o +Looking for file: MP.o + + +Debug: cleaning inst file +Executing> /bin/rm -f MP.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f MP.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 compare_s1.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse compare_s1.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor compare_s1.pdb compare_s1.F -o compare_s1.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 compare_s1.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o compare_s1.o +Looking for file: compare_s1.o + + +Debug: cleaning inst file +Executing> /bin/rm -f compare_s1.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f compare_s1.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include prng.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse prng.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor prng.pdb prng.f -o prng.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 prng.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o prng.o +Looking for file: prng.o + + +Debug: cleaning inst file +Executing> /bin/rm -f prng.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f prng.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 test.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse test.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor test.pdb test.F -o test.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 test.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o test.o +Looking for file: test.o + + +Debug: cleaning inst file +Executing> /bin/rm -f test.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f test.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o banach.o banach.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse banach.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor banach.pdb banach.f -o banach.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c banach.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o banach.o +Looking for file: banach.o + + +Debug: cleaning inst file +Executing> /bin/rm -f banach.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f banach.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o distfit.o distfit.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse distfit.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor distfit.pdb distfit.f -o distfit.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c distfit.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o distfit.o +Looking for file: distfit.o + + +Debug: cleaning inst file +Executing> /bin/rm -f distfit.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f distfit.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 rmsd.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse rmsd.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor rmsd.pdb rmsd.F -o rmsd.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 rmsd.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o rmsd.o +Looking for file: rmsd.o + + +Debug: cleaning inst file +Executing> /bin/rm -f rmsd.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f rmsd.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o elecont.o elecont.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse elecont.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor elecont.pdb elecont.f -o elecont.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c elecont.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o elecont.o +Looking for file: elecont.o + + +Debug: cleaning inst file +Executing> /bin/rm -f elecont.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f elecont.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 dihed_cons.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse dihed_cons.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor dihed_cons.pdb dihed_cons.F -o dihed_cons.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 dihed_cons.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o dihed_cons.o +Looking for file: dihed_cons.o + + +Debug: cleaning inst file +Executing> /bin/rm -f dihed_cons.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f dihed_cons.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 sc_move.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse sc_move.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor sc_move.pdb sc_move.F -o sc_move.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 sc_move.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o sc_move.o +Looking for file: sc_move.o + + +Debug: cleaning inst file +Executing> /bin/rm -f sc_move.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f sc_move.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o local_move.o local_move.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse local_move.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor local_move.pdb local_move.f -o local_move.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c local_move.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o local_move.o +Looking for file: local_move.o + + +Debug: cleaning inst file +Executing> /bin/rm -f local_move.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f local_move.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o intcartderiv.o intcartderiv.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse intcartderiv.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor intcartderiv.pdb intcartderiv.f -o intcartderiv.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c intcartderiv.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o intcartderiv.o +Looking for file: intcartderiv.o + + +Debug: cleaning inst file +Executing> /bin/rm -f intcartderiv.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f intcartderiv.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 lagrangian_lesyng.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse lagrangian_lesyng.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor lagrangian_lesyng.pdb lagrangian_lesyng.F -o lagrangian_lesyng.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 lagrangian_lesyng.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o lagrangian_lesyng.o +Looking for file: lagrangian_lesyng.o + + +Debug: cleaning inst file +Executing> /bin/rm -f lagrangian_lesyng.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f lagrangian_lesyng.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 stochfric.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse stochfric.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor stochfric.pdb stochfric.F -o stochfric.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 stochfric.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o stochfric.o +Looking for file: stochfric.o + + +Debug: cleaning inst file +Executing> /bin/rm -f stochfric.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f stochfric.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o kinetic_lesyng.o kinetic_lesyng.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse kinetic_lesyng.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor kinetic_lesyng.pdb kinetic_lesyng.f -o kinetic_lesyng.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c kinetic_lesyng.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o kinetic_lesyng.o +Looking for file: kinetic_lesyng.o + + +Debug: cleaning inst file +Executing> /bin/rm -f kinetic_lesyng.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f kinetic_lesyng.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 MD_A-MTS.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse MD_A-MTS.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor MD_A-MTS.pdb MD_A-MTS.F -o MD_A-MTS.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 MD_A-MTS.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o MD_A-MTS.o +Looking for file: MD_A-MTS.o + + +Debug: cleaning inst file +Executing> /bin/rm -f MD_A-MTS.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f MD_A-MTS.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o moments.o moments.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse moments.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor moments.pdb moments.f -o moments.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c moments.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o moments.o +Looking for file: moments.o + + +Debug: cleaning inst file +Executing> /bin/rm -f moments.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f moments.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o int_to_cart.o int_to_cart.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse int_to_cart.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor int_to_cart.pdb int_to_cart.f -o int_to_cart.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c int_to_cart.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o int_to_cart.o +Looking for file: int_to_cart.o + + +Debug: cleaning inst file +Executing> /bin/rm -f int_to_cart.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f int_to_cart.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o surfatom.o surfatom.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse surfatom.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor surfatom.pdb surfatom.f -o surfatom.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c surfatom.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o surfatom.o +Looking for file: surfatom.o + + +Debug: cleaning inst file +Executing> /bin/rm -f surfatom.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f surfatom.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o sort.o sort.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse sort.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor sort.pdb sort.f -o sort.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c sort.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o sort.o +Looking for file: sort.o + + +Debug: cleaning inst file +Executing> /bin/rm -f sort.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f sort.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o muca_md.o muca_md.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse muca_md.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor muca_md.pdb muca_md.f -o muca_md.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c muca_md.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o muca_md.o +Looking for file: muca_md.o + + +Debug: cleaning inst file +Executing> /bin/rm -f muca_md.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f muca_md.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 MREMD.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse MREMD.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor MREMD.pdb MREMD.F -o MREMD.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 MREMD.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o MREMD.o +Looking for file: MREMD.o + + +Debug: cleaning inst file +Executing> /bin/rm -f MREMD.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f MREMD.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 rattle.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse rattle.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor rattle.pdb rattle.F -o rattle.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 rattle.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o rattle.o +Looking for file: rattle.o + + +Debug: cleaning inst file +Executing> /bin/rm -f rattle.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f rattle.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o gauss.o gauss.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse gauss.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor gauss.pdb gauss.f -o gauss.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c gauss.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o gauss.o +Looking for file: gauss.o + + +Debug: cleaning inst file +Executing> /bin/rm -f gauss.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f gauss.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 energy_split-sep.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse energy_split-sep.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor energy_split-sep.pdb energy_split-sep.F -o energy_split-sep.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 energy_split-sep.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o energy_split-sep.o +Looking for file: energy_split-sep.o + + +Debug: cleaning inst file +Executing> /bin/rm -f energy_split-sep.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f energy_split-sep.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 q_measure.F + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse q_measure.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor q_measure.pdb q_measure.F -o q_measure.inst.F + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 q_measure.inst.F -I/include -DAIX -DISNAN -DUNRES -DMP -DMPI -DPGI -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o q_measure.o +Looking for file: q_measure.o + + +Debug: cleaning inst file +Executing> /bin/rm -f q_measure.inst.F + + +Debug: cleaning PDB file +Executing> /bin/rm -f q_measure.pdb + +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include -c -o gnmr1.o gnmr1.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse gnmr1.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor gnmr1.pdb gnmr1.f -o gnmr1.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 -c gnmr1.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o gnmr1.o +Looking for file: gnmr1.o + + +Debug: cleaning inst file +Executing> /bin/rm -f gnmr1.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f gnmr1.pdb + +cc -o compinfo compinfo.c +/opt/xt-pe/1.5.60/bin/snos64/cc: INFO: catamount target is being used +compinfo.c: +PGC-W-0156-Type not specified, 'int' assumed (compinfo.c: 8) +PGC/x86-64 Linux 7.2-2: compilation completed with warnings +compinfo.o(.text+0x12b): In function `main': +: warning: warning: system is not implemented and will always fail +./compinfo | true +tau_f90.sh -c -fast -pc 64 -tp p6 -I/include cinfo.f + + +Debug: Parsing with PDT Parser +Executing> /usr/local/packages/TAU-2.17/tau-2.17/../pdtoolkit-3.12/xt3/bin/f95parse cinfo.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include + + +Debug: Instrumenting with TAU +Executing> /usr/local/packages/TAU-2.17/tau-2.17/xt3/bin/tau_instrumentor cinfo.pdb cinfo.f -o cinfo.inst.f + + +Debug: Compiling with Instrumented Code +Executing> qk-pgf90 -I. -c -fast -pc 64 -tp p6 cinfo.inst.f -I/include -I/usr/local/packages/TAU-2.17/tau-2.17/include -I/opt/xt-mpt/default/mpich2-64/P2/include -o cinfo.o +Looking for file: cinfo.o + + +Debug: cleaning inst file +Executing> /bin/rm -f cinfo.inst.f + + +Debug: cleaning PDB file +Executing> /bin/rm -f cinfo.pdb + +tau_f90.sh -fast -pc 64 -tp p6 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 cinfo.o xdrf/libxdrf.a -o ../bin/unres_MD_Tc_procor-newparm-gnivpar-tau.exe + + +Debug: Linking with TAU Options +Executing> qk-pgf90 -fast -pc 64 -tp p6 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 cinfo.o xdrf/libxdrf.a -o ../bin/unres_MD_Tc_procor-newparm-gnivpar-tau.exe -L/opt/xt-mpt/default/mpich2-64/P2/lib -L/usr/local/packages/TAU-2.17/tau-2.17/xt3/lib -lTauMpi-mpi-pdt-pgi -lrt -lmpichcxx -lmpich -lrt -L/usr/local/packages/TAU-2.17/tau-2.17/xt3/lib -ltau-mpi-pdt-pgi -lstd -lC +/usr/bin/ld: skipping incompatible /usr/local/packages/TAU-2.17/tau-2.17/xt3/lib/libTauMpi-mpi-pdt-pgi.a when searching for -lTauMpi-mpi-pdt-pgi +/usr/bin/ld: skipping incompatible /usr/local/packages/TAU-2.17/tau-2.17/xt3/lib/libTauMpi-mpi-pdt-pgi.a when searching for -lTauMpi-mpi-pdt-pgi +/usr/bin/ld: cannot find -lTauMpi-mpi-pdt-pgi +Error: Tried Looking for file: ../bin/unres_MD_Tc_procor-newparm-gnivpar-tau.exe +Error: Command(Executable) is -- qk-pgf90 +Error: Full Command attempted is -- qk-pgf90 -fast -pc 64 -tp p6 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 cinfo.o xdrf/libxdrf.a -o ../bin/unres_MD_Tc_procor-newparm-gnivpar-tau.exe -L/opt/xt-mpt/default/mpich2-64/P2/lib -L/usr/local/packages/TAU-2.17/tau-2.17/xt3/lib -lTauMpi-mpi-pdt-pgi -lrt -lmpichcxx -lmpich -lrt -L/usr/local/packages/TAU-2.17/tau-2.17/xt3/lib -ltau-mpi-pdt-pgi -lstd -lC +Error: Reverting to a Regular Make + + + +Debug: Compiling with Non-Instrumented Regular Code +Executing> qk-pgf90 -fast -pc 64 -tp p6 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 cinfo.o xdrf/libxdrf.a -o ../bin/unres_MD_Tc_procor-newparm-gnivpar-tau.exe +/usr/bin/ld: skipping incompatible /opt/xt-catamount/1.5.60/lib/cnos64/liblustre.a when searching for -llustre +/usr/bin/ld: cannot find -llustre + diff --git a/source/unres/src_MD-M-newcorr/map.f b/source/unres/src_MD-M-newcorr/map.f new file mode 100644 index 0000000..6ea2632 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/map.f @@ -0,0 +1,89 @@ + 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 + 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-M-newcorr/matmult.f b/source/unres/src_MD-M-newcorr/matmult.f new file mode 100644 index 0000000..e9257cf --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/mc.F b/source/unres/src_MD-M-newcorr/mc.F new file mode 100644 index 0000000..ec5b87b --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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,1),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,1), + & 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-M-newcorr/mcm.F b/source/unres/src_MD-M-newcorr/mcm.F new file mode 100644 index 0000000..7f839f4 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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) + +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,it) + 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 + kkk=1 + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup,kkk), + & 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-M-newcorr/minim_jlee.F b/source/unres/src_MD-M-newcorr/minim_jlee.F new file mode 100644 index 0000000..d83b15b --- /dev/null +++ b/source/unres/src_MD-M-newcorr/minim_jlee.F @@ -0,0 +1,435 @@ + subroutine minim_jlee +c controls minimization and sorting routines + 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 'COMMON.CONTROL' + include 'mpif.h' + external func,gradient,fdum + real ran1,ran2,ran3 + include 'COMMON.SETUP' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.DISTFIT' + include 'COMMON.CHAIN' + dimension muster(mpi_status_size) + dimension var(maxvar),erg(mxch*(mxch+1)/2+1) + dimension var2(maxvar) + integer iffr(maxres),ihpbt(maxdim),jhpbt(maxdim) + double precision d(maxvar),v(1:lv+1),garbage(maxvar) + double precision energia(0:n_ene),time0s,time1s + dimension indx(9),info(12) + dimension iv(liv) + dimension idum(1),rdum(1) + dimension icont(2,maxcont) + logical check_var,fail + integer iloop(2) + common /przechowalnia/ v + data rad /1.745329252d-2/ +c receive # of start +! print *,'Processor',me,' calling MINIM_JLEE maxfun',maxfun, +! & ' maxmin',maxmin,' tolf',tolf,' rtolf',rtolf + nhpb0=nhpb + 10 continue + time0s=MPI_WTIME() +c print *, 'MINIM_JLEE: ',me,' is waiting' + call mpi_recv(info,12,mpi_integer,king,idint,CG_COMM, + * muster,ierr) + time1s=MPI_WTIME() + write (iout,'(a12,f10.4,a4)')'Waiting for ',time1s-time0s,' sec' + call flush(iout) + n=info(1) +c print *, 'MINIM_JLEE: ',me,' received: ',n + +crc if (ierr.ne.0) go to 100 +c if # = 0, return + if (n.eq.0) then + write (iout,*) 'Finishing minim_jlee - signal',n,' from master' + call flush(iout) + return + endif + + nfun=0 + IF (n.lt.0) THEN + call mpi_recv(var,nvar,mpi_double_precision, + * king,idreal,CG_COMM,muster,ierr) + call mpi_recv(iffr,nres,mpi_integer, + * king,idint,CG_COMM,muster,ierr) + call mpi_recv(var2,nvar,mpi_double_precision, + * king,idreal,CG_COMM,muster,ierr) + ELSE +c receive initial values of variables + call mpi_recv(var,nvar,mpi_double_precision, + * king,idreal,CG_COMM,muster,ierr) +crc if (ierr.ne.0) go to 100 + ENDIF + + if(vdisulf.and.info(2).ne.-1) then + if(info(4).ne.0)then + call mpi_recv(ihpbt,info(4),mpi_integer, + * king,idint,CG_COMM,muster,ierr) + call mpi_recv(jhpbt,info(4),mpi_integer, + * king,idint,CG_COMM,muster,ierr) + endif + endif + + IF (n.lt.0) THEN + n=-n + nhpb=nhpb0 + link_start=1 + link_end=nhpb + call init_int_table + call contact_cp(var,var2,iffr,nfun,n) + ENDIF + + if(vdisulf.and.info(2).ne.-1) then + nss=0 + if(info(4).ne.0)then +cd write(iout,*) 'SS=',info(4),'N=',info(1),'IT=',info(2) + call var_to_geom(nvar,var) + call chainbuild + do i=1,info(4) + if (dist(ihpbt(i),jhpbt(i)).lt.7.0) then + nss=nss+1 + ihpb(nss)=ihpbt(i) + jhpb(nss)=jhpbt(i) +cd write(iout,*) 'SS mv=',info(3), +cd & ihpb(nss)-nres,jhpb(nss)-nres, +cd & dist(ihpb(nss),jhpb(nss)) + dhpb(nss)=dbr + forcon(nss)=fbr + else +cd write(iout,*) 'rm SS mv=',info(3), +cd & ihpbt(i)-nres,jhpbt(i)-nres,dist(ihpbt(i),jhpbt(i)) + endif + enddo + endif + nhpb=nss + link_start=1 + link_end=nhpb + call init_int_table + endif + + if (info(3).eq.14) then + write(iout,*) 'calling local_move',info(7),info(8) + call local_move_init(.false.) + call var_to_geom(nvar,var) + call local_move(info(7),info(8),20d0,50d0) + call geom_to_var(nvar,var) + endif + + + if (info(3).eq.16) then + write(iout,*) 'calling beta_slide',info(7),info(8), + & info(10), info(11), info(12) + call var_to_geom(nvar,var) + call beta_slide(info(7),info(8),info(10),info(11),info(12) + & ,nfun,n) + call geom_to_var(nvar,var) + endif + + + if (info(3).eq.17) then + write(iout,*) 'calling beta_zip',info(7),info(8) + call var_to_geom(nvar,var) + call beta_zip(info(7),info(8),nfun,n) + call geom_to_var(nvar,var) + endif + + +crc overlap test + + if (overlapsc) then + + call var_to_geom(nvar,var) + call chainbuild + call etotal(energia(0)) + nfun=nfun+1 + if (energia(1).eq.1.0d20) then + info(3)=-info(3) + write (iout,'(a,1pe14.5)')'#OVERLAP evdw=1d20',energia(1) + call overlap_sc(fail) + if(.not.fail) then + call geom_to_var(nvar,var) + call etotal(energia(0)) + nfun=nfun+1 + write (iout,'(a,1pe14.5)')'#OVERLAP evdw after',energia(1) + else + v(10)=1.0d20 + iv(1)=-1 + goto 201 + endif + endif + endif + + if (searchsc) then + call var_to_geom(nvar,var) + call sc_move(2,nres-1,1,10d0,nft_sc,etot) + call geom_to_var(nvar,var) +cd write(iout,*) 'sc_move',nft_sc,etot + endif + + if (check_var(var,info)) then + v(10)=1.0d21 + iv(1)=6 + goto 201 + endif + + +crc + +! write (iout,*) 'MINIM_JLEE: Processor',me,' nvar',nvar +! write (iout,'(8f10.4)') (var(i),i=1,nvar) +! write (*,*) 'MINIM_JLEE: Processor',me,' received nvar',nvar +! write (*,'(8f10.4)') (var(i),i=1,nvar) + + do i=1,nvar + garbage(i)=var(i) + enddo + + 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 +cd iv(21)=iout + iv(21)=0 +* 1 means to print out result + iv(22)=0 +cd iv(22)=1 +* 1 means to print out summary stats + iv(23)=0 +* 1 means to print initial x and d + iv(24)=0 + +c if(me.eq.3.and.n.eq.255) then +c print *,' CHUJ: stoi' +c iv(21)=6 +c iv(22)=1 +c iv(23)=1 +c iv(24)=1 +c endif + +* 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 +c minimize energy +! write (iout,*) 'Processor',me,' nvar',nvar +! write (iout,*) 'Variables BEFORE minimization:' +! write (iout,'(8f10.4)') (rad2deg*var(i),i=1,nvar) + +c print *, 'MINIM_JLEE: ',me,' before SUMSL ' + + call func(nvar,var,nf,eee,idum,rdum,fdum) + nfun=nfun+1 + if(eee.ge.1.0d20) 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 + go to 201 + endif + +ct time0s=MPI_WTIME() + call sumsl(nvar,d,var,func,gradient,iv,liv,lv,v,idum,rdum,fdum) +ct write(iout,*) 'sumsl time=',MPI_WTIME()-time0s,iv(7),v(10) +c print *, 'MINIM_JLEE: ',me,' after SUMSL ' + +c find which conformation was returned from sumsl + nfun=nfun+iv(7) +! print *,'Processor',me,' iv(17)',iv(17),' iv(18)',iv(18),' nf',nf, +! & ' retcode',iv(1),' energy',v(10),' tolf',v(31),' rtolf',v(32) +c if (iv(1).ne.4 .or. nf.le.1) then +c write (*,*) 'Processor',me,' something bad in SUMSL',iv(1),nf +c write (*,*) 'Initial Variables' +c write (*,'(8f10.4)') (rad2deg*garbage(i),i=1,nvar) +c write (*,*) 'Variables' +c write (*,'(8f10.4)') (rad2deg*var(i),i=1,nvar) +c write (*,*) 'Vector d' +c write (*,'(8f10.4)') (d(i),i=1,nvar) +c write (iout,*) 'Processor',me,' something bad in SUMSL', +c & iv(1),nf +c write (iout,*) 'Initial Variables' +c write (iout,'(8f10.4)') (rad2deg*garbage(i),i=1,nvar) +c write (iout,*) 'Variables' +c write (iout,'(8f10.4)') (rad2deg*var(i),i=1,nvar) +c write (iout,*) 'Vector d' +c write (iout,'(8f10.4)') (d(i),i=1,nvar) +c endif +c if (nf.lt.iv(6)-1) then +c recalculate intra- and interchain energies +c call func(nvar,var,nf,v(10),iv,v,fdum) +c else if (nf.eq.iv(6)-1) then +c regenerate conformation +c call var_to_geom(nvar,var) +c call chainbuild +c endif +c change origin and axes to standard ECEPP format +c call var_to_geom(nvar,var) +! write (iout,*) 'MINIM_JLEE after minim: Processor',me,' nvar',nvar +! write (iout,'(8f10.4)') (var(i),i=1,nvar) +! write (iout,*) 'Energy:',v(10) +c send back output +c print *, 'MINIM_JLEE: ',me,' minimized: ',n + 201 continue + indx(1)=n +c return code: 6-gradient 9-number of ftn evaluation, etc + indx(2)=iv(1) +c total # of ftn evaluations (for iwf=0, it includes all minimizations). + indx(3)=nfun + indx(4)=info(2) + indx(5)=info(3) + indx(6)=nss + indx(7)=info(5) + indx(8)=info(6) + indx(9)=info(9) + call mpi_send(indx,9,mpi_integer,king,idint,CG_COMM, + * ierr) +c send back energies +c al & cc +c calculate contact order +#ifdef CO_BIAS + call contact(.false.,ncont,icont,co) + erg(1)=v(10)-1.0d2*co +#else + erg(1)=v(10) +#endif + j=1 + call mpi_send(erg,j,mpi_double_precision,king,idreal, + * CG_COMM,ierr) +#ifdef CO_BIAS + call mpi_send(co,j,mpi_double_precision,king,idreal, + * CG_COMM,ierr) +#endif +c send back values of variables + call mpi_send(var,nvar,mpi_double_precision, + * king,idreal,CG_COMM,ierr) +! print * , 'MINIM_JLEE: Processor',me,' send erg and var ' + + if(vdisulf.and.info(2).ne.-1.and.nss.ne.0) then +cd call intout +cd call chainbuild +cd call etotal(energia(0)) +cd etot=energia(0) +cd call enerprint(energia(0)) + call mpi_send(ihpb,nss,mpi_integer, + * king,idint,CG_COMM,ierr) + call mpi_send(jhpb,nss,mpi_integer, + * king,idint,CG_COMM,ierr) + endif + + go to 10 + 100 print *, ' error in receiving message from emperor', me + call mpi_abort(mpi_comm_world,ierror,ierrcode) + return + 200 print *, ' error in sending message to emperor' + call mpi_abort(mpi_comm_world,ierror,ierrcode) + return + 300 print *, ' error in communicating with emperor' + call mpi_abort(mpi_comm_world,ierror,ierrcode) + return + 956 format (' initial energy could not be calculated',41x) + 957 format (80x) + 965 format (' convergence code ',i2,' # of function calls ', + * i4,' # of gradient calls ',i4,10x) + 975 format (' energy ',1p,e12.4,' scaled gradient ',e11.3,32x) + end + + logical function check_var(var,info) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.SETUP' + dimension var(maxvar) + dimension info(3) +C AL ------- + check_var=.false. + do i=nphi+ntheta+1,nphi+ntheta+nside +! Check the side chain "valence" angles alpha + if (var(i).lt.1.0d-7) then + write (iout,*) 'CHUJ NASTAPIL ABSOLUTNY!!!!!!!!!!!!' + write (iout,*) 'Processor',me,'received bad variables!!!!' + write (iout,*) 'Variables' + write (iout,'(8f10.4)') (rad2deg*var(j),j=1,nvar) + write (iout,*) 'Continuing calculations at this point', + & ' could destroy the results obtained so far... ABORTING!!!!!!' + write (iout,'(a19,i5,f10.4,a4,2i4,a3,i3)') + & 'valence angle alpha',i-nphi-ntheta,var(i), + & 'n it',info(1),info(2),'mv ',info(3) + write (*,*) 'CHUJ NASTAPIL ABSOLUTNY!!!!!!!!!!!!' + write (*,*) 'Processor',me,'received bad variables!!!!' + write (*,*) 'Variables' + write (*,'(8f10.4)') (rad2deg*var(j),j=1,nvar) + write (*,*) 'Continuing calculations at this point', + & ' could destroy the results obtained so far... ABORTING!!!!!!' + write (*,'(a19,i5,f10.4,a4,2i4,a3,i3)') + & 'valence angle alpha',i-nphi-ntheta,var(i), + & 'n it',info(1),info(2),'mv ',info(3) + check_var=.true. + return + endif + enddo +! Check the backbone "valence" angles theta + do i=nphi+1,nphi+ntheta + if (var(i).lt.1.0d-7) then + write (iout,*) 'CHUJ NASTAPIL ABSOLUTNY!!!!!!!!!!!!' + write (iout,*) 'Processor',me,'received bad variables!!!!' + write (iout,*) 'Variables' + write (iout,'(8f10.4)') (rad2deg*var(j),j=1,nvar) + write (iout,*) 'Continuing calculations at this point', + & ' could destroy the results obtained so far... ABORTING!!!!!!' + write (iout,'(a19,i5,f10.4,a4,2i4,a3,i3)') + & 'valence angle theta',i-nphi,var(i), + & 'n it',info(1),info(2),'mv ',info(3) + write (*,*) 'CHUJ NASTAPIL ABSOLUTNY!!!!!!!!!!!!' + write (*,*) 'Processor',me,'received bad variables!!!!' + write (*,*) 'Variables' + write (*,'(8f10.4)') (rad2deg*var(j),j=1,nvar) + write (*,*) 'Continuing calculations at this point', + & ' could destroy the results obtained so far... ABORTING!!!!!!' + write (*,'(a19,i5,f10.4,a4,2i4,a3,i3)') + & 'valence angle theta',i-nphi,var(i), + & 'n it',info(1),info(2),'mv ',info(3) + check_var=.true. + return + endif + enddo + return + end diff --git a/source/unres/src_MD-M-newcorr/minim_mcmf.F b/source/unres/src_MD-M-newcorr/minim_mcmf.F new file mode 100644 index 0000000..836d258 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/minim_mcmf.F @@ -0,0 +1,119 @@ + 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 diff --git a/source/unres/src_MD-M-newcorr/minimize_p.F b/source/unres/src_MD-M-newcorr/minimize_p.F new file mode 100644 index 0000000..06c7a73 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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 + 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) + 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-M-newcorr/misc.f b/source/unres/src_MD-M-newcorr/misc.f new file mode 100644 index 0000000..e189839 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/module.log b/source/unres/src_MD-M-newcorr/module.log new file mode 100644 index 0000000..684781c --- /dev/null +++ b/source/unres/src_MD-M-newcorr/module.log @@ -0,0 +1,11 @@ +Currently Loaded Modulefiles: + 1) modules/3.1.6 11) xt-libc/1.5.60 + 2) pgi/7.2.2 12) xt-os/1.5.60 + 3) totalview-support/1.0.5 13) xt-catamount/1.5.60 + 4) xt-totalview/8.4.1b 14) xt-boot/1.5.60 + 5) xt-libsci/10.0.0 15) xt-crms/1.5.60 + 6) xt-mpt/1.5.60 16) xt-lustre-ss/1.5.60 + 7) xt-pe/1.5.60 17) Base-opts/1.5.60 + 8) PrgEnv-pgi/1.5.60 18) psc_path/1.0 + 9) xt-pbs/5.3.5-6xt_psc 19) dmover/1.0 + 10) xt-service/1.5.60 20) tau/tau-2.17 diff --git a/source/unres/src_MD-M-newcorr/moments.f b/source/unres/src_MD-M-newcorr/moments.f new file mode 100644 index 0000000..983ce36 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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=iabs(itype(i)) + M_SC=M_SC+msc(iabs(iti)) + inres=i+nres + do j=1,3 + cm(j)=cm(j)+msc(iabs(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=iabs(itype(i)) + inres=i+nres + do j=1,3 + pr(j)=c(j,inres)-cm(j) + enddo + Im(1,1)=Im(1,1)+msc(iabs(iti))*(pr(2)*pr(2)+pr(3)*pr(3)) + Im(1,2)=Im(1,2)-msc(iabs(iti))*pr(1)*pr(2) + Im(1,3)=Im(1,3)-msc(iabs(iti))*pr(1)*pr(3) + Im(2,3)=Im(2,3)-msc(iabs(iti))*pr(2)*pr(3) + Im(2,2)=Im(2,2)+msc(iabs(iti))*(pr(3)*pr(3)+pr(1)*pr(1)) + Im(3,3)=Im(3,3)+msc(iabs(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 .and. itype(i).ne.ntyp1) then + iti=iabs(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 .and. itype(i).ne.ntyp1) 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=iabs(itype(i)) + inres=i+nres + do j=1,3 + pr(j)=c(j,inres)-cm(j) + enddo + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) 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(iabs(iti))*vp(j) + enddo +c write (iout,*) "L",(l(j),j=1,3) + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) 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(iabs(itype(i))) + summas=summas+amas + if (itype(i).ne.10 .and. itype(i).ne.ntyp1) 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-M-newcorr/muca_md.f b/source/unres/src_MD-M-newcorr/muca_md.f new file mode 100644 index 0000000..c10a6a7 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/newconf.f b/source/unres/src_MD-M-newcorr/newconf.f new file mode 100644 index 0000000..5f93b95 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/newconf.f @@ -0,0 +1,2454 @@ +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine make_var(n,idum,iter_csa) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.HAIRPIN' + include 'COMMON.VAR' + include 'COMMON.DISTFIT' + include 'COMMON.GEO' + include 'COMMON.CONTROL' + logical nicht_getan,nicht_getan1,fail,lfound + integer nharp,iharp(4,maxres/3),nconf_harp + integer iisucc(mxio) + logical ifused(mxio) + integer nhx_seed(max_seed),ihx_seed(4,maxres/3,max_seed) + integer nhx_use(max_seed),ihx_use(0:4,maxres/3,max_seed) + integer nlx_seed(max_seed),ilx_seed(2,maxres/3,max_seed), + & nlx_use(max_seed),ilx_use(maxres/3,max_seed) + real ran1,ran2 + + write (iout,*) 'make_var : nseed=',nseed,'ntry=',n + index=0 + +c----------------------------------------- + if (n7.gt.0.or.n8.gt.0.or.n9.gt.0.or.n14.gt.0.or.n15.gt.0 + & .or.n16.gt.0.or.n17.gt.0.or.n18.gt.0) + & call select_frag(n7frag,n8frag,n14frag, + & n15frag,nbefrag,iter_csa) + +c--------------------------------------------------- +c N18 - random perturbation of one phi(=gamma) angle in a loop +c + IF (n18.gt.0) THEN + nlx_tot=0 + do iters=1,nseed + i1=is(iters) + nlx_seed(iters)=0 + do i2=1,n14frag + if (lvar_frag(i2,1).eq.i1) then + nlx_seed(iters)=nlx_seed(iters)+5 + ilx_seed(1,nlx_seed(iters),iters)=lvar_frag(i2,2) + ilx_seed(2,nlx_seed(iters),iters)=lvar_frag(i2,3) + ilx_use(nlx_seed(iters),iters)=5 + endif + enddo + nlx_use(iters)=nlx_seed(iters) + nlx_tot=nlx_tot+nlx_seed(iters) + enddo + + if (nlx_tot .ge. n18*nseed) then + ntot_gen=n18*nseed + else + ntot_gen=(nlx_tot/nseed)*nseed + endif + + ngen=0 + do while (ngen.lt.ntot_gen) + do iters=1,nseed + iseed=is(iters) + if (nlx_use(iters).gt.0) then + nicht_getan=.true. + do while (nicht_getan) + iih=iran_num(1,nlx_seed(iters)) + if (ilx_use(iih,iters).gt.0) then + nicht_getan=.false. + ilx_use(iih,iters)=ilx_use(iih,iters)-1 + nlx_use(iters)=nlx_use(iters)-1 + endif + enddo + ngen=ngen+1 + index=index+1 + movenx(index)=18 + parent(1,index)=iseed + parent(2,index)=0 + + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + jr=iran_num(ilx_seed(1,iih,iters),ilx_seed(2,iih,iters)) + d=ran_number(-pi,pi) + dihang_in(2,jr-2,1,index)=pinorm(dihang_in(2,jr-2,1,index)+d) + + + if (ngen.eq.ntot_gen) goto 145 + endif + enddo + enddo + 145 continue + + ENDIF + + +c----------------------------------------- +c N17 : zip a beta in a seed by forcing one additional p-p contact +c + IF (n17.gt.0) THEN + nhx_tot=0 + do iters=1,nseed + i1=is(iters) + nhx_seed(iters)=0 + nhx_use(iters)=0 + do i2=1,nbefrag + if (avar_frag(i2,1).eq.i1) then + nhx_seed(iters)=nhx_seed(iters)+1 + ihx_use(2,nhx_seed(iters),iters)=1 + if (avar_frag(i2,5)-avar_frag(i2,3).le.3.and. + & avar_frag(i2,2).gt.1.and.avar_frag(i2,4).lt.nres) then + ihx_seed(1,nhx_seed(iters),iters)=avar_frag(i2,2)-1 + ihx_seed(2,nhx_seed(iters),iters)=avar_frag(i2,4)+1 + ihx_use(0,nhx_seed(iters),iters)=1 + ihx_use(1,nhx_seed(iters),iters)=0 + nhx_use(iters)=nhx_use(iters)+1 + else + if (avar_frag(i2,4).gt.avar_frag(i2,5)) then + if (avar_frag(i2,2).gt.1.and. + & avar_frag(i2,4).lt.nres) then + ihx_seed(1,nhx_seed(iters),iters)=avar_frag(i2,2)-1 + ihx_seed(2,nhx_seed(iters),iters)=avar_frag(i2,4)+1 + ihx_use(0,nhx_seed(iters),iters)=1 + ihx_use(1,nhx_seed(iters),iters)=0 + nhx_use(iters)=nhx_use(iters)+1 + endif + if (avar_frag(i2,3).lt.nres.and. + & avar_frag(i2,5).gt.1) then + ihx_seed(1,nhx_seed(iters),iters)=avar_frag(i2,3)+1 + ihx_seed(2,nhx_seed(iters),iters)=avar_frag(i2,5)-1 + ihx_use(0,nhx_seed(iters),iters)= + & ihx_use(0,nhx_seed(iters),iters)+1 + ihx_use(2,nhx_seed(iters),iters)=0 + nhx_use(iters)=nhx_use(iters)+1 + endif + else + if (avar_frag(i2,2).gt.1.and. + & avar_frag(i2,4).gt.1) then + ihx_seed(1,nhx_seed(iters),iters)=avar_frag(i2,2)-1 + ihx_seed(2,nhx_seed(iters),iters)=avar_frag(i2,4)-1 + ihx_use(0,nhx_seed(iters),iters)=1 + ihx_use(1,nhx_seed(iters),iters)=0 + nhx_use(iters)=nhx_use(iters)+1 + endif + if (avar_frag(i2,3).lt.nres.and. + & avar_frag(i2,5).lt.nres) then + ihx_seed(1,nhx_seed(iters),iters)=avar_frag(i2,3)+1 + ihx_seed(2,nhx_seed(iters),iters)=avar_frag(i2,5)+1 + ihx_use(0,nhx_seed(iters),iters)= + & ihx_use(0,nhx_seed(iters),iters)+1 + ihx_use(2,nhx_seed(iters),iters)=0 + nhx_use(iters)=nhx_use(iters)+1 + endif + endif + endif + endif + enddo + + nhx_tot=nhx_tot+nhx_use(iters) +cd write (iout,*) "debug N17",iters,nhx_seed(iters), +cd & nhx_use(iters),nhx_tot + enddo + + if (nhx_tot .ge. n17*nseed) then + ntot_gen=n17*nseed + else if (nhx_tot .ge. nseed) then + ntot_gen=(nhx_tot/nseed)*nseed + else + ntot_gen=nhx_tot + endif +cd write (iout,*) "debug N17==",ntot_gen,nhx_tot,nseed + + ngen=0 + do while (ngen.lt.ntot_gen) + do iters=1,nseed + iseed=is(iters) + if (nhx_use(iters).gt.0) then +cd write (iout,*) "debug N17",nhx_use(iters),ngen,ntot_gen +cd write (iout,*) "debugN17^", +cd & (ihx_use(0,k,iters),k=1,nhx_use(iters)) + nicht_getan=.true. + do while (nicht_getan) + iih=iran_num(1,nhx_seed(iters)) +cd write (iout,*) "debugN17^",iih + if (ihx_use(0,iih,iters).gt.0) then + iim=iran_num(1,2) +cd write (iout,*) "debugN17=",iih,nhx_seed(iters) +cd write (iout,*) "debugN17-",iim,'##', +cd & (ihx_use(k,iih,iters),k=0,2) +cd call flush(iout) + do while (ihx_use(iim,iih,iters).eq.1) + iim=iran_num(1,2) +cd write (iout,*) "debugN17-",iim,'##', +cd & (ihx_use(k,iih,iters),k=0,2) +cd call flush(iout) + enddo + nicht_getan=.false. + ihx_use(iim,iih,iters)=1 + ihx_use(0,iih,iters)=ihx_use(0,iih,iters)-1 + nhx_use(iters)=nhx_use(iters)-1 + endif + enddo + ngen=ngen+1 + index=index+1 + movenx(index)=17 + parent(1,index)=iseed + parent(2,index)=0 + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + if (iim.eq.1) then + idata(1,index)=ihx_seed(1,iih,iters) + idata(2,index)=ihx_seed(2,iih,iters) + else + idata(1,index)=ihx_seed(3,iih,iters) + idata(2,index)=ihx_seed(4,iih,iters) + endif + + if (ngen.eq.ntot_gen) goto 115 + endif + enddo + enddo + 115 continue + write (iout,*) "N17",n17," ngen/nseed",ngen/nseed, + & ngen,nseed + + + ENDIF +c----------------------------------------- +c N16 : slide non local beta in a seed by +/- 1 or +/- 2 +c + IF (n16.gt.0) THEN + nhx_tot=0 + do iters=1,nseed + i1=is(iters) + nhx_seed(iters)=0 + do i2=1,n7frag + if (bvar_frag(i2,1).eq.i1) then + nhx_seed(iters)=nhx_seed(iters)+1 + ihx_seed(1,nhx_seed(iters),iters)=bvar_frag(i2,3) + ihx_seed(2,nhx_seed(iters),iters)=bvar_frag(i2,4) + ihx_seed(3,nhx_seed(iters),iters)=bvar_frag(i2,5) + ihx_seed(4,nhx_seed(iters),iters)=bvar_frag(i2,6) + ihx_use(0,nhx_seed(iters),iters)=4 + do i3=1,4 + ihx_use(i3,nhx_seed(iters),iters)=0 + enddo + endif + enddo + nhx_use(iters)=4*nhx_seed(iters) + nhx_tot=nhx_tot+nhx_seed(iters) +cd write (iout,*) "debug N16",iters,nhx_seed(iters) + enddo + + if (4*nhx_tot .ge. n16*nseed) then + ntot_gen=n16*nseed + else if (4*nhx_tot .ge. nseed) then + ntot_gen=(4*nhx_tot/nseed)*nseed + else + ntot_gen=4*nhx_tot + endif + write (iout,*) "debug N16",ntot_gen,4*nhx_tot,nseed + + ngen=0 + do while (ngen.lt.ntot_gen) + do iters=1,nseed + iseed=is(iters) + if (nhx_use(iters).gt.0) then + nicht_getan=.true. + do while (nicht_getan) + iih=iran_num(1,nhx_seed(iters)) + if (ihx_use(0,iih,iters).gt.0) then + iim=iran_num(1,4) + do while (ihx_use(iim,iih,iters).eq.1) +cd write (iout,*) iim, +cd & ihx_use(0,iih,iters),ihx_use(iim,iih,iters) + iim=iran_num(1,4) + enddo + nicht_getan=.false. + ihx_use(iim,iih,iters)=1 + ihx_use(0,iih,iters)=ihx_use(0,iih,iters)-1 + nhx_use(iters)=nhx_use(iters)-1 + endif + enddo + ngen=ngen+1 + index=index+1 + movenx(index)=16 + parent(1,index)=iseed + parent(2,index)=0 + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + do i=1,4 + idata(i,index)=ihx_seed(i,iih,iters) + enddo + idata(5,index)=iim + + if (ngen.eq.ntot_gen) goto 116 + endif + enddo + enddo + 116 continue + write (iout,*) "N16",n16," ngen/nseed",ngen/nseed, + & ngen,nseed + ENDIF +c----------------------------------------- +c N15 : copy two 2nd structure elements from 1 or 2 conf. in bank to a seed +c + IF (n15.gt.0) THEN + + do iters=1,nseed + iseed=is(iters) + do i=1,mxio + ifused(i)=.false. + enddo + + do idummy=1,n15 + iter=0 + 84 continue + + iran=0 + iif=iran_num(1,n15frag) + do while( (ifused(iif) .or. svar_frag(iif,1).eq.iseed) .and. + & iran.le.mxio ) + iif=iran_num(1,n15frag) + iran=iran+1 + enddo + if(iran.ge.mxio) goto 811 + + iran=0 + iig=iran_num(1,n15frag) + do while( (ifused(iig) .or. svar_frag(iig,1).eq.iseed .or. + & .not.(svar_frag(iif,3).lt.svar_frag(iig,2).or. + & svar_frag(iig,3).lt.svar_frag(iif,2)) ) .and. + & iran.le.mxio ) + iig=iran_num(1,n15frag) + iran=iran+1 + enddo + if(iran.ge.mxio) goto 811 + + index=index+1 + movenx(index)=15 + parent(1,index)=iseed + parent(2,index)=svar_frag(iif,1) + parent(3,index)=svar_frag(iig,1) + + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + ifused(iif)=.true. + ifused(iig)=.true. + call newconf_copy(idum,dihang_in(1,1,1,index), + & svar_frag(iif,1),svar_frag(iif,2),svar_frag(iif,3)) + + do j=svar_frag(iig,2),svar_frag(iig,3) + do i=1,4 + dihang_in(i,j,1,index)=bvar(i,j,1,svar_frag(iig,1)) + enddo + enddo + + + if(iter.lt.10) then + call check_old(icheck,index) + if(icheck.eq.1) then + index=index-1 + ifused(iif)=.false. + goto 84 + endif + endif + + 811 continue + enddo + enddo + ENDIF + +c----------------------------------------- +c N14 local_move (Maurizio) for loops in a seed +c + IF (n14.gt.0) THEN + nlx_tot=0 + do iters=1,nseed + i1=is(iters) + nlx_seed(iters)=0 + do i2=1,n14frag + if (lvar_frag(i2,1).eq.i1) then + nlx_seed(iters)=nlx_seed(iters)+3 + ilx_seed(1,nlx_seed(iters),iters)=lvar_frag(i2,2) + ilx_seed(2,nlx_seed(iters),iters)=lvar_frag(i2,3) + ilx_use(nlx_seed(iters),iters)=3 + endif + enddo + nlx_use(iters)=nlx_seed(iters) + nlx_tot=nlx_tot+nlx_seed(iters) +cd write (iout,*) "debug N14",iters,nlx_seed(iters) + enddo + + if (nlx_tot .ge. n14*nseed) then + ntot_gen=n14*nseed + else + ntot_gen=(nlx_tot/nseed)*nseed + endif +cd write (iout,*) "debug N14",ntot_gen,n14frag,nseed + + ngen=0 + do while (ngen.lt.ntot_gen) + do iters=1,nseed + iseed=is(iters) + if (nlx_use(iters).gt.0) then + nicht_getan=.true. + do while (nicht_getan) + iih=iran_num(1,nlx_seed(iters)) + if (ilx_use(iih,iters).gt.0) then + nicht_getan=.false. + ilx_use(iih,iters)=ilx_use(iih,iters)-1 + nlx_use(iters)=nlx_use(iters)-1 + endif + enddo + ngen=ngen+1 + index=index+1 + movenx(index)=14 + parent(1,index)=iseed + parent(2,index)=0 + + idata(1,index)=ilx_seed(1,iih,iters) + idata(2,index)=ilx_seed(2,iih,iters) + + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + if (ngen.eq.ntot_gen) goto 131 + endif + enddo + enddo + 131 continue +cd write (iout,*) "N14",n14," ngen/nseed",ngen/nseed, +cd & ngen,nseed + + ENDIF +c----------------------------------------- +c N9 : shift a helix in a seed +c + IF (n9.gt.0) THEN + nhx_tot=0 + do iters=1,nseed + i1=is(iters) + nhx_seed(iters)=0 + do i2=1,n8frag + if (hvar_frag(i2,1).eq.i1) then + nhx_seed(iters)=nhx_seed(iters)+1 + ihx_seed(1,nhx_seed(iters),iters)=hvar_frag(i2,2) + ihx_seed(2,nhx_seed(iters),iters)=hvar_frag(i2,3) + ihx_use(0,nhx_seed(iters),iters)=4 + do i3=1,4 + ihx_use(i3,nhx_seed(iters),iters)=0 + enddo + endif + enddo + nhx_use(iters)=4*nhx_seed(iters) + nhx_tot=nhx_tot+nhx_seed(iters) +cd write (iout,*) "debug N9",iters,nhx_seed(iters) + enddo + + if (4*nhx_tot .ge. n9*nseed) then + ntot_gen=n9*nseed + else + ntot_gen=(4*nhx_tot/nseed)*nseed + endif +cd write (iout,*) "debug N9",ntot_gen,n8frag,nseed + + ngen=0 + do while (ngen.lt.ntot_gen) + do iters=1,nseed + iseed=is(iters) + if (nhx_use(iters).gt.0) then + nicht_getan=.true. + do while (nicht_getan) + iih=iran_num(1,nhx_seed(iters)) + if (ihx_use(0,iih,iters).gt.0) then + iim=iran_num(1,4) + do while (ihx_use(iim,iih,iters).eq.1) +cd write (iout,*) iim, +cd & ihx_use(0,iih,iters),ihx_use(iim,iih,iters) + iim=iran_num(1,4) + enddo + nicht_getan=.false. + ihx_use(iim,iih,iters)=1 + ihx_use(0,iih,iters)=ihx_use(0,iih,iters)-1 + nhx_use(iters)=nhx_use(iters)-1 + endif + enddo + ngen=ngen+1 + index=index+1 + movenx(index)=9 + parent(1,index)=iseed + parent(2,index)=0 + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + jstart=max(nnt,ihx_seed(1,iih,iters)+1) + jend=min(nct,ihx_seed(2,iih,iters)) +cd write (iout,*) "debug N9",iters,iih,jstart,jend + if (iim.eq.1) then + ishift=-2 + else if (iim.eq.2) then + ishift=-1 + else if (iim.eq.3) then + ishift=1 + else if (iim.eq.4) then + ishift=2 + else + write (iout,*) 'CHUJ NASTAPIL: iim=',iim + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif + do j=jstart,jend + if (itype(j).eq.10) then + iang=2 + else + iang=4 + endif + do i=1,iang + if (j+ishift.ge.nnt.and.j+ishift.le.nct) + & dihang_in(i,j+ishift,1,index)=bvar(i,j,1,iseed) + enddo + enddo + if (ishift.gt.0) then + do j=0,ishift-1 + if (itype(jend+j).eq.10) then + iang=2 + else + iang=4 + endif + do i=1,iang + if (jend+j.ge.nnt.and.jend+j.le.nct) + & dihang_in(i,jstart+j,1,index)=bvar(i,jend+j,1,iseed) + enddo + enddo + else + do j=0,-ishift-1 + if (itype(jstart+j).eq.10) then + iang=2 + else + iang=4 + endif + do i=1,iang + if (jend+j.ge.nnt.and.jend+j.le.nct) + & dihang_in(i,jend+j,1,index)=bvar(i,jstart+j,1,iseed) + enddo + enddo + endif + if (ngen.eq.ntot_gen) goto 133 + endif + enddo + enddo + 133 continue +cd write (iout,*) "N9",n9," ngen/nseed",ngen/nseed, +cd & ngen,nseed + + ENDIF +c----------------------------------------- +c N8 : copy a helix from bank to seed +c + if (n8.gt.0) then + if (n8frag.lt.n8) then + write (iout,*) "N8: only ",n8frag,'helices' + n8c=n8frag + else + n8c=n8 + endif + + do iters=1,nseed + iseed=is(iters) + do i=1,mxio + ifused(i)=.false. + enddo + + + do idummy=1,n8c + iter=0 + 94 continue + iran=0 + iif=iran_num(1,n8frag) + do while( (ifused(iif) .or. hvar_frag(iif,1).eq.iseed) .and. + & iran.le.mxio ) + iif=iran_num(1,n8frag) + iran=iran+1 + enddo + + if(iran.ge.mxio) goto 911 + + index=index+1 + movenx(index)=8 + parent(1,index)=iseed + parent(2,index)=hvar_frag(iif,1) + + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + ifused(iif)=.true. + if (hvar_frag(iif,3)-hvar_frag(iif,2).le.6) then + call newconf_copy(idum,dihang_in(1,1,1,index), + & hvar_frag(iif,1),hvar_frag(iif,2),hvar_frag(iif,3)) + else + ih_start=iran_num(hvar_frag(iif,2),hvar_frag(iif,3)-6) + ih_end=iran_num(ih_start,hvar_frag(iif,3)) + call newconf_copy(idum,dihang_in(1,1,1,index), + & hvar_frag(iif,1),ih_start,ih_end) + endif + iter=iter+1 + if(iter.lt.10) then + call check_old(icheck,index) + if(icheck.eq.1) then + index=index-1 + ifused(iif)=.false. + goto 94 + endif + endif + + + 911 continue + + enddo + enddo + + endif + +c----------------------------------------- +c N7 : copy nonlocal beta fragment from bank to seed +c + if (n7.gt.0) then + if (n7frag.lt.n7) then + write (iout,*) "N7: only ",n7frag,'nonlocal fragments' + n7c=n7frag + else + n7c=n7 + endif + + do i=1,maxres + do j=1,mxio2 + iff_in(i,j)=0 + enddo + enddo + index2=0 + do i=1,mxio + isend2(i)=0 + enddo + + do iters=1,nseed + iseed=is(iters) + do i=1,mxio + ifused(i)=.false. + enddo + + do idummy=1,n7c + iran=0 + iif=iran_num(1,n7frag) + do while( (ifused(iif) .or. bvar_frag(iif,1).eq.iseed) .and. + & iran.le.mxio ) + iif=iran_num(1,n7frag) + iran=iran+1 + enddo + +cd write (*,'(3i5,l,4i5)'),iters,idummy,iif,ifused(iif), +cd & bvar_frag(iif,1),iseed,iran,index2 + + if(iran.ge.mxio) goto 999 + if(index2.ge.mxio2) goto 999 + + index=index+1 + movenx(index)=7 + parent(1,index)=iseed + parent(2,index)=bvar_frag(iif,1) + index2=index2+1 + isend2(index)=index2 + ifused(iif)=.true. + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in2(i,j,k,index2)=bvar(i,j,k,bvar_frag(iif,1)) + enddo + enddo + enddo + + if (bvar_frag(iif,2).eq.4) then + do i=bvar_frag(iif,3),bvar_frag(iif,4) + iff_in(i,index2)=1 + enddo + if (bvar_frag(iif,5).lt.bvar_frag(iif,6)) then +cd print *,'###',bvar_frag(iif,3),bvar_frag(iif,4), +cd & bvar_frag(iif,5),bvar_frag(iif,6) + do i=bvar_frag(iif,5),bvar_frag(iif,6) + iff_in(i,index2)=1 + enddo + else +cd print *,'###',bvar_frag(iif,3),bvar_frag(iif,4), +cd & bvar_frag(iif,6),bvar_frag(iif,5) + do i=bvar_frag(iif,6),bvar_frag(iif,5) + iff_in(i,index2)=1 + enddo + endif + endif + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + + 999 continue + + enddo + enddo + + endif +c----------------------------------------------- +c N6 : copy random continues fragment from bank to seed +c + do iters=1,nseed + iseed=is(iters) + do idummy=1,n6 + isize=(is2-is1+1)*ran1(idum)+is1 + index=index+1 + movenx(index)=6 + + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + iter=0 + 104 continue + if(icycle.le.0) then + i1=nconf* ran1(idum)+1 + i1=nbank-nconf+i1 + else + i1=nbank* ran1(idum)+1 + endif + if(i1.eq.iseed) goto 104 + iter=iter+1 + call newconf_residue(idum,dihang_in(1,1,1,index),i1,isize) + parent(1,index)=iseed + parent(2,index)=i1 + if(iter.lt.10) then + call check_old(icheck,index) + if(icheck.eq.1) goto 104 + endif + enddo + enddo +c----------------------------------------- + if (n3.gt.0.or.n4.gt.0) call gen_hairpin + nconf_harp=0 + do iters=1,nseed + if (nharp_seed(iters).gt.0) nconf_harp=nconf_harp+1 + enddo +c----------------------------------------- +c N3 : copy hairpin from bank to seed +c + do iters=1,nseed + iseed=is(iters) + nsucc=0 + nacc=0 + do idummy=1,n3 + index=index+1 + iter=0 + 124 continue + if(icycle.le.0) then + i1=nconf* ran1(idum)+1 + i1=nbank-nconf+i1 + else + i1=nbank* ran1(idum)+1 + endif + if(i1.eq.iseed) goto 124 + do k=1,nsucc + if (i1.eq.iisucc(k).and.nsucc.lt.nconf_harp-1) goto 124 + enddo + nsucc=nsucc+1 + iisucc(nsucc)=i1 + iter=iter+1 + call newconf_residue_hairpin(idum,dihang_in(1,1,1,index), + & i1,fail) + if (fail) then + if (icycle.le.0 .and. nsucc.eq.nconf .or. + & icycle.gt.0 .and. nsucc.eq.nbank) then + index=index-1 + goto 125 + else + goto 124 + endif + endif + if(iter.lt.10) then + call check_old(icheck,index) + if(icheck.eq.1) goto 124 + endif + movenx(index)=3 + parent(1,index)=iseed + parent(2,index)=i1 + + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + nacc=nacc+1 + enddo +c if not enough hairpins, supplement with windows + 125 continue +cdd if (n3.ne.0) write (iout,*) "N3",n3," nsucc",nsucc," nacc",nacc + do idummy=nacc+1,n3 + isize=(is2-is1+1)*ran1(idum)+is1 + index=index+1 + movenx(index)=6 + parent(1,index)=iseed + parent(2,index)=i1 + + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + iter=0 + 114 continue + if(icycle.le.0) then + i1=nconf* ran1(idum)+1 + i1=nbank-nconf+i1 + else + i1=nbank* ran1(idum)+1 + endif + if(i1.eq.iseed) goto 114 + iter=iter+1 + call newconf_residue(idum,dihang_in(1,1,1,index),i1,isize) + if(iter.lt.10) then + call check_old(icheck,index) + if(icheck.eq.1) goto 114 + endif + enddo + enddo +c----------------------------------------- +c N4 : shift a turn in hairpin in seed +c + IF (N4.GT.0) THEN + if (4*nharp_tot .ge. n4*nseed) then + ntot_gen=n4*nseed + else + ntot_gen=(4*nharp_tot/nseed)*nseed + endif + ngen=0 + do while (ngen.lt.ntot_gen) + do iters=1,nseed + iseed=is(iters) +c write (iout,*) 'iters',iters,' iseed',iseed,' nharp_seed', +c & nharp_seed(iters),' nharp_use',nharp_use(iters), +c & ' ntot_gen',ntot_gen +c write (iout,*) 'iharp_use(0)', +c & (iharp_use(0,k,iters),k=1,nharp_seed(iters)) + if (nharp_use(iters).gt.0) then + nicht_getan=.true. + do while (nicht_getan) + iih=iran_num(1,nharp_seed(iters)) +c write (iout,*) 'iih',iih,' iharp_use', +c & (iharp_use(k,iih,iters),k=1,4) + if (iharp_use(0,iih,iters).gt.0) then + nicht_getan1=.true. + do while (nicht_getan1) + iim=iran_num(1,4) + nicht_getan1=iharp_use(iim,iih,iters).eq.1 + enddo + nicht_getan=.false. + iharp_use(iim,iih,iters)=1 + iharp_use(0,iih,iters)=iharp_use(0,iih,iters)-1 + nharp_use(iters)=nharp_use(iters)-1 +cdd write (iout,'(a16,i3,a5,i2,a10,2i4)') +cdd & 'N4 selected hairpin',iih,' move',iim,' iharp_seed', +cdd & iharp_seed(1,iih,iters),iharp_seed(2,iih,iters) + endif + enddo + ngen=ngen+1 + index=index+1 + movenx(index)=4 + parent(1,index)=iseed + parent(2,index)=0 + + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + jstart=iharp_seed(1,iih,iters)+1 + jend=iharp_seed(2,iih,iters) + if (iim.eq.1) then + ishift=-2 + else if (iim.eq.2) then + ishift=-1 + else if (iim.eq.3) then + ishift=1 + else if (iim.eq.4) then + ishift=2 + else + write (iout,*) 'CHUJ NASTAPIL: iim=',iim + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif +c write (iout,*) 'jstart',jstart,' jend',jend,' ishift',ishift +c write (iout,*) 'Before turn shift' +c do j=2,nres-1 +c theta(j+1)=dihang_in(1,j,1,index) +c phi(j+2)=dihang_in(2,j,1,index) +c alph(j)=dihang_in(3,j,1,index) +c omeg(j)=dihang_in(4,j,1,index) +c enddo +c call intout + do j=jstart,jend + if (itype(j).eq.10) then + iang=2 + else + iang=4 + endif + do i=1,iang + if (j+ishift.ge.nnt.and.j+ishift.le.nct) + & dihang_in(i,j+ishift,1,index)=bvar(i,j,1,iseed) + enddo + enddo +c write (iout,*) 'After turn shift' +c do j=2,nres-1 +c theta(j+1)=dihang_in(1,j,1,index) +c phi(j+2)=dihang_in(2,j,1,index) +c alph(j)=dihang_in(3,j,1,index) +c omeg(j)=dihang_in(4,j,1,index) +c enddo +c call intout + if (ngen.eq.ntot_gen) goto 135 + endif + enddo + enddo +c if not enough hairpins, supplement with windows +c write (iout,*) 'end of enddo' + 135 continue +cdd write (iout,*) "N4",n4," ngen/nseed",ngen/nseed, +cdd & ngen,nseed + do iters=1,nseed + iseed=is(iters) + do idummy=ngen/nseed+1,n4 + isize=(is2-is1+1)*ran1(idum)+is1 + index=index+1 + movenx(index)=6 + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + + iter=0 + 134 continue + if(icycle.le.0) then + i1=nconf* ran1(idum)+1 + i1=nbank-nconf+i1 + else + i1=nbank* ran1(idum)+1 + endif + if(i1.eq.iseed) goto 134 + iter=iter+1 + call newconf_residue(idum,dihang_in(1,1,1,index),i1,isize) + parent(1,index)=iseed + parent(2,index)=i1 + if(iter.lt.10) then + call check_old(icheck,index) + if(icheck.eq.1) goto 134 + endif + enddo + enddo + ENDIF +c----------------------------------------- +c N5 : copy one residue from bank to seed (normally switched off - use N1) +c + do iters=1,nseed + iseed=is(iters) + isize=1 + do i=1,n5 + index=index+1 + movenx(index)=5 + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + + iter=0 + 105 continue + if(icycle.le.0) then + i1=nconf* ran1(idum)+1 + i1=nbank-nconf+i1 + else + i1=nbank* ran1(idum)+1 + endif + if(i1.eq.iseed) goto 105 + iter=iter+1 + call newconf_residue(idum,dihang_in(1,1,1,index),i1,isize) + parent(1,index)=iseed + parent(2,index)=i1 + if(iter.lt.10) then + call check_old(icheck,index) + if(icheck.eq.1) goto 105 + endif + enddo + enddo +c----------------------------------------- +c N2 : copy backbone of one residue from bank or first bank to seed +c (normally switched off - use N1) +c + do iters=1,nseed + iseed=is(iters) + do i=n2,1,-1 + if(icycle.le.0.and.iuse.gt.nconf-irr) then + iseed=ran1(idum)*nconf+1 + iseed=nbank-nconf+iseed + endif + index=index+1 + movenx(index)=2 + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + iter=0 + 102 i1= ran1(idum)*nbank+1 + if(i1.eq.iseed) goto 102 + iter=iter+1 + if(icycle.le.0.and.iuse.gt.nconf-irr) then + nran=mod(i-1,nran0)+3 + call newconf1arr(idum,dihang_in(1,1,1,index),nran,i1) + parent(1,index)=-iseed + parent(2,index)=-i1 + else if(icycle.le.0.and.iters.le.iuse) then + nran=mod(i-1,nran0)+1 + call newconf1abr(idum,dihang_in(1,1,1,index),nran,i1) + parent(1,index)=iseed + parent(2,index)=-i1 + else + nran=mod(i-1,nran1)+1 + if(ran1(idum).lt.0.5) then + call newconf1abr(idum,dihang_in(1,1,1,index),nran,i1) + parent(1,index)=iseed + parent(2,index)=-i1 + else + call newconf1abb(idum,dihang_in(1,1,1,index),nran,i1) + parent(1,index)=iseed + parent(2,index)=i1 + endif + endif + if(iter.lt.10) then + call check_old(icheck,index) + if(icheck.eq.1) goto 102 + endif + enddo + enddo +c----------------------------------------- +c N1 : copy backbone or sidechain of one residue from bank or +c first bank to seed +c + do iters=1,nseed + iseed=is(iters) + do i=n1,1,-1 + if(icycle.le.0.and.iuse.gt.nconf-irr) then + iseed=ran1(idum)*nconf+1 + iseed=nbank-nconf+iseed + endif + index=index+1 + movenx(index)=1 + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + iter=0 + 101 i1= ran1(idum)*nbank+1 + + if(i1.eq.iseed) goto 101 + iter=iter+1 + if(icycle.le.0.and.iuse.gt.nconf-irr) then + nran=mod(i-1,nran0)+3 + call newconf1rr(idum,dihang_in(1,1,1,index),nran,i1) + parent(1,index)=-iseed + parent(2,index)=-i1 + else if(icycle.le.0.and.iters.le.iuse) then + nran=mod(i-1,nran0)+1 + call newconf1br(idum,dihang_in(1,1,1,index),nran,i1) + parent(1,index)=iseed + parent(2,index)=-i1 + else + nran=mod(i-1,nran1)+1 + if(ran1(idum).lt.0.5) then + call newconf1br(idum,dihang_in(1,1,1,index),nran,i1) + parent(1,index)=iseed + parent(2,index)=-i1 + else + call newconf1bb(idum,dihang_in(1,1,1,index),nran,i1) + parent(1,index)=iseed + parent(2,index)=i1 + endif + endif + if(iter.lt.10) then + call check_old(icheck,index) + if(icheck.eq.1) goto 101 + endif + enddo + enddo +c----------------------------------------- +c N0 just all seeds +c + IF (n0.gt.0) THEN + do iters=1,nseed + iseed=is(iters) + index=index+1 + movenx(index)=0 + parent(1,index)=iseed + parent(2,index)=0 + + if (vdisulf) then + nss_in(index)=bvar_nss(iseed) + do ij=1,nss_in(index) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + endif + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + enddo + ENDIF +c----------------------------------------- + if (vdisulf) then + do iters=1,nseed + iseed=is(iters) + + do k=1,numch + do j=2,nres-1 + theta(j+1)=bvar(1,j,k,iseed) + phi(j+2)=bvar(2,j,k,iseed) + alph(j)=bvar(3,j,k,iseed) + omeg(j)=bvar(4,j,k,iseed) + enddo + enddo + call chainbuild + +cd write(iout,*) 'makevar DYNSS',iseed,'#',bvar_ns(iseed), +cd & (bvar_s(k,iseed),k=1,bvar_ns(iseed)), +cd & bvar_nss(iseed), +cd & (bvar_ss(1,k,iseed)-nres,'-', +cd & bvar_ss(2,k,iseed)-nres,k=1,bvar_nss(iseed)) + + do i1=1,bvar_ns(iseed) +c +c N10 fussion of free halfcysteines in seed +c first select CYS with distance < 7A +c + do j1=i1+1,bvar_ns(iseed) + if (dist(bvar_s(i1,iseed)+nres,bvar_s(j1,iseed)+nres) + & .lt.7.0.and. + & iabs(bvar_s(i1,iseed)-bvar_s(j1,iseed)).gt.3) then + + index=index+1 + movenx(index)=10 + parent(1,index)=iseed + parent(2,index)=0 + do ij=1,bvar_nss(iseed) + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + enddo + ij=bvar_nss(iseed)+1 + nss_in(index)=ij + iss_in(ij,index)=bvar_s(i1,iseed)+nres + jss_in(ij,index)=bvar_s(j1,iseed)+nres + +cd write(iout,*) 'makevar NSS0',index, +cd & dist(bvar_s(i1,iseed)+nres,bvar_s(j1,iseed)+nres), +cd & nss_in(index),iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + endif + enddo +c +c N11 type I transdisulfidation +c + do j1=1,bvar_nss(iseed) + if (dist(bvar_s(i1,iseed)+nres,bvar_ss(1,j1,iseed)) + & .lt.7.0.and. + & iabs(bvar_s(i1,iseed)-(bvar_ss(1,j1,iseed)-nres)) + & .gt.3) then + + index=index+1 + movenx(index)=11 + parent(1,index)=iseed + parent(2,index)=0 + do ij=1,bvar_nss(iseed) + if (ij.ne.j1) then + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + endif + enddo + nss_in(index)=bvar_nss(iseed) + iss_in(j1,index)=bvar_s(i1,iseed)+nres + jss_in(j1,index)=bvar_ss(1,j1,iseed) + if (iss_in(j1,index).gt.jss_in(j1,index)) then + iss_in(j1,index)=bvar_ss(1,j1,iseed) + jss_in(j1,index)=bvar_s(i1,iseed)+nres + endif + +cd write(iout,*) 'makevar NSS1 #1',index, +cd & bvar_s(i1,iseed),bvar_ss(1,j1,iseed)-nres, +cd & dist(bvar_s(i1,iseed)+nres,bvar_ss(1,j1,iseed)), +cd & (iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres, +cd & ij=1,nss_in(index)) + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + endif + if (dist(bvar_s(i1,iseed)+nres,bvar_ss(2,j1,iseed)) + & .lt.7.0.and. + & iabs(bvar_s(i1,iseed)-(bvar_ss(2,j1,iseed)-nres)) + & .gt.3) then + + index=index+1 + movenx(index)=11 + parent(1,index)=iseed + parent(2,index)=0 + do ij=1,bvar_nss(iseed) + if (ij.ne.j1) then + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + endif + enddo + nss_in(index)=bvar_nss(iseed) + iss_in(j1,index)=bvar_s(i1,iseed)+nres + jss_in(j1,index)=bvar_ss(2,j1,iseed) + if (iss_in(j1,index).gt.jss_in(j1,index)) then + iss_in(j1,index)=bvar_ss(2,j1,iseed) + jss_in(j1,index)=bvar_s(i1,iseed)+nres + endif + + +cd write(iout,*) 'makevar NSS1 #2',index, +cd & bvar_s(i1,iseed),bvar_ss(2,j1,iseed)-nres, +cd & dist(bvar_s(i1,iseed)+nres,bvar_ss(2,j1,iseed)), +cd & (iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres, +cd & ij=1,nss_in(index)) + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + endif + enddo + enddo + +c +c N12 type II transdisulfidation +c + do i1=1,bvar_nss(iseed) + do j1=i1+1,bvar_nss(iseed) + if (dist(bvar_ss(1,i1,iseed),bvar_ss(1,j1,iseed)) + & .lt.7.0.and. + & dist(bvar_ss(2,i1,iseed),bvar_ss(2,j1,iseed)) + & .lt.7.0.and. + & iabs(bvar_ss(1,i1,iseed)-bvar_ss(1,j1,iseed)) + & .gt.3.and. + & iabs(bvar_ss(2,i1,iseed)-bvar_ss(2,j1,iseed)) + & .gt.3) then + index=index+1 + movenx(index)=12 + parent(1,index)=iseed + parent(2,index)=0 + do ij=1,bvar_nss(iseed) + if (ij.ne.i1 .and. ij.ne.j1) then + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + endif + enddo + nss_in(index)=bvar_nss(iseed) + iss_in(i1,index)=bvar_ss(1,i1,iseed) + jss_in(i1,index)=bvar_ss(1,j1,iseed) + if (iss_in(i1,index).gt.jss_in(i1,index)) then + iss_in(i1,index)=bvar_ss(1,j1,iseed) + jss_in(i1,index)=bvar_ss(1,i1,iseed) + endif + iss_in(j1,index)=bvar_ss(2,i1,iseed) + jss_in(j1,index)=bvar_ss(2,j1,iseed) + if (iss_in(j1,index).gt.jss_in(j1,index)) then + iss_in(j1,index)=bvar_ss(2,j1,iseed) + jss_in(j1,index)=bvar_ss(2,i1,iseed) + endif + + +cd write(iout,*) 'makevar NSS2 #1',index, +cd & bvar_ss(1,i1,iseed)-nres,bvar_ss(1,j1,iseed)-nres, +cd & dist(bvar_ss(1,i1,iseed),bvar_ss(1,j1,iseed)), +cd & bvar_ss(2,i1,iseed)-nres,bvar_ss(2,j1,iseed)-nres, +cd & dist(bvar_ss(2,i1,iseed),bvar_ss(2,j1,iseed)), +cd & (iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres, +cd & ij=1,nss_in(index)) + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + endif + + if (dist(bvar_ss(1,i1,iseed),bvar_ss(2,j1,iseed)) + & .lt.7.0.and. + & dist(bvar_ss(2,i1,iseed),bvar_ss(1,j1,iseed)) + & .lt.7.0.and. + & iabs(bvar_ss(1,i1,iseed)-bvar_ss(2,j1,iseed)) + & .gt.3.and. + & iabs(bvar_ss(2,i1,iseed)-bvar_ss(1,j1,iseed)) + & .gt.3) then + index=index+1 + movenx(index)=12 + parent(1,index)=iseed + parent(2,index)=0 + do ij=1,bvar_nss(iseed) + if (ij.ne.i1 .and. ij.ne.j1) then + iss_in(ij,index)=bvar_ss(1,ij,iseed) + jss_in(ij,index)=bvar_ss(2,ij,iseed) + endif + enddo + nss_in(index)=bvar_nss(iseed) + iss_in(i1,index)=bvar_ss(1,i1,iseed) + jss_in(i1,index)=bvar_ss(2,j1,iseed) + if (iss_in(i1,index).gt.jss_in(i1,index)) then + iss_in(i1,index)=bvar_ss(2,j1,iseed) + jss_in(i1,index)=bvar_ss(1,i1,iseed) + endif + iss_in(j1,index)=bvar_ss(2,i1,iseed) + jss_in(j1,index)=bvar_ss(1,j1,iseed) + if (iss_in(j1,index).gt.jss_in(j1,index)) then + iss_in(j1,index)=bvar_ss(1,j1,iseed) + jss_in(j1,index)=bvar_ss(2,i1,iseed) + endif + + +cd write(iout,*) 'makevar NSS2 #2',index, +cd & bvar_ss(1,i1,iseed)-nres,bvar_ss(2,j1,iseed)-nres, +cd & dist(bvar_ss(1,i1,iseed),bvar_ss(2,j1,iseed)), +cd & bvar_ss(2,i1,iseed)-nres,bvar_ss(1,j1,iseed)-nres, +cd & dist(bvar_ss(2,i1,iseed),bvar_ss(1,j1,iseed)), +cd & (iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres, +cd & ij=1,nss_in(index)) + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + endif + + + enddo + enddo +c +c N13 removal of disulfide bond +c + if (bvar_nss(iseed).gt.0) then + i1=bvar_nss(iseed)*ran1(idum)+1 + + index=index+1 + movenx(index)=13 + parent(1,index)=iseed + parent(2,index)=0 + ij=0 + do j1=1,bvar_nss(iseed) + if (j1.ne.i1) then + ij=ij+1 + iss_in(ij,index)=bvar_ss(1,j1,iseed) + jss_in(ij,index)=bvar_ss(2,j1,iseed) + endif + enddo + nss_in(index)=bvar_nss(iseed)-1 + +cd write(iout,*) 'NSS3',index,i1, +cd & bvar_ss(1,i1,iseed)-nres,'=',bvar_ss(2,i1,iseed)-nres,'#', +cd & (iss_in(ij,index)-nres,'-',jss_in(ij,index)-nres, +cd & ij=1,nss_in(index)) + + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + endif + + enddo + endif +c----------------------------------------- + + + + if(index.ne.n) write(iout,*)'make_var : ntry=',index + + n=index +cd do ii=1,n +cd write (istat,*) "======== ii=",ii," the dihang array" +cd do i=1,nres +cd write (istat,'(i5,4f15.5)') i,(dihang_in(k,i,1,ii)*rad2deg,k=1,4) +cd enddo +cd enddo + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine check_old(icheck,n) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + data ctdif /10./ + data ctdiff /60./ + + i1=n + do i2=1,n-1 + diff=0.d0 + do m=1,numch + do j=2,nres-1 + do i=1,4 + dif=rad2deg*dabs(dihang_in(i,j,m,i1)-dihang_in(i,j,m,i2)) + if(dif.gt.180.0) dif=360.0-dif + if(dif.gt.ctdif) goto 100 + diff=diff+dif + if(diff.gt.ctdiff) goto 100 + enddo + enddo + enddo + icheck=1 + return + 100 continue + enddo + + icheck=0 + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine newconf1rr(idum,vvar,nran,i1) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + real ran1,ran2 + dimension vvar(mxang,maxres,mxch),iold(ntotal) + ctdif=10. + + do k=1,numch + do j=2,nres-1 + do i=1,4 + vvar(i,j,k)=rvar(i,j,k,iseed) + enddo + enddo + enddo + + do index=1,nran + iold(index) = 0 + enddo + + number=ntotgr + + iter=0 + do index=1,nran + 10 iran= ran1(idum)*number+1 + if(iter.gt.number) return + iter=iter+1 + if(iter.eq.1) goto 11 + do ind=1,index-1 + if(iran.eq.iold(ind)) goto 10 + enddo + 11 continue + + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + dif=rad2deg*dabs(vvar(i,j,k)-rvar(i,j,k,i1)) + if(dif.gt.180.) dif=360.-dif + if(dif.gt.ctdif) goto 20 + enddo + if(iter.gt.number) goto 20 + goto 10 + 20 continue + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + vvar(i,j,k)=rvar(i,j,k,i1) + enddo + iold(index)=iran + enddo + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine newconf1br(idum,vvar,nran,i1) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + real ran1,ran2 + dimension vvar(mxang,maxres,mxch),iold(ntotal) + ctdif=10. + + do k=1,numch + do j=2,nres-1 + do i=1,4 + vvar(i,j,k)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + do index=1,nran + iold(index) = 0 + enddo + + number=ntotgr + + iter=0 + do index=1,nran + 10 iran= ran1(idum)*number+1 + if(i2ndstr.gt.0) then + rtmp=ran1(idum) + if(rtmp.le.rdih_bias) then + i=0 + do j=1,ndih_nconstr + if(igroup(2,1,iran).eq.idih_nconstr(j))i=j + enddo + if(i.eq.0) then + juhc=0 +4321 juhc=juhc+1 + iran= ran1(idum)*number+1 + i=0 + do j=1,ndih_nconstr + if(igroup(2,1,iran).eq.idih_nconstr(j))i=j + enddo + if(i.eq.0.or.juhc.lt.1000)goto 4321 + if(juhc.eq.1000) then + print *, 'move 6 : failed to find unconstrained group' + write(iout,*) 'move 6 : failed to find unconstrained group' + endif + endif + endif + endif + if(iter.gt.number) return + iter=iter+1 + if(iter.eq.1) goto 11 + do ind=1,index-1 + if(iran.eq.iold(ind)) goto 10 + enddo + 11 continue + + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + dif=rad2deg*dabs(vvar(i,j,k)-rvar(i,j,k,i1)) + if(dif.gt.180.) dif=360.-dif + if(dif.gt.ctdif) goto 20 + enddo + if(iter.gt.number) goto 20 + goto 10 + 20 continue + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + vvar(i,j,k)=rvar(i,j,k,i1) + enddo + iold(index)=iran + enddo + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine newconf1bb(idum,vvar,nran,i1) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + real ran1,ran2 + dimension vvar(mxang,maxres,mxch),iold(ntotal) + ctdif=10. + + do k=1,numch + do j=2,nres-1 + do i=1,4 + vvar(i,j,k)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + do index=1,nran + iold(index) = 0 + enddo + + number=ntotgr + + iter=0 + do index=1,nran + 10 iran= ran1(idum)*number+1 + if(iter.gt.number) return + iter=iter+1 + if(iter.eq.1) goto 11 + do ind=1,index-1 + if(iran.eq.iold(ind)) goto 10 + enddo + 11 continue + + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + dif=rad2deg*dabs(vvar(i,j,k)-bvar(i,j,k,i1)) + if(dif.gt.180.) dif=360.-dif + if(dif.gt.ctdif) goto 20 + enddo + if(iter.gt.number) goto 20 + goto 10 + 20 continue + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + vvar(i,j,k)=bvar(i,j,k,i1) + enddo + iold(index)=iran + enddo + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine newconf1arr(idum,vvar,nran,i1) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + real ran1,ran2 + dimension vvar(mxang,maxres,mxch),iold(ntotal) + ctdif=10. + + do k=1,numch + do j=2,nres-1 + do i=1,4 + vvar(i,j,k)=rvar(i,j,k,iseed) + enddo + enddo + enddo + + do index=1,nran + iold(index) = 0 + enddo + + number=nres-2 + + iter=0 + do index=1,nran + 10 iran= ran1(idum)*number+1 + if(iter.gt.number) return + iter=iter+1 + if(iter.eq.1) goto 11 + do ind=1,index-1 + if(iran.eq.iold(ind)) goto 10 + enddo + 11 continue + + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + dif=rad2deg*dabs(vvar(i,j,k)-rvar(i,j,k,i1)) + if(dif.gt.180.) dif=360.-dif + if(dif.gt.ctdif) goto 20 + enddo + if(iter.gt.number) goto 20 + goto 10 + 20 continue + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + vvar(i,j,k)=rvar(i,j,k,i1) + enddo + iold(index)=iran + enddo + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine newconf1abr(idum,vvar,nran,i1) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + real ran1,ran2 + dimension vvar(mxang,maxres,mxch),iold(ntotal) + ctdif=10. + + do k=1,numch + do j=2,nres-1 + do i=1,4 + vvar(i,j,k)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + do index=1,nran + iold(index) = 0 + enddo + + number=nres-2 + + iter=0 + do index=1,nran + 10 iran= ran1(idum)*number+1 + if(i2ndstr.gt.0) then + rtmp=ran1(idum) + if(rtmp.le.rdih_bias) then + iran=ran1(idum)*ndih_nconstr+1 + iran=idih_nconstr(iran) + endif + endif + if(iter.gt.number) return + iter=iter+1 + if(iter.eq.1) goto 11 + do ind=1,index-1 + if(iran.eq.iold(ind)) goto 10 + enddo + 11 continue + + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + dif=rad2deg*dabs(vvar(i,j,k)-rvar(i,j,k,i1)) + if(dif.gt.180.) dif=360.-dif + if(dif.gt.ctdif) goto 20 + enddo + if(iter.gt.number) goto 20 + goto 10 + 20 continue + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + vvar(i,j,k)=rvar(i,j,k,i1) + enddo + iold(index)=iran + enddo + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine newconf1abb(idum,vvar,nran,i1) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + real ran1,ran2 + dimension vvar(mxang,maxres,mxch),iold(ntotal) + ctdif=10. + + do k=1,numch + do j=2,nres-1 + do i=1,4 + vvar(i,j,k)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + do index=1,nran + iold(index) = 0 + enddo + + number=nres-2 + + iter=0 + do index=1,nran + 10 iran= ran1(idum)*number+1 + if(i2ndstr.gt.0) then + rtmp=ran1(idum) + if(rtmp.le.rdih_bias) then + iran=ran1(idum)*ndih_nconstr+1 + iran=idih_nconstr(iran) + endif + endif + if(iter.gt.number) return + iter=iter+1 + if(iter.eq.1) goto 11 + do ind=1,index-1 + if(iran.eq.iold(ind)) goto 10 + enddo + 11 continue + + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + dif=rad2deg*dabs(vvar(i,j,k)-bvar(i,j,k,i1)) + if(dif.gt.180.) dif=360.-dif + if(dif.gt.ctdif) goto 20 + enddo + if(iter.gt.number) goto 20 + goto 10 + 20 continue + do ind=1,ngroup(iran) + i=igroup(1,ind,iran) + j=igroup(2,ind,iran) + k=igroup(3,ind,iran) + vvar(i,j,k)=bvar(i,j,k,i1) + enddo + iold(index)=iran + enddo + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine newconf_residue(idum,vvar,i1,isize) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + real ran1,ran2 + dimension vvar(mxang,maxres,mxch),iold(ntotal) + ctdif=10. + + if (iseed.gt.mxio .or. iseed.lt.1) then + write (iout,*) 'Dimension ERROR in NEWCONF: ISEED',iseed + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif + do k=1,numch + do j=2,nres-1 + do i=1,4 + vvar(i,j,k)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + + k=1 + number=nres+isize-2 + iter=1 + 10 iran= ran1(idum)*number+1 + if(i2ndstr.gt.0) then + rtmp=ran1(idum) + if(rtmp.le.rdih_bias) then + iran=ran1(idum)*ndih_nconstr+1 + iran=idih_nconstr(iran) + endif + endif + istart=iran-isize+1 + iend=iran + if(istart.lt.2) istart=2 + if(iend.gt.nres-1) iend=nres-1 + + if(iter.eq.1) goto 11 + do ind=1,iter-1 + if(iran.eq.iold(ind)) goto 10 + enddo + 11 continue + + do j=istart,iend + do i=1,4 + dif=rad2deg*dabs(vvar(i,j,k)-bvar(i,j,k,i1)) + if(dif.gt.180.) dif=360.-dif + if(dif.gt.ctdif) goto 20 + enddo + enddo + iold(iter)=iran + iter=iter+1 + if(iter.gt.number) goto 20 + goto 10 + + 20 continue + do j=istart,iend + do i=1,4 + vvar(i,j,k)=bvar(i,j,k,i1) + enddo + enddo + + return + end + +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine newconf_copy(idum,vvar,i1,istart,iend) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + real ran1,ran2 + dimension vvar(mxang,maxres,mxch),iold(ntotal) + ctdif=10. + + if (iseed.gt.mxio .or. iseed.lt.1) then + write (iout,*) 'Dimension ERROR in NEWCONF: ISEED',iseed + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif + do k=1,numch + do j=2,nres-1 + do i=1,4 + vvar(i,j,k)=bvar(i,j,k,iseed) + enddo + enddo + enddo + + + do j=istart,iend + do i=1,4 + vvar(i,j,1)=bvar(i,j,1,i1) + enddo + enddo + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine newconf_residue_hairpin(idum,vvar,i1,fail) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.VAR' + real ran1,ran2 + dimension vvar(mxang,maxres,mxch),iold(ntotal) + integer nharp,iharp(4,maxres/3),icipa(maxres/3) + logical fail,not_done + ctdif=10. + + fail=.false. + if (iseed.gt.mxio .or. iseed.lt.1) then + write (iout,*) 'Dimension ERROR in NEWCONF: ISEED',iseed + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif + do k=1,numch + do j=2,nres-1 + do i=1,4 + vvar(i,j,k)=bvar(i,j,k,iseed) + enddo + enddo + enddo + do k=1,numch + do j=2,nres-1 + theta(j+1)=bvar(1,j,k,i1) + phi(j+2)=bvar(2,j,k,i1) + alph(j)=bvar(3,j,k,i1) + omeg(j)=bvar(4,j,k,i1) + enddo + enddo +c call intout + call chainbuild + call hairpin(.false.,nharp,iharp) + + if (nharp.eq.0) then + fail=.true. + return + endif + + n_used=0 + + DO III=1,NHARP + + not_done = .true. + icount=0 + do while (not_done) + icount=icount+1 + iih=iran_num(1,nharp) + do k=1,n_used + if (iih.eq.icipa(k)) then + iih=0 + goto 22 + endif + enddo + not_done=.false. + n_used=n_used+1 + icipa(n_used)=iih + 22 continue + not_done = not_done .and. icount.le.nharp + enddo + + if (iih.eq.0) then + write (iout,*) "CHUJ NASTAPIL W NEWCONF_RESIDUE_HAIRPIN!!!!" + fail=.true. + return + endif + + istart=iharp(1,iih)+1 + iend=iharp(2,iih) + +cdd write (iout,*) "newconf_residue_hairpin: iih",iih, +cdd & " istart",istart," iend",iend + + do k=1,numch + do j=istart,iend + do i=1,4 + dif=rad2deg*dabs(vvar(i,j,k)-bvar(i,j,k,i1)) + if(dif.gt.180.) dif=360.-dif + if(dif.gt.ctdif) goto 20 + enddo + enddo + enddo + goto 10 + 20 continue + do k=1,numch + do j=istart,iend + do i=1,4 + vvar(i,j,k)=bvar(i,j,k,i1) + enddo + enddo + enddo +c do j=1,numch +c do l=2,nres-1 +c write (iout,'(4f8.3)') (rad2deg*vvar(i,l,j),i=1,4) +c enddo +c enddo + return + 10 continue + ENDDO + + fail=.true. + + return + end +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine gen_hairpin + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.HAIRPIN' + +c write (iout,*) 'Entering GEN_HAIRPIN' + do iters=1,nseed + i1=is(iters) + do k=1,numch + do j=2,nres-1 + theta(j+1)=bvar(1,j,k,i1) + phi(j+2)=bvar(2,j,k,i1) + alph(j)=bvar(3,j,k,i1) + omeg(j)=bvar(4,j,k,i1) + enddo + enddo + call chainbuild + call hairpin(.false.,nharp_seed(iters),iharp_seed(1,1,iters)) + enddo + + nharp_tot=0 + do iters=1,nseed + nharp_tot=nharp_tot+nharp_seed(iters) + nharp_use(iters)=4*nharp_seed(iters) + do j=1,nharp_seed(iters) + iharp_use(0,j,iters)=4 + do k=1,4 + iharp_use(k,j,iters)=0 + enddo + enddo + enddo + + write (iout,*) 'GEN_HAIRPIN: nharp_tot',nharp_tot +cdd do i=1,nseed +cdd write (iout,*) 'seed',i +cdd write (iout,*) 'nharp_seed',nharp_seed(i), +cdd & ' nharp_use',nharp_use(i) +cd write (iout,*) 'iharp_seed, iharp_use' +cd do j=1,nharp_seed(i) +cd write (iout,'(7i3)') iharp_seed(1,j,i),iharp_seed(2,j,i), +cd & (iharp_use(k,j,i),k=0,4) +cd enddo +cdd enddo + return + end + +ccccccccccccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine select_frag(nn,nh,nl,ns,nb,i_csa) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.HAIRPIN' + include 'COMMON.DISTFIT' + character*50 linia + integer isec(maxres) + + + nn=0 + nh=0 + nl=0 + ns=0 + nb=0 +cd write (iout,*) 'Entering select_frag' + do i1=1,nbank + do i=1,nres + isec(i)=0 + enddo + do k=1,numch + do j=2,nres-1 + theta(j+1)=bvar(1,j,k,i1) + phi(j+2)=bvar(2,j,k,i1) + alph(j)=bvar(3,j,k,i1) + omeg(j)=bvar(4,j,k,i1) + enddo + enddo + call chainbuild +cd write (iout,*) ' -- ',i1,' -- ' + call secondary2(.false.) +c +c bvar_frag nn==pair of nonlocal strands in beta sheet (loop>4) +c strands > 4 residues; used by N7 and N16 +c + do j=1,nbfrag +c +Ctest 09/12/02 bfrag(2,j)-bfrag(1,j).gt.3 +c + do i=bfrag(1,j),bfrag(2,j) + isec(i)=1 + enddo + do i=bfrag(4,j),bfrag(3,j),sign(1,bfrag(3,j)-bfrag(4,j)) + isec(i)=1 + enddo + + if ( (bfrag(3,j).lt.bfrag(4,j) .or. + & bfrag(4,j)-bfrag(2,j).gt.4) .and. + & bfrag(2,j)-bfrag(1,j).gt.4 ) then + nn=nn+1 + + + if (bfrag(3,j).lt.bfrag(4,j)) then + write(linia,'(a6,i3,a1,i3,a1,i3,a1,i3)') + & "select",bfrag(1,j)-1,"-",bfrag(2,j)-1 + & ,",",bfrag(3,j)-1,"-",bfrag(4,j)-1 + else + write(linia,'(a6,i3,a1,i3,a1,i3,a1,i3)') + & "select",bfrag(1,j)-1,"-",bfrag(2,j)-1 + & ,",",bfrag(4,j)-1,"-",bfrag(3,j)-1 + + endif +cd call write_pdb(i_csa*1000+nn+nh,linia,0d0) + + bvar_frag(nn,1)=i1 + bvar_frag(nn,2)=4 + do i=1,4 + bvar_frag(nn,i+2)=bfrag(i,j) + enddo + endif + enddo + +c +c hvar_frag nh==helices; used by N8 and N9 +c + do j=1,nhfrag + + do i=hfrag(1,j),hfrag(2,j) + isec(i)=2 + enddo + + if ( hfrag(2,j)-hfrag(1,j).gt.4 ) then + nh=nh+1 + +cd write(linia,'(a6,i3,a1,i3)') +cd & "select",hfrag(1,j)-1,"-",hfrag(2,j)-1 +cd call write_pdb(i_csa*1000+nn+nh,linia,0d0) + + hvar_frag(nh,1)=i1 + hvar_frag(nh,2)=hfrag(1,j) + hvar_frag(nh,3)=hfrag(2,j) + endif + enddo + + +cv write(iout,'(i4,1pe12.4,1x,1000i1)') +cv & i1,bene(i1),(isec(i),i=1,nres) +cv write(linia,'(i4,1x,1000i1)') +cv & i1,(isec(i),i=1,nres) +cv call write_pdb(i_csa*1000+i1,linia,bene(i1)) +c +c lvar_frag nl==loops; used by N14 +c + i=1 + nl1=nl + do while (i.lt.nres) + if (isec(i).eq.0) then + nl=nl+1 + lvar_frag(nl,1)=i1 + lvar_frag(nl,2)=i + i=i+1 + do while (isec(i).eq.0.and.i.le.nres) + i=i+1 + enddo + lvar_frag(nl,3)=i-1 + if (lvar_frag(nl,3)-lvar_frag(nl,2).lt.1) nl=nl-1 + endif + i=i+1 + enddo +cd write(iout,'(4i5)') (i,(lvar_frag(i,ii),ii=1,3),i=nl1+1,nl) + +c +c svar_frag ns==an secondary structure element; used by N15 +c + i=1 + ns1=ns + do while (i.lt.nres) + if (isec(i).gt.0) then + ns=ns+1 + svar_frag(ns,1)=i1 + svar_frag(ns,2)=i + i=i+1 + do while (isec(i).gt.0.and.isec(i-1).eq.isec(i) + & .and.i.le.nres) + i=i+1 + enddo + svar_frag(ns,3)=i-1 + if (svar_frag(ns,3)-svar_frag(ns,2).lt.1) ns=ns-1 + endif + if (isec(i).eq.0) i=i+1 + enddo +cd write(iout,'(4i5)') (i,(svar_frag(i,ii),ii=1,3),i=ns1+1,ns) + +c +c avar_frag nb==any pair of beta strands; used by N17 +c + do j=1,nbfrag + nb=nb+1 + avar_frag(nb,1)=i1 + do i=1,4 + avar_frag(nb,i+1)=bfrag(i,j) + enddo + enddo + + enddo + + return + end diff --git a/source/unres/src_MD-M-newcorr/objects.sizes b/source/unres/src_MD-M-newcorr/objects.sizes new file mode 100644 index 0000000..862d1e3 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/objects.sizes @@ -0,0 +1,168 @@ + text data bss dec hex filename + 342 80 0 422 1a6 add.o + text data bss dec hex filename + 104 44 0 148 94 arcos.o + text data bss dec hex filename + 2316 352 0 2668 a6c banach.o + text data bss dec hex filename + 42120 5468 772 48360 bce8 bank.o + text data bss dec hex filename + 9994 764 8 10766 2a0e blas.o + text data bss dec hex filename + 5016 680 272 5968 1750 bond_move.o + text data bss dec hex filename + 4144 196 259392 263732 40634 cartder.o + text data bss dec hex filename + 1040 224 0 1264 4f0 cartprint.o + text data bss dec hex filename + 2572 404 40 3016 bc8 chainbuild.o + text data bss dec hex filename + 368 132 184 684 2ac check_bond.o + text data bss dec hex filename + 16364 2264 390656 409284 63ec4 checkder_p.o + text data bss dec hex filename + 696 236 32 964 3c4 check_sc_distr.o + text data bss dec hex filename + 2640 832 0 3472 d90 cinfo.o + text data bss dec hex filename + 6036 980 43352 50368 c4c0 compare_s1.o + text data bss dec hex filename + 5032 672 86456 92160 16800 contact.o + text data bss dec hex filename + 3576 484 43216 47276 b8ac convert.o + text data bss dec hex filename + 28680 5840 1240 35760 8bb0 cored.o + text data bss dec hex filename + 7372 1448 264 9084 237c csa.o + text data bss dec hex filename + 632 52 0 684 2ac diff12.o + text data bss dec hex filename + 5276 768 248 6292 1894 dihed_cons.o + text data bss dec hex filename + 5840 884 21744 28468 6f34 distfit.o + text data bss dec hex filename + 4276 256 1256 5788 169c djacob.o + text data bss dec hex filename + 2200 240 0 2440 988 econstr_local.o + text data bss dec hex filename + 35258 3508 320 39086 98ae eigen.o + text data bss dec hex filename + 17660 1744 191000 210404 335e4 elecont.o + text data bss dec hex filename + 150482 10704 429408 590594 90302 energy_p_new.o + text data bss dec hex filename + 44420 4204 1136 49760 c260 energy_p_new-sep.o + text data bss dec hex filename + 3276 304 600 4180 1054 energy_split-sep.o + text data bss dec hex filename + 27800 2828 86956 117584 1cb50 entmcm.o + text data bss dec hex filename + 9964 764 568 11296 2c20 fitsq.o + text data bss dec hex filename + 2604 136 0 2740 ab4 gauss.o + text data bss dec hex filename + 15888 3224 6056 25168 6250 gen_rand_conf.o + text data bss dec hex filename + 21996 2892 26120 51008 c740 geomout.o + text data bss dec hex filename + 272 156 0 428 1ac gnmr1.o + text data bss dec hex filename + 5564 464 24 6052 17a4 gradient_p.o + text data bss dec hex filename + 1202 116 2000 3318 cf6 indexx.o + text data bss dec hex filename + 9528 16928 8308 34764 87cc initialize_p.o + text data bss dec hex filename + 12732 1176 633768 647676 9e1fc intcartderiv.o + text data bss dec hex filename + 1300 192 72 1564 61c intcor.o + text data bss dec hex filename + 11628 1740 384 13752 35b8 intlocal.o + text data bss dec hex filename + 4732 180 0 4912 1330 int_to_cart.o + text data bss dec hex filename + 2116 132 48 2296 8f8 kinetic_lesyng.o + text data bss dec hex filename + 21386 2700 39369688 39393774 25919ee lagrangian_lesyng.o + text data bss dec hex filename + 12394 1692 624 14710 3976 local_move.o + text data bss dec hex filename + 3802 412 86768 90982 16366 map.o + text data bss dec hex filename + 648 60 72 780 30c matmult.o + text data bss dec hex filename + 32904 4732 218020 255656 3e6a8 mcm.o + text data bss dec hex filename + 25172 2412 130332 157916 268dc mc.o + text data bss dec hex filename + 51422 5916 865520 922858 e14ea MD_A-MTS.o + text data bss dec hex filename + 8328 764 260456 269548 41cec minimize_p.o + text data bss dec hex filename + 11376 1464 3406284 3419124 342bf4 minim_jlee.o + text data bss dec hex filename + 1384 164 86728 88276 158d4 minim_mcmf.o + text data bss dec hex filename + 5170 878 216 6264 1878 misc.o + text data bss dec hex filename + 6752 368 712 7832 1e98 moments.o + text data bss dec hex filename + 19346 3576 8716 31638 7b96 MP.o + text data bss dec hex filename + 42300 4512 14380584 14427396 dc2504 MREMD.o + text data bss dec hex filename + 8912 1368 20568 30848 7880 muca_md.o + text data bss dec hex filename + 50648 2904 24272 77824 13000 newconf.o + text data bss dec hex filename + 42598 4892 208 47698 ba52 parmread.o + text data bss dec hex filename + 124 40 0 164 a4 pinorm.o + text data bss dec hex filename + 1256 332 0 1588 634 printmat.o + text data bss dec hex filename + 1184 16588 0 17772 456c prng.o + text data bss dec hex filename + 11748 896 194728 207372 32a0c q_measure.o + text data bss dec hex filename + 2190 448 8840 11478 2cd6 randgens.o + text data bss dec hex filename + 3104 228 524 3856 f10 ran.o + text data bss dec hex filename + 23134 1992 129688 154814 25cbe rattle.o + text data bss dec hex filename + 10440 1176 896 12512 30e0 readpdb.o + text data bss dec hex filename + 114098 11732 14564 140394 2246a readrtns_CSA.o + text data bss dec hex filename + 1816 244 0 2060 80c refsys.o + text data bss dec hex filename + 3852 492 3272720 3277064 320108 regularize.o + text data bss dec hex filename + 896 140 0 1036 40c rescode.o + text data bss dec hex filename + 444 188 0 632 278 rmdd.o + text data bss dec hex filename + 4944 776 173320 179040 2bb60 rmsd.o + text data bss dec hex filename + 9152 1292 173700 184144 2cf50 sc_move.o + text data bss dec hex filename + 5960 1888 0 7848 1ea8 shift.o + text data bss dec hex filename + 5894 920 768 7582 1d9e sort.o + text data bss dec hex filename + 17784 1960 288280 308024 4b338 stochfric.o + text data bss dec hex filename + 10248 928 120 11296 2c20 sumsld.o + text data bss dec hex filename + 4894 524 67240 72658 11bd2 surfatom.o + text data bss dec hex filename + 55640 6124 8813080 8874844 876b5c test.o + text data bss dec hex filename + 16436 1876 1048 19360 4ba0 thread.o + text data bss dec hex filename + 1820 404 28 2252 8cc timing.o + text data bss dec hex filename + 31980 4560 220320 256860 3eb5c together.o + text data bss dec hex filename + 15850 3704 44640 64194 fac2 unres.o diff --git a/source/unres/src_MD-M-newcorr/parmread.F b/source/unres/src_MD-M-newcorr/parmread.F new file mode 100644 index 0000000..03efdb2 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/parmread.F @@ -0,0 +1,1373 @@ + 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"/ + character*1 toronelet(-2:2) /"p","a","G","A","P"/ + 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,1,1),j=1,2), + & (bthet(j,i,1,1),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 + do i=1,ntyp + athet(1,i,1,-1)=athet(1,i,1,1) + athet(2,i,1,-1)=athet(2,i,1,1) + bthet(1,i,1,-1)=-bthet(1,i,1,1) + bthet(2,i,1,-1)=-bthet(2,i,1,1) + athet(1,i,-1,1)=-athet(1,i,1,1) + athet(2,i,-1,1)=-athet(2,i,1,1) + bthet(1,i,-1,1)=bthet(1,i,1,1) + bthet(2,i,-1,1)=bthet(2,i,1,1) + enddo + do i=-ntyp,-1 + a0thet(i)=a0thet(-i) + athet(1,i,-1,-1)=athet(1,-i,1,1) + athet(2,i,-1,-1)=-athet(2,-i,1,1) + bthet(1,i,-1,-1)=bthet(1,-i,1,1) + bthet(2,i,-1,-1)=-bthet(2,-i,1,1) + athet(1,i,-1,1)=athet(1,-i,1,1) + athet(2,i,-1,1)=-athet(2,-i,1,1) + bthet(1,i,-1,1)=-bthet(1,-i,1,1) + bthet(2,i,-1,1)=bthet(2,-i,1,1) + athet(1,i,1,-1)=-athet(1,-i,1,1) + athet(2,i,1,-1)=athet(2,-i,1,1) + bthet(1,i,1,-1)=bthet(1,-i,1,1) + bthet(2,i,1,-1)=-bthet(2,-i,1,1) + theta0(i)=theta0(-i) + sig0(i)=sig0(-i) + sigc0(i)=sigc0(-i) + do j=0,3 + polthet(j,i)=polthet(j,-i) + enddo + do j=1,3 + gthet(j,i)=gthet(j,-i) + enddo + 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,1,1),j=1,2),(bthet(j,i,1,1),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,1,1),j=1,2), + & (10*bthet(j,i,1,1),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=-ntyp1,-1 + ithetyp(i)=-ithetyp(-i) + enddo + do iblock=1,2 + do i=-maxthetyp,maxthetyp + do j=-maxthetyp,maxthetyp + do k=-maxthetyp,maxthetyp + aa0thet(i,j,k,iblock)=0.0d0 + do l=1,ntheterm + aathet(l,i,j,k,iblock)=0.0d0 + enddo + do l=1,ntheterm2 + do m=1,nsingle + bbthet(m,l,i,j,k,iblock)=0.0d0 + ccthet(m,l,i,j,k,iblock)=0.0d0 + ddthet(m,l,i,j,k,iblock)=0.0d0 + eethet(m,l,i,j,k,iblock)=0.0d0 + enddo + enddo + do l=1,ntheterm3 + do m=1,ndouble + do mm=1,ndouble + ffthet(mm,m,l,i,j,k,iblock)=0.0d0 + ggthet(mm,m,l,i,j,k,iblock)=0.0d0 + enddo + enddo + enddo + enddo + enddo + enddo + enddo +c VAR:iblock means terminally blocking group 1=non-proline 2=proline + do iblock=1,2 +c VAR:ntethtyp is type of theta potentials type currently 0=glycine +c VAR:1=non-glicyne non-proline 2=proline +c VAR:negative values for D-aminoacid + do i=0,nthetyp + do j=-nthetyp,nthetyp + do k=-nthetyp,nthetyp + read (ithep,'(6a)',end=111,err=111) res1 + read (ithep,*,end=111,err=111) aa0thet(i,j,k,iblock) +c VAR: aa0thet is variable describing the average value of Foureir +c VAR: expansion series +c VAR: aathet is foureir expansion in theta/2 angle for full formula +c VAR: look at the fitting equation in Kozlowska et al., J. Phys.: +Condens. Matter 19 (2007) 285203 and Sieradzan et al., unpublished + read (ithep,*,end=111,err=111) + &(aathet(l,i,j,k,iblock),l=1,ntheterm) + read (ithep,*,end=111,err=111) + & ((bbthet(lll,ll,i,j,k,iblock),lll=1,nsingle), + & (ccthet(lll,ll,i,j,k,iblock),lll=1,nsingle), + & (ddthet(lll,ll,i,j,k,iblock),lll=1,nsingle), + & (eethet(lll,ll,i,j,k,iblock),lll=1,nsingle), + & ll=1,ntheterm2) + read (ithep,*,end=111,err=111) + & (((ffthet(llll,lll,ll,i,j,k,iblock), + & ffthet(lll,llll,ll,i,j,k,iblock), + & ggthet(llll,lll,ll,i,j,k,iblock), + & ggthet(lll,llll,ll,i,j,k,iblock), + & 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 IF YOU WANT VALENCE POTENTIALS FOR DUMMY ATOM UNCOMENT BELOW (NOT +C RECOMENTDED AFTER VERSION 3.3) +c do i=1,nthetyp +c do j=1,nthetyp +c do l=1,ntheterm +c aathet(l,i,j,nthetyp+1,iblock)=aathet(l,i,j,1,iblock) +c aathet(l,nthetyp+1,i,j,iblock)=aathet(l,1,i,j,iblock) +c enddo +c aa0thet(i,j,nthetyp+1,iblock)=aa0thet(i,j,1,iblock) +c aa0thet(nthetyp+1,i,j,iblock)=aa0thet(1,i,j,iblock) +c enddo +c do l=1,ntheterm +c aathet(l,nthetyp+1,i,nthetyp+1,iblock)=aathet(l,1,i,1,iblock) +c enddo +c aa0thet(nthetyp+1,i,nthetyp+1,iblock)=aa0thet(1,i,1,iblock) +c enddo +c enddo +C AND COMMENT THE LOOPS BELOW + do i=1,nthetyp + do j=1,nthetyp + do l=1,ntheterm + aathet(l,i,j,nthetyp+1,iblock)=0.0d0 + aathet(l,nthetyp+1,i,j,iblock)=0.0d0 + enddo + aa0thet(i,j,nthetyp+1,iblock)=0.0d0 + aa0thet(nthetyp+1,i,j,iblock)=0.0d0 + enddo + do l=1,ntheterm + aathet(l,nthetyp+1,i,nthetyp+1,iblock)=0.0d0 + enddo + aa0thet(nthetyp+1,i,nthetyp+1,iblock)=0.0d0 + enddo + enddo +C TILL HERE +C Substitution for D aminoacids from symmetry. + do iblock=1,2 + do i=-nthetyp,0 + do j=-nthetyp,nthetyp + do k=-nthetyp,nthetyp + aa0thet(i,j,k,iblock)=aa0thet(-i,-j,-k,iblock) + do l=1,ntheterm + aathet(l,i,j,k,iblock)=aathet(l,-i,-j,-k,iblock) + enddo + do ll=1,ntheterm2 + do lll=1,nsingle + bbthet(lll,ll,i,j,k,iblock)=bbthet(lll,ll,-i,-j,-k,iblock) + ccthet(lll,ll,i,j,k,iblock)=-ccthet(lll,ll,-i,-j,-k,iblock) + ddthet(lll,ll,i,j,k,iblock)=ddthet(lll,ll,-i,-j,-k,iblock) + eethet(lll,ll,i,j,k,iblock)=-eethet(lll,ll,-i,-j,-k,iblock) + enddo + enddo + do ll=1,ntheterm3 + do lll=2,ndouble + do llll=1,lll-1 + ffthet(llll,lll,ll,i,j,k,iblock)= + & ffthet(llll,lll,ll,-i,-j,-k,iblock) + ffthet(lll,llll,ll,i,j,k,iblock)= + & ffthet(lll,llll,ll,-i,-j,-k,iblock) + ggthet(llll,lll,ll,i,j,k,iblock)= + & -ggthet(llll,lll,ll,-i,-j,-k,iblock) + ggthet(lll,llll,ll,i,j,k,iblock)= + & -ggthet(lll,llll,ll,-i,-j,-k,iblock) + enddo !ll + enddo !lll + enddo !llll + enddo !k + enddo !j + enddo !i + enddo !iblock +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,iblock) + write (iout,'(i2,1pe15.5)') + & (l,aathet(l,i,j,k,iblock),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,iblock),ccthet(m,l,i,j,k,iblock), + & ddthet(m,l,i,j,k,iblock),eethet(m,l,i,j,k,iblock) + 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,iblock), + & ffthet(m,n,l,i,j,k,iblock), + & ggthet(n,m,l,i,j,k,iblock), + & ggthet(m,n,l,i,j,k,iblock) + enddo + enddo + enddo + enddo + enddo + enddo + call flush(iout) + endif + write (2,*) "Start reading THETA_PDB",ithep_pdb + do i=1,ntyp +c write (2,*) 'i=',i + read (ithep_pdb,*,err=111,end=111) + & a0thet(i),(athet(j,i,1,1),j=1,2), + & (bthet(j,i,1,1),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 + do i=1,ntyp + athet(1,i,1,-1)=athet(1,i,1,1) + athet(2,i,1,-1)=athet(2,i,1,1) + bthet(1,i,1,-1)=-bthet(1,i,1,1) + bthet(2,i,1,-1)=-bthet(2,i,1,1) + athet(1,i,-1,1)=-athet(1,i,1,1) + athet(2,i,-1,1)=-athet(2,i,1,1) + bthet(1,i,-1,1)=bthet(1,i,1,1) + bthet(2,i,-1,1)=bthet(2,i,1,1) + enddo + do i=-ntyp,-1 + a0thet(i)=a0thet(-i) + athet(1,i,-1,-1)=athet(1,-i,1,1) + athet(2,i,-1,-1)=-athet(2,-i,1,1) + bthet(1,i,-1,-1)=bthet(1,-i,1,1) + bthet(2,i,-1,-1)=-bthet(2,-i,1,1) + athet(1,i,-1,1)=athet(1,-i,1,1) + athet(2,i,-1,1)=-athet(2,-i,1,1) + bthet(1,i,-1,1)=-bthet(1,-i,1,1) + bthet(2,i,-1,1)=bthet(2,-i,1,1) + athet(1,i,1,-1)=-athet(1,-i,1,1) + athet(2,i,1,-1)=athet(2,-i,1,1) + bthet(1,i,1,-1)=bthet(1,-i,1,1) + bthet(2,i,1,-1)=-bthet(2,-i,1,1) + theta0(i)=theta0(-i) + sig0(i)=sig0(-i) + sigc0(i)=sigc0(-i) + do j=0,3 + polthet(j,i)=polthet(j,-i) + enddo + do j=1,3 + gthet(j,i)=gthet(j,-i) + enddo + 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) + censc(1,1,-i)=censc(1,1,i) + censc(2,1,-i)=censc(2,1,i) + censc(3,1,-i)=-censc(3,1,i) + 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) + censc(1,j,-i)=censc(1,j,i) + censc(2,j,-i)=censc(2,j,i) + censc(3,j,-i)=-censc(3,j,i) +C BSC is amplitude of Gaussian + 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 + if (((k.eq.3).and.(l.ne.3)) + & .or.((l.eq.3).and.(k.ne.3))) then + gaussc(k,l,j,-i)=-akl + gaussc(l,k,j,-i)=-akl + else + gaussc(k,l,j,-i)=akl + gaussc(l,k,j,-i)=akl + endif + 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 + write (2,*) "Start reading ROTAM_PDB" + 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) + write (2,*) "End reading ROTAM_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) + do iblock=1,2 + do i=-ntyp,-1 + itortyp(i)=-itortyp(-i) + enddo + write (iout,*) 'ntortyp',ntortyp + do i=0,ntortyp-1 + do j=-ntortyp+1,ntortyp-1 + read (itorp,*,end=113,err=113) nterm(i,j,iblock), + & nlor(i,j,iblock) + nterm(-i,-j,iblock)=nterm(i,j,iblock) + nlor(-i,-j,iblock)=nlor(i,j,iblock) + v0ij=0.0d0 + si=-1.0d0 + do k=1,nterm(i,j,iblock) + read (itorp,*,end=113,err=113) kk,v1(k,i,j,iblock), + & v2(k,i,j,iblock) + v1(k,-i,-j,iblock)=v1(k,i,j,iblock) + v2(k,-i,-j,iblock)=-v2(k,i,j,iblock) + v0ij=v0ij+si*v1(k,i,j,iblock) + si=-si +c write(iout,*) i,j,k,iblock,nterm(i,j,iblock) +c write(iout,*) v1(k,-i,-j,iblock),v1(k,i,j,iblock), +c &v2(k,-i,-j,iblock),v2(k,i,j,iblock) + enddo + do k=1,nlor(i,j,iblock) + 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,iblock)=v0ij + v0(-i,-j,iblock)=v0ij + enddo + 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,iblock) + write (iout,'(2(1pe15.5))') v1(k,i,j,iblock), + & v2(k,i,j,iblock) + enddo + write (iout,*) 'Lorenz constants' + do k=1,nlor(i,j,iblock) + 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 iblock=1,2 + do i=0,ntortyp-1 + do j=-ntortyp+1,ntortyp-1 + do k=-ntortyp+1,ntortyp-1 + read (itordp,'(3a1)',end=114,err=114) t1,t2,t3 +c write (iout,*) "OK onelett", +c & i,j,k,t1,t2,t3 + + if (t1.ne.toronelet(i) .or. t2.ne.toronelet(j) + & .or. t3.ne.toronelet(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,iblock), + & ntermd_2(i,j,k,iblock) + ntermd_1(-i,-j,-k,iblock)=ntermd_1(i,j,k,iblock) + ntermd_2(-i,-j,-k,iblock)=ntermd_2(i,j,k,iblock) + read (itordp,*,end=114,err=114) (v1c(1,l,i,j,k,iblock),l=1, + & ntermd_1(i,j,k,iblock)) + read (itordp,*,end=114,err=114) (v1s(1,l,i,j,k,iblock),l=1, + & ntermd_1(i,j,k,iblock)) + read (itordp,*,end=114,err=114) (v1c(2,l,i,j,k,iblock),l=1, + & ntermd_1(i,j,k,iblock)) + read (itordp,*,end=114,err=114) (v1s(2,l,i,j,k,iblock),l=1, + & ntermd_1(i,j,k,iblock)) +C Martix of D parameters for one dimesional foureir series + do l=1,ntermd_1(i,j,k,iblock) + v1c(1,l,-i,-j,-k,iblock)=v1c(1,l,i,j,k,iblock) + v1s(1,l,-i,-j,-k,iblock)=-v1s(1,l,i,j,k,iblock) + v1c(2,l,-i,-j,-k,iblock)=v1c(2,l,i,j,k,iblock) + v1s(2,l,-i,-j,-k,iblock)=-v1s(2,l,i,j,k,iblock) +c write(iout,*) "whcodze" , +c & v1s(2,l,-i,-j,-k,iblock),v1s(2,l,i,j,k,iblock) + enddo + read (itordp,*,end=114,err=114) ((v2c(l,m,i,j,k,iblock), + & v2c(m,l,i,j,k,iblock),v2s(l,m,i,j,k,iblock), + & v2s(m,l,i,j,k,iblock), + & m=1,l-1),l=1,ntermd_2(i,j,k,iblock)) +C Martix of D parameters for two dimesional fourier series + do l=1,ntermd_2(i,j,k,iblock) + do m=1,l-1 + v2c(l,m,-i,-j,-k,iblock)=v2c(l,m,i,j,k,iblock) + v2c(m,l,-i,-j,-k,iblock)=v2c(m,l,i,j,k,iblock) + v2s(l,m,-i,-j,-k,iblock)=-v2s(l,m,i,j,k,iblock) + v2s(m,l,-i,-j,-k,iblock)=-v2s(m,l,i,j,k,iblock) + enddo!m + enddo!l + enddo!k + enddo!j + enddo!i + enddo!iblock + if (lprint) then + write (iout,*) + write (iout,*) 'Constants for double torsionals' + do iblock=1,2 + do i=0,ntortyp-1 + do j=-ntortyp+1,ntortyp-1 + do k=-ntortyp+1,ntortyp-1 + write (iout,*) 'ityp',i,' jtyp',j,' ktyp',k, + & ' nsingle',ntermd_1(i,j,k,iblock), + & ' ndouble',ntermd_2(i,j,k,iblock) + write (iout,*) + write (iout,*) 'Single angles:' + do l=1,ntermd_1(i,j,k,iblock) + write (iout,'(i5,2f10.5,5x,2f10.5,5x,2f10.5)') l, + & v1c(1,l,i,j,k,iblock),v1s(1,l,i,j,k,iblock), + & v1c(2,l,i,j,k,iblock),v1s(2,l,i,j,k,iblock), + & v1s(1,l,-i,-j,-k,iblock),v1s(2,l,-i,-j,-k,iblock) + enddo + write (iout,*) + write (iout,*) 'Pairs of angles:' + write (iout,'(3x,20i10)') (l,l=1,ntermd_2(i,j,k,iblock)) + do l=1,ntermd_2(i,j,k,iblock) + write (iout,'(i5,20f10.5)') + & l,(v2c(l,m,i,j,k,iblock),m=1,ntermd_2(i,j,k,iblock)) + enddo + write (iout,*) + write (iout,'(3x,20i10)') (l,l=1,ntermd_2(i,j,k,iblock)) + do l=1,ntermd_2(i,j,k,iblock) + write (iout,'(i5,20f10.5)') + & l,(v2s(l,m,i,j,k,iblock),m=1,ntermd_2(i,j,k,iblock)), + & (v2s(l,m,-i,-j,-k,iblock),m=1,ntermd_2(i,j,k,iblock)) + enddo + write (iout,*) + enddo + 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=119,err=119) nsccortyp +#ifdef SCCORPDB + read (isccor,*,end=119,err=119) (isccortyp(i),i=1,ntyp) + do i=-ntyp,-1 + isccortyp(i)=-isccortyp(-i) + enddo + iscprol=isccortyp(20) +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=119,err=119) + &nterm_sccor(i,j),nlor_sccor(i,j) + v0ijsccor=0.0d0 + v0ijsccor1=0.0d0 + v0ijsccor2=0.0d0 + v0ijsccor3=0.0d0 + si=-1.0d0 + nterm_sccor(-i,j)=nterm_sccor(i,j) + nterm_sccor(-i,-j)=nterm_sccor(i,j) + nterm_sccor(i,-j)=nterm_sccor(i,j) + do k=1,nterm_sccor(i,j) + read (isccor,*,end=119,err=119) kk,v1sccor(k,l,i,j) + & ,v2sccor(k,l,i,j) + if (j.eq.iscprol) then + if (i.eq.isccortyp(10)) then + v1sccor(k,l,i,-j)=v1sccor(k,l,i,j) + v2sccor(k,l,i,-j)=-v2sccor(k,l,i,j) + else + v1sccor(k,l,i,-j)=v1sccor(k,l,i,j)*0.5d0 + & +v2sccor(k,l,i,j)*dsqrt(0.75d0) + v2sccor(k,l,i,-j)=-v2sccor(k,l,i,j)*0.5d0 + & +v1sccor(k,l,i,j)*dsqrt(0.75d0) + v1sccor(k,l,-i,-j)=v1sccor(k,l,i,j) + v2sccor(k,l,-i,-j)=-v2sccor(k,l,i,j) + v1sccor(k,l,-i,j)=v1sccor(k,l,i,-j) + v2sccor(k,l,-i,j)=-v2sccor(k,l,i,-j) + endif + else + if (i.eq.isccortyp(10)) then + v1sccor(k,l,i,-j)=v1sccor(k,l,i,j) + v2sccor(k,l,i,-j)=-v2sccor(k,l,i,j) + else + if (j.eq.isccortyp(10)) then + v1sccor(k,l,-i,j)=v1sccor(k,l,i,j) + v2sccor(k,l,-i,j)=-v2sccor(k,l,i,j) + else + v1sccor(k,l,i,-j)=-v1sccor(k,l,i,j) + v2sccor(k,l,i,-j)=-v2sccor(k,l,i,j) + v1sccor(k,l,-i,-j)=v1sccor(k,l,i,j) + v2sccor(k,l,-i,-j)=-v2sccor(k,l,i,j) + v1sccor(k,l,-i,j)=v1sccor(k,l,i,-j) + v2sccor(k,l,-i,j)=-v2sccor(k,l,i,-j) + endif + endif + endif + v0ijsccor=v0ijsccor+si*v1sccor(k,l,i,j) + v0ijsccor1=v0ijsccor+si*v1sccor(k,l,-i,j) + v0ijsccor2=v0ijsccor+si*v1sccor(k,l,i,-j) + v0ijsccor3=v0ijsccor+si*v1sccor(k,l,-i,-j) + si=-si + enddo + do k=1,nlor_sccor(i,j) + read (isccor,*,end=119,err=119) 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(l,i,j)=v0ijsccor + v0sccor(l,-i,j)=v0ijsccor1 + v0sccor(l,i,-j)=v0ijsccor2 + v0sccor(l,-i,-j)=v0ijsccor3 + enddo + enddo + enddo + close (isccor) +#else + read (isccor,*,end=119,err=119) (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=119,err=119) + & nterm_sccor(i,j),nlor_sccor(i,j) + v0ijsccor=0.0d0 + si=-1.0d0 + + do k=1,nterm_sccor(i,j) + read (isccor,*,end=119,err=119) 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=119,err=119) 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,iblock)=v0ijsccor + enddo + enddo + enddo + close (isccor) + +#endif + 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 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=0,nloctyp-1 + read (ifourier,*,end=115,err=115) + read (ifourier,*,end=115,err=115) (b(ii),ii=1,13) +#ifdef NEWCORR + read (ifourier,*,end=115,err=115) (bnew1(ii,1,i),ii=1,3) + read (ifourier,*,end=115,err=115) (bnew2(ii,1,i),ii=1,3) + read (ifourier,*,end=115,err=115) (bnew1(ii,2,i),ii=1,1) + read (ifourier,*,end=115,err=115) (bnew2(ii,2,i),ii=1,1) + read (ifourier,*,end=115,err=115) (eenew(ii,i),ii=1,1) +#endif + if (lprint) then + write (iout,*) 'Type',i + write (iout,'(a,i2,a,f10.5)') ('b(',ii,')=',b(ii),ii=1,13) + endif +c B1(1,i) = b(3) +c B1(2,i) = b(5) +c B1(1,-i) = b(3) +c B1(2,-i) = -b(5) +c b1(1,i)=0.0d0 +c b1(2,i)=0.0d0 +c B1tilde(1,i) = b(3) +c B1tilde(2,i) =-b(5) +c B1tilde(1,-i) =-b(3) +c B1tilde(2,-i) =b(5) +c b1tilde(1,i)=0.0d0 +c b1tilde(2,i)=0.0d0 +c B2(1,i) = b(2) +c B2(2,i) = b(4) +c B2(1,-i) =b(2) +c 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) + 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) + 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) + 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) + 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 + EEold(1,1,i)= b(10)+b(11) + EEold(2,2,i)=-b(10)+b(11) + EEold(2,1,i)= b(12)-b(13) + EEold(1,2,i)= b(12)+b(13) + EEold(1,1,-i)= b(10)+b(11) + EEold(2,2,-i)=-b(10)+b(11) + EEold(2,1,-i)=-b(12)+b(13) + EEold(1,2,-i)=-b(12)-b(13) + write(iout,*) "TU DOCHODZE" +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 +c lprint=.true. + 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)') EEold(j,1,i),EEold(j,2,i) + enddo + enddo + endif +c lprint=.false. + +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 +c lprint=.true. + if (lprint) write(iout,'(2i3,4(1pe15.4))')i,j,app(i,j),bpp(i,j), + & ael6(i,j),ael3(i,j) +c lprint=.false. + 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 do i=1,ntyp + read (isidep,*,end=116,err=116)(eps(i,j),j=i,ntyp) + enddo + read (isidep,*,end=116,err=116)(sigma0(i),i=1,ntyp) + read (isidep,*,end=116,err=116)(sigii(i),i=1,ntyp) + read (isidep,*,end=116,err=116)(chip(i),i=1,ntyp) + read (isidep,*,end=116,err=116)(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,ntyp +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 +c lprint=.true. + if (lprint) then + write (iout,*) "Parameters of SC-p interactions:" + do i=1,ntyp + 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 +c lprint=.false. +#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 + 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-M-newcorr/pdtf5579.pdb b/source/unres/src_MD-M-newcorr/pdtf5579.pdb new file mode 100644 index 0000000..c606aed --- /dev/null +++ b/source/unres/src_MD-M-newcorr/pdtf5579.pdb @@ -0,0 +1,1195 @@ + +lang fortran + +so#1 readrtns_CSA.pp.F + + +so#2 DIMENSIONS + + +so#3 mpif.h + + +so#4 COMMON.SETUP + + +so#5 COMMON.CONTROL + + +so#6 COMMON.SBRIDGE + + +so#7 COMMON.IOUNITS + + +so#8 DIMENSIONS + + +so#9 mpif.h + + +so#10 COMMON.IOUNITS + + +so#11 COMMON.TIME1 + + +so#12 COMMON.THREAD + + +so#13 COMMON.SBRIDGE + + +so#14 COMMON.CONTROL + + +so#15 COMMON.MCM + + +so#16 COMMON.MAP + + +so#17 COMMON.HEADER + + +so#18 COMMON.CSA + + +so#19 COMMON.CHAIN + + +so#20 COMMON.MUCA + + +so#21 COMMON.MD + + +so#22 COMMON.FFIELD + + +so#23 COMMON.SETUP + + +so#24 DIMENSIONS + + +so#25 COMMON.IOUNITS + + +so#26 COMMON.TIME1 + + +so#27 COMMON.MD + + +so#28 COMMON.LANGEVIN.lang0 + + +so#29 COMMON.INTERACT + + +so#30 COMMON.NAMES + + +so#31 COMMON.GEO + + +so#32 COMMON.REMD + + +so#33 COMMON.CONTROL + + +so#34 COMMON.SETUP + + +so#35 DIMENSIONS + + +so#36 COMMON.IOUNITS + + +so#37 COMMON.TIME1 + + +so#38 COMMON.MD + + +so#39 COMMON.LANGEVIN.lang0 + + +so#40 COMMON.INTERACT + + +so#41 COMMON.NAMES + + +so#42 COMMON.GEO + + +so#43 COMMON.SETUP + + +so#44 COMMON.CONTROL + + +so#45 COMMON.SPLITELE + + +so#46 DIMENSIONS + + +so#47 mpif.h + + +so#48 COMMON.IOUNITS + + +so#49 COMMON.GEO + + +so#50 COMMON.VAR + + +so#51 COMMON.INTERACT + + +so#52 COMMON.LOCAL + + +so#53 COMMON.NAMES + + +so#54 COMMON.CHAIN + + +so#55 COMMON.FFIELD + + +so#56 COMMON.SBRIDGE + + +so#57 COMMON.HEADER + + +so#58 COMMON.CONTROL + + +so#59 COMMON.DBASE + + +so#60 COMMON.THREAD + + +so#61 COMMON.CONTACTS + + +so#62 COMMON.TORCNSTR + + +so#63 COMMON.TIME1 + + +so#64 COMMON.BOUNDS + + +so#65 COMMON.MD + + +so#66 COMMON.SETUP + + +so#67 DIMENSIONS + + +so#68 mpif.h + + +so#69 COMMON.IOUNITS + + +so#70 COMMON.GEO + + +so#71 COMMON.VAR + + +so#72 COMMON.INTERACT + + +so#73 COMMON.LOCAL + + +so#74 COMMON.NAMES + + +so#75 COMMON.CHAIN + + +so#76 COMMON.FFIELD + + +so#77 COMMON.SBRIDGE + + +so#78 COMMON.HEADER + + +so#79 COMMON.CONTROL + + +so#80 COMMON.DBASE + + +so#81 COMMON.THREAD + + +so#82 COMMON.TIME1 + + +so#83 COMMON.SETUP + + +so#84 DIMENSIONS + + +so#85 COMMON.GEO + + +so#86 COMMON.VAR + + +so#87 COMMON.CHAIN + + +so#88 COMMON.IOUNITS + + +so#89 COMMON.CONTROL + + +so#90 COMMON.LOCAL + + +so#91 COMMON.INTERACT + + +so#92 DIMENSIONS + + +so#93 COMMON.IOUNITS + + +so#94 COMMON.GEO + + +so#95 COMMON.VAR + + +so#96 COMMON.INTERACT + + +so#97 COMMON.LOCAL + + +so#98 COMMON.NAMES + + +so#99 COMMON.CHAIN + + +so#100 COMMON.FFIELD + + +so#101 COMMON.SBRIDGE + + +so#102 COMMON.HEADER + + +so#103 COMMON.CONTROL + + +so#104 COMMON.DBASE + + +so#105 COMMON.THREAD + + +so#106 COMMON.TIME1 + + +so#107 DIMENSIONS + + +so#108 COMMON.IOUNITS + + +so#109 COMMON.GEO + + +so#110 COMMON.VAR + + +so#111 COMMON.INTERACT + + +so#112 COMMON.LOCAL + + +so#113 COMMON.NAMES + + +so#114 COMMON.CHAIN + + +so#115 COMMON.FFIELD + + +so#116 COMMON.SBRIDGE + + +so#117 COMMON.HEADER + + +so#118 COMMON.CONTROL + + +so#119 COMMON.DBASE + + +so#120 COMMON.THREAD + + +so#121 COMMON.TIME1 + + +so#122 DIMENSIONS + + +so#123 COMMON.IOUNITS + + +so#124 COMMON.GEO + + +so#125 COMMON.VAR + + +so#126 COMMON.INTERACT + + +so#127 COMMON.LOCAL + + +so#128 COMMON.NAMES + + +so#129 COMMON.CHAIN + + +so#130 COMMON.FFIELD + + +so#131 COMMON.SBRIDGE + + +so#132 COMMON.HEADER + + +so#133 COMMON.CONTROL + + +so#134 COMMON.DBASE + + +so#135 COMMON.THREAD + + +so#136 COMMON.TIME1 + + +so#137 DIMENSIONS + + +so#138 COMMON.MAP + + +so#139 COMMON.IOUNITS + + +so#140 DIMENSIONS + + +so#141 COMMON.IOUNITS + + +so#142 COMMON.GEO + + +so#143 COMMON.CSA + + +so#144 COMMON.BANK + + +so#145 COMMON.CONTROL + + +so#146 DIMENSIONS + + +so#147 COMMON.MCM + + +so#148 COMMON.MCE + + +so#149 COMMON.IOUNITS + + +so#150 DIMENSIONS + + +so#151 COMMON.MINIM + + +so#152 COMMON.IOUNITS + + +so#153 DIMENSIONS + + +so#154 COMMON.GEO + + +so#155 COMMON.VAR + + +so#156 COMMON.CHAIN + + +so#157 COMMON.IOUNITS + + +so#158 COMMON.CONTROL + + +so#159 DIMENSIONS + + +so#160 mpif.h + + +so#161 COMMON.SETUP + + +so#162 COMMON.IOUNITS + + +so#163 COMMON.MD + + +so#164 COMMON.CONTROL + + +so#165 DIMENSIONS + + +so#166 COMMON.IOUNITS + + +so#167 DIMENSIONS + + +so#168 COMMON.CHAIN + + +so#169 COMMON.IOUNITS + + +so#170 COMMON.MD + + +so#171 DIMENSIONS + + +so#172 mpif.h + + +so#173 COMMON.SETUP + + +so#174 COMMON.CHAIN + + +so#175 COMMON.IOUNITS + + +so#176 COMMON.MD + + +so#177 COMMON.CONTROL + + +so#178 DIMENSIONS + + +so#179 mpif.h + + +so#180 COMMON.SETUP + + +so#181 COMMON.CONTROL + + +so#182 COMMON.CHAIN + + +so#183 COMMON.IOUNITS + + +so#184 COMMON.SBRIDGE + + +so#185 DIMENSIONS + + +so#186 COMMON.IOUNITS + + +so#187 DIMENSIONS + + +so#188 COMMON.IOUNITS + + +so#189 DIMENSIONS + + +so#190 mpif.h + + +so#191 COMMON.IOUNITS + + +so#192 COMMON.TIME1 + + +so#193 COMMON.THREAD + + +so#194 COMMON.SBRIDGE + + +so#195 COMMON.CONTROL + + +so#196 COMMON.MCM + + +so#197 COMMON.MAP + + +so#198 COMMON.HEADER + + +so#199 COMMON.CSA + + +so#200 COMMON.CHAIN + + +so#201 COMMON.MUCA + + +so#202 COMMON.MD + + +so#203 COMMON.FFIELD + + +so#204 COMMON.SETUP + + +ro#1 READRTNS +rloc so#1 1 18 +rlink f90 +rkind fext +rstart so#1 13 7 +rstmt st#0 fsingle_if so#1 17 7 so#1 17 32 st#1 NA +rstmt st#1 fsingle_if so#1 19 7 so#1 19 56 st#2 NA +rstmt st#2 fsingle_if so#1 21 7 so#1 21 41 st#3 NA +rstmt st#3 fif so#1 23 7 so#1 26 11 st#4 NA +rstmt st#4 fsingle_if so#1 28 7 so#1 28 31 st#5 NA +rstmt st#6 fio so#1 32 8 so#1 32 48 st#7 NA +rstmt st#7 fsingle_if so#1 33 8 so#1 33 40 NA NA +rstmt st#5 fif so#1 31 7 so#1 34 12 st#8 st#6 +rstmt st#10 fio so#1 44 7 so#1 45 48 NA NA +rstmt st#9 fsingle_if so#1 43 7 so#1 45 48 st#11 st#10 +rstmt st#12 fio so#1 47 9 so#1 47 66 NA NA +rstmt st#11 fdo so#1 46 7 so#1 48 11 NA st#12 +rstmt st#8 fif so#1 41 7 so#1 50 11 st#13 st#9 +rstmt st#13 freturn so#1 53 7 so#1 53 12 st#14 NA +rstmt st#14 freturn so#1 54 7 so#1 54 9 NA NA +rbody st#0 + +ro#2 READ_CONTROL +rloc so#1 56 18 +rlink f90 +rkind fext +rstart so#1 86 7 +rstmt st#0 fassign so#1 86 7 so#1 86 17 st#1 NA +rstmt st#1 fassign so#1 87 7 so#1 87 20 st#2 NA +rstmt st#2 fassign so#1 88 7 so#1 88 16 st#3 NA +rstmt st#3 fio so#1 89 7 so#1 89 28 st#4 NA +rstmt st#4 fassign so#1 96 7 so#1 96 51 st#5 NA +rstmt st#5 fassign so#1 97 7 so#1 97 57 st#6 NA +rstmt st#6 fassign so#1 100 7 so#1 100 55 st#7 NA +rstmt st#8 fio so#1 108 8 so#1 108 50 st#9 NA +rstmt st#9 fio so#1 109 8 so#1 109 52 st#10 NA +rstmt st#10 fio so#1 110 8 so#1 110 58 st#11 NA +rstmt st#11 fio so#1 111 8 so#1 111 49 st#12 NA +rstmt st#12 fio so#1 112 8 so#1 112 52 st#13 NA +rstmt st#13 fio so#1 113 8 so#1 113 58 NA NA +rstmt st#7 fif so#1 107 7 so#1 114 11 st#14 st#8 +rstmt st#14 fassign so#1 118 7 so#1 118 26 st#15 NA +rstmt st#15 fassign so#1 119 7 so#1 119 28 st#16 NA +rstmt st#16 fassign so#1 120 7 so#1 120 18 st#17 NA +rstmt st#17 fassign so#1 121 7 so#1 121 16 st#18 NA +rstmt st#18 fassign so#1 123 7 so#1 123 48 st#19 NA +rstmt st#19 fassign so#1 124 7 so#1 124 45 st#20 NA +rstmt st#20 fassign so#1 125 7 so#1 125 51 st#21 NA +rstmt st#21 fassign so#1 126 7 so#1 126 30 st#22 NA +rstmt st#22 fassign so#1 127 7 so#1 127 53 st#23 NA +rstmt st#23 fassign so#1 128 7 so#1 128 28 st#24 NA +rstmt st#24 fassign so#1 129 7 so#1 129 49 st#25 NA +rstmt st#25 fassign so#1 130 7 so#1 130 55 st#26 NA +rstmt st#26 fassign so#1 131 7 so#1 131 47 st#27 NA +rstmt st#27 fassign so#1 132 7 so#1 132 49 st#28 NA +rstmt st#28 fassign so#1 133 7 so#1 133 47 st#29 NA +rstmt st#29 fassign so#1 134 7 so#1 134 59 st#30 NA +rstmt st#30 fassign so#1 135 7 so#1 135 42 st#31 NA +rstmt st#31 fassign so#1 136 7 so#1 136 49 st#32 NA +rstmt st#33 fio so#1 143 8 so#1 143 49 NA NA +rstmt st#32 fsingle_if so#1 142 7 so#1 143 49 st#34 st#33 +rstmt st#35 fassign so#1 146 9 so#1 146 18 st#36 NA +rstmt st#36 fassign so#1 147 9 so#1 147 21 NA NA +rstmt st#34 fif so#1 144 7 so#1 148 11 st#37 st#35 +rstmt st#38 fassign so#1 150 9 so#1 150 18 st#39 NA +rstmt st#40 fassign so#1 152 11 so#1 152 22 NA NA +rstmt st#42 fassign so#1 154 11 so#1 154 22 NA NA +rstmt st#43 fassign so#1 156 11 so#1 156 22 NA NA +rstmt st#41 fif so#1 153 9 so#1 157 13 NA st#42 st#43 +rstmt st#39 fif so#1 151 9 so#1 157 13 NA st#40 st#41 +rstmt st#45 fassign so#1 159 9 so#1 159 18 st#46 NA +rstmt st#48 fio so#1 165 11 so#1 165 72 NA NA +rstmt st#47 fsingle_if so#1 164 11 so#1 165 72 st#49 st#48 +rstmt st#49 fstop so#1 166 11 NULL 0 0 NA NA +rstmt st#46 fif so#1 161 9 so#1 167 13 NA NA st#47 +rstmt st#51 fassign so#1 169 9 so#1 169 18 NA NA +rstmt st#53 fassign so#1 171 9 so#1 171 18 NA NA +rstmt st#55 fassign so#1 173 9 so#1 173 18 NA NA +rstmt st#57 fassign so#1 175 9 so#1 175 18 NA NA +rstmt st#59 fassign so#1 178 9 so#1 178 18 NA NA +rstmt st#61 fassign so#1 187 9 so#1 187 19 NA NA +rstmt st#63 fassign so#1 189 9 so#1 189 19 NA NA +rstmt st#65 fassign so#1 191 9 so#1 191 19 NA NA +rstmt st#67 fassign so#1 193 9 so#1 193 19 NA NA +rstmt st#69 fassign so#1 195 9 so#1 195 19 NA NA +rstmt st#68 fif so#1 194 7 so#1 196 11 NA st#69 +rstmt st#66 fif so#1 192 7 so#1 196 11 NA st#67 st#68 +rstmt st#64 fif so#1 190 7 so#1 196 11 NA st#65 st#66 +rstmt st#62 fif so#1 188 7 so#1 196 11 NA st#63 st#64 +rstmt st#60 fif so#1 186 7 so#1 196 11 NA st#61 st#62 +rstmt st#58 fif so#1 177 7 so#1 196 11 NA st#59 st#60 +rstmt st#56 fif so#1 174 7 so#1 196 11 NA st#57 st#58 +rstmt st#54 fif so#1 172 7 so#1 196 11 NA st#55 st#56 +rstmt st#52 fif so#1 170 7 so#1 196 11 NA st#53 st#54 +rstmt st#50 fif so#1 168 7 so#1 196 11 NA st#51 st#52 +rstmt st#44 fif so#1 158 7 so#1 196 11 NA st#45 st#50 +rstmt st#37 fif so#1 149 7 so#1 196 11 st#70 st#38 st#44 +rstmt st#70 fassign so#1 198 7 so#1 198 42 st#71 NA +rstmt st#72 fio so#1 203 8 so#1 203 40 st#73 NA +rstmt st#73 fio so#1 204 8 so#1 204 47 NA NA +rstmt st#71 fif so#1 201 7 so#1 205 11 st#74 st#72 +rstmt st#74 fassign so#1 207 7 so#1 207 44 st#75 NA +rstmt st#75 fassign so#1 208 7 so#1 208 37 st#76 NA +rstmt st#76 fassign so#1 209 7 so#1 209 39 st#77 NA +rstmt st#77 fassign so#1 210 7 so#1 210 45 st#78 NA +rstmt st#78 fassign so#1 211 7 so#1 211 47 st#79 NA +rstmt st#79 fassign so#1 212 7 so#1 212 47 st#80 NA +rstmt st#80 fassign so#1 213 7 so#1 213 55 st#81 NA +rstmt st#82 fio so#1 216 8 so#1 217 48 NA NA +rstmt st#81 fsingle_if so#1 215 7 so#1 217 48 st#83 st#82 +rstmt st#83 freturn so#1 218 7 so#1 218 12 st#84 NA +rstmt st#84 freturn so#1 219 7 so#1 219 9 NA NA +rbody st#0 + +ro#3 READ_REMDPAR +rloc so#1 221 18 +rlink f90 +rkind fext +rstart so#1 246 7 +rstmt st#1 fio so#1 247 8 so#1 247 34 NA NA +rstmt st#0 fsingle_if so#1 246 7 so#1 247 34 st#2 st#1 +rstmt st#2 fassign so#1 254 7 so#1 254 48 st#3 NA +rstmt st#3 fassign so#1 256 7 so#1 256 56 st#4 NA +rstmt st#4 fassign so#1 257 7 so#1 257 53 st#5 NA +rstmt st#6 fassign so#1 260 18 so#1 260 50 NA NA +rstmt st#5 fsingle_if so#1 259 7 so#1 260 50 st#7 st#6 +rstmt st#8 fio so#1 268 8 so#1 268 35 st#9 NA +rstmt st#9 fio so#1 269 8 so#1 269 37 st#10 NA +rstmt st#10 fio so#1 270 8 so#1 270 41 st#11 NA +rstmt st#11 fio so#1 271 8 so#1 271 42 st#12 NA +rstmt st#12 fio so#1 272 8 so#1 272 54 NA NA +rstmt st#7 fif so#1 261 7 so#1 273 11 st#13 st#8 +rstmt st#13 fassign so#1 274 7 so#1 274 24 st#14 NA +rstmt st#15 fassign so#1 276 10 so#1 276 26 st#16 NA +rstmt st#16 fio so#1 278 10 so#1 278 51 st#17 NA +rstmt st#18 fio so#1 280 11 so#1 280 53 NA NA +rstmt st#17 fsingle_if so#1 279 10 so#1 280 53 NA st#18 +rstmt st#14 fif so#1 275 7 so#1 281 11 st#19 st#15 +rstmt st#19 fassign so#1 282 7 so#1 282 24 st#20 NA +rstmt st#21 fassign so#1 284 10 so#1 284 26 st#22 NA +rstmt st#22 fio so#1 286 10 so#1 286 52 st#23 NA +rstmt st#24 fio so#1 288 11 so#1 288 52 st#25 NA +rstmt st#25 fassign so#1 289 11 so#1 289 25 st#26 NA +rstmt st#27 fassign so#1 291 12 so#1 291 48 NA NA +rstmt st#26 fdo so#1 290 11 so#1 292 15 st#28 st#27 +rstmt st#28 fio so#1 293 11 so#1 293 66 NA NA +rstmt st#23 fif so#1 287 10 so#1 294 14 NA st#24 +rstmt st#20 fif so#1 283 7 so#1 295 11 st#29 st#21 +rstmt st#30 fio so#1 297 8 so#1 297 69 NA NA +rstmt st#29 fsingle_if so#1 296 7 so#1 297 69 st#31 st#30 +rstmt st#31 freturn so#1 298 7 so#1 298 12 st#32 NA +rstmt st#32 freturn so#1 299 7 so#1 299 9 NA NA +rbody st#0 + +ro#4 READ_MDPAR +rloc so#1 301 18 +rlink f90 +rkind fext +rstart so#1 324 7 +rstmt st#0 fassign so#1 333 7 so#1 333 47 st#1 NA +rstmt st#1 fassign so#1 335 7 so#1 335 30 st#2 NA +rstmt st#2 fassign so#1 337 7 so#1 337 30 st#3 NA +rstmt st#3 fassign so#1 340 7 so#1 340 43 st#4 NA +rstmt st#4 fassign so#1 341 7 so#1 341 41 st#5 NA +rstmt st#5 fassign so#1 342 7 so#1 342 47 st#6 NA +rstmt st#6 fassign so#1 343 7 so#1 343 45 st#7 NA +rstmt st#8 fassign so#1 348 36 so#1 348 64 NA NA +rstmt st#7 fsingle_if so#1 348 7 so#1 348 64 st#9 st#8 +rstmt st#9 fassign so#1 350 7 so#1 350 68 st#10 NA +rstmt st#10 fassign so#1 351 7 so#1 351 62 st#11 NA +rstmt st#12 fassign so#1 352 33 so#1 352 58 NA NA +rstmt st#11 fsingle_if so#1 352 7 so#1 352 58 st#13 st#12 +rstmt st#13 fassign so#1 353 7 so#1 353 45 st#14 NA +rstmt st#14 fassign so#1 354 7 so#1 354 59 st#15 NA +rstmt st#15 fassign so#1 355 7 so#1 355 47 st#16 NA +rstmt st#16 fassign so#1 357 7 so#1 357 12 st#17 NA +rstmt st#17 fif so#1 358 7 so#1 360 11 st#18 NA +rstmt st#19 fio so#1 363 8 so#1 363 21 st#20 NA +rstmt st#20 fio so#1 364 8 so#1 364 72 st#21 NA +rstmt st#21 fio so#1 365 8 so#1 365 21 st#22 NA +rstmt st#22 fio so#1 366 8 so#1 366 42 st#23 NA +rstmt st#23 fio so#1 367 8 so#1 367 62 st#24 NA +rstmt st#24 fio so#1 368 8 so#1 369 46 st#25 NA +rstmt st#25 fio so#1 370 8 so#1 370 60 st#26 NA +rstmt st#26 fio so#1 371 8 so#1 371 21 st#27 NA +rstmt st#27 fio so#1 372 8 so#1 372 66 st#28 NA +rstmt st#28 fio so#1 373 8 so#1 375 24 st#29 NA +rstmt st#29 fio so#1 376 8 so#1 376 53 st#30 NA +rstmt st#31 fio so#1 378 9 so#1 380 64 st#32 NA +rstmt st#32 fio so#1 381 9 so#1 382 30 NA NA +rstmt st#30 fif so#1 377 8 so#1 383 12 st#33 st#31 +rstmt st#33 fio so#1 384 8 so#1 386 39 st#34 NA +rstmt st#34 fio so#1 387 8 so#1 389 43 st#35 NA +rstmt st#35 fio so#1 390 8 so#1 391 63 st#36 NA +rstmt st#36 fio so#1 392 8 so#1 392 68 st#37 NA +rstmt st#37 fio so#1 393 8 so#1 393 70 st#38 NA +rstmt st#39 fio so#1 394 20 so#1 395 62 NA NA +rstmt st#38 fsingle_if so#1 394 8 so#1 395 62 NA st#39 +rstmt st#18 fif so#1 362 7 so#1 396 11 st#40 st#19 +rstmt st#40 fassign so#1 397 7 so#1 397 24 st#41 NA +rstmt st#42 fassign so#1 402 9 so#1 402 51 st#43 NA +rstmt st#44 fio so#1 405 10 so#1 405 62 st#45 NA +rstmt st#46 fio so#1 407 11 so#1 408 62 NA NA +rstmt st#48 fio so#1 410 11 so#1 410 68 NA NA +rstmt st#50 fio so#1 412 11 so#1 412 72 NA NA +rstmt st#52 fio so#1 414 11 so#1 414 51 NA NA +rstmt st#53 fio so#1 416 11 so#1 417 69 st#54 NA +rstmt st#54 fstop so#1 418 11 NULL 0 0 NA NA +rstmt st#51 fif so#1 413 10 so#1 419 14 NA st#52 st#53 +rstmt st#49 fif so#1 411 10 so#1 419 14 NA st#50 st#51 +rstmt st#47 fif so#1 409 10 so#1 419 14 NA st#48 st#49 +rstmt st#45 fif so#1 406 10 so#1 419 14 st#55 st#46 st#47 +rstmt st#55 fio so#1 420 10 so#1 420 57 st#56 NA +rstmt st#56 fio so#1 421 10 so#1 421 70 st#57 NA +rstmt st#57 fio so#1 422 10 so#1 422 70 st#58 NA +rstmt st#58 fio so#1 423 10 so#1 424 59 st#59 NA +rstmt st#60 fio so#1 425 24 so#1 427 56 NA NA +rstmt st#59 fsingle_if so#1 425 10 so#1 427 56 NA st#60 +rstmt st#43 fif so#1 404 9 so#1 428 13 st#61 st#44 +rstmt st#61 fassign so#1 430 9 so#1 430 30 st#62 NA +rstmt st#63 fio so#1 432 10 so#1 433 13 NA NA +rstmt st#62 fsingle_if so#1 431 9 so#1 433 13 st#64 st#63 +rstmt st#64 fassign so#1 434 9 so#1 434 39 st#65 NA +rstmt st#65 fassign so#1 435 9 so#1 435 39 st#66 NA +rstmt st#67 fassign so#1 437 11 so#1 437 51 st#68 NA +rstmt st#68 fassign so#1 438 11 so#1 438 45 NA NA +rstmt st#66 fdo so#1 436 9 so#1 439 14 st#69 st#67 +rstmt st#70 fio so#1 441 10 so#1 443 52 st#71 NA +rstmt st#71 fio so#1 444 10 so#1 444 72 st#72 NA +rstmt st#73 fio so#1 446 11 so#1 447 45 NA NA +rstmt st#72 fdo so#1 445 10 so#1 448 14 NA st#73 +rstmt st#69 fif so#1 440 9 so#1 449 13 NA st#70 +rstmt st#76 fio so#1 452 10 so#1 452 56 st#77 NA +rstmt st#77 fio so#1 453 10 so#1 453 57 st#78 NA +rstmt st#78 fio so#1 454 10 so#1 454 71 st#79 NA +rstmt st#80 fio so#1 456 10 so#1 457 36 NA NA +rstmt st#79 fsingle_if so#1 455 10 so#1 457 36 st#81 st#80 +rstmt st#82 fio so#1 459 11 so#1 461 17 NA NA +rstmt st#81 fsingle_if so#1 458 10 so#1 461 17 NA st#82 +rstmt st#75 fif so#1 451 9 so#1 462 13 NA st#76 +rstmt st#84 fio so#1 465 10 so#1 465 63 NA NA +rstmt st#83 fsingle_if so#1 464 9 so#1 465 63 NA st#84 +rstmt st#74 fif so#1 450 7 so#1 466 11 NA st#75 st#83 +rstmt st#41 fif so#1 398 7 so#1 466 11 st#85 st#42 st#74 +rstmt st#87 fio so#1 468 18 so#1 468 72 NA NA +rstmt st#86 fsingle_if so#1 468 8 so#1 468 72 st#88 st#87 +rstmt st#89 fio so#1 470 11 so#1 470 54 st#90 NA +rstmt st#90 fio so#1 471 11 so#1 471 65 st#91 NA +rstmt st#91 fio so#1 472 11 so#1 472 60 st#92 NA +rstmt st#92 fio so#1 473 11 so#1 473 65 st#93 NA +rstmt st#94 fio so#1 475 12 so#1 475 52 st#95 NA +rstmt st#96 fio so#1 477 15 so#1 478 62 NA NA +rstmt st#95 fdo so#1 476 12 so#1 479 16 st#97 st#96 +rstmt st#97 fio so#1 480 12 so#1 480 68 st#98 NA +rstmt st#98 fio so#1 481 12 so#1 481 60 st#99 NA +rstmt st#100 fio so#1 483 13 so#1 484 64 NA NA +rstmt st#99 fdo so#1 482 12 so#1 485 16 st#101 st#100 +rstmt st#101 fio so#1 486 12 so#1 487 33 st#102 NA +rstmt st#102 fio so#1 488 12 so#1 488 45 st#103 NA +rstmt st#104 fio so#1 490 13 so#1 492 56 NA NA +rstmt st#103 fdo so#1 489 12 so#1 493 16 NA st#104 +rstmt st#93 fdo so#1 474 11 so#1 494 15 st#105 st#94 +rstmt st#105 fassign so#1 495 9 so#1 495 30 NA NA +rstmt st#88 fif so#1 469 8 so#1 496 12 NA st#89 +rstmt st#85 fif so#1 467 7 so#1 497 11 st#106 st#86 +rstmt st#107 fio so#1 499 8 so#1 499 67 NA NA +rstmt st#106 fsingle_if so#1 498 7 so#1 499 67 st#108 st#107 +rstmt st#108 freturn so#1 500 7 so#1 500 12 st#109 NA +rstmt st#109 freturn so#1 501 7 so#1 501 9 NA NA +rbody st#0 + +ro#5 MOLREAD +rloc so#1 503 18 +rlink f90 +rkind fext +rstart so#1 546 7 +rstmt st#1 fassign so#1 571 42 so#1 571 47 NA NA +rstmt st#0 fsingle_if so#1 571 7 so#1 571 47 st#2 st#1 +rstmt st#3 fassign so#1 574 28 so#1 574 39 NA NA +rstmt st#2 fsingle_if so#1 574 7 so#1 574 39 st#4 st#3 +rstmt st#4 fassign so#1 575 7 so#1 575 20 st#5 NA +rstmt st#5 fassign so#1 576 7 so#1 576 21 st#6 NA +rstmt st#6 fassign so#1 577 7 so#1 577 22 st#7 NA +rstmt st#7 fassign so#1 578 7 so#1 578 22 st#8 NA +rstmt st#8 fassign so#1 579 7 so#1 579 23 st#9 NA +rstmt st#9 fassign so#1 580 7 so#1 580 23 st#10 NA +rstmt st#10 fassign so#1 581 7 so#1 581 24 st#11 NA +rstmt st#11 fassign so#1 582 7 so#1 582 23 st#12 NA +rstmt st#12 fassign so#1 583 7 so#1 583 23 st#13 NA +rstmt st#13 fassign so#1 584 7 so#1 584 24 st#14 NA +rstmt st#14 fassign so#1 585 7 so#1 585 22 st#15 NA +rstmt st#15 fassign so#1 586 7 so#1 586 24 st#16 NA +rstmt st#16 fassign so#1 587 7 so#1 587 22 st#17 NA +rstmt st#17 fassign so#1 588 7 so#1 588 24 st#18 NA +rstmt st#18 fassign so#1 589 7 so#1 589 25 st#19 NA +rstmt st#19 fassign so#1 590 7 so#1 590 24 st#20 NA +rstmt st#20 fassign so#1 591 7 so#1 591 23 st#21 NA +rstmt st#21 fassign so#1 592 7 so#1 592 24 st#22 NA +rstmt st#22 fassign so#1 593 7 so#1 593 24 st#23 NA +rstmt st#24 fio so#1 595 8 so#1 597 21 NA NA +rstmt st#23 fsingle_if so#1 594 7 so#1 597 21 st#25 st#24 +rstmt st#25 flabel so#1 598 1 NULL 0 0 st#26 NA +rstmt st#28 fio so#1 619 9 so#1 620 50 st#29 NA +rstmt st#29 fio so#1 621 9 so#1 623 64 NA NA +rstmt st#31 fio so#1 625 9 so#1 626 50 NA NA +rstmt st#30 fif so#1 624 8 so#1 627 12 NA st#31 +rstmt st#27 fif so#1 618 8 so#1 627 12 st#32 st#28 st#30 +rstmt st#32 fio so#1 628 8 so#1 629 57 st#33 NA +rstmt st#33 fio so#1 630 8 so#1 631 62 NA NA +rstmt st#26 fif so#1 617 7 so#1 632 11 st#34 st#27 +rstmt st#34 fassign so#1 633 7 so#1 633 35 st#35 NA +rstmt st#36 fassign so#1 635 9 so#1 635 33 st#37 NA +rstmt st#37 fassign so#1 636 9 so#1 636 33 st#38 NA +rstmt st#38 fassign so#1 637 9 so#1 637 33 st#39 NA +rstmt st#39 fassign so#1 638 9 so#1 638 33 NA NA +rstmt st#35 fdo so#1 634 7 so#1 639 11 st#40 st#36 +rstmt st#41 fio so#1 642 8 so#1 644 21 NA NA +rstmt st#40 fsingle_if so#1 641 7 so#1 644 21 st#42 st#41 +rstmt st#42 flabel so#1 645 1 NULL 0 0 st#43 NA +rstmt st#44 fio so#1 665 8 so#1 666 13 NA NA +rstmt st#43 fsingle_if so#1 664 7 so#1 666 13 st#45 st#44 +rstmt st#46 fio so#1 676 8 so#1 676 60 st#47 NA +rstmt st#47 fio so#1 677 8 so#1 678 19 st#48 NA +rstmt st#48 fio so#1 679 8 so#1 679 59 st#49 NA +rstmt st#49 fio so#1 680 8 so#1 680 31 st#50 NA +rstmt st#50 fio so#1 681 8 so#1 681 49 NA NA +rstmt st#45 fif so#1 675 7 so#1 682 11 st#51 st#46 +rstmt st#52 fio so#1 684 9 so#1 684 31 st#53 NA +rstmt st#54 fio so#1 686 10 so#1 686 71 NA NA +rstmt st#53 fsingle_if so#1 685 9 so#1 686 71 st#55 st#54 +rstmt st#55 fio so#1 687 9 so#1 687 53 st#56 NA +rstmt st#57 flabel so#1 689 1 NULL 0 0 st#58 NA +rstmt st#58 fio so#1 689 3 so#1 689 52 st#59 NA +rstmt st#59 fstop so#1 690 9 NULL 0 0 st#60 NA +rstmt st#56 fgoto so#1 688 9 so#1 688 16 st#57 NA st#60 +rstmt st#60 flabel so#1 691 1 NULL 0 0 st#61 NA +rstmt st#62 fio so#1 696 10 so#1 696 72 NA NA +rstmt st#61 fsingle_if so#1 695 9 so#1 696 72 st#63 st#62 +rstmt st#64 fassign so#1 698 11 so#1 698 31 NA NA +rstmt st#63 fdo so#1 697 9 so#1 699 13 st#65 st#64 +rstmt st#65 fio so#1 700 9 so#1 700 22 st#66 NA +rstmt st#66 fassign so#1 701 9 so#1 701 22 st#67 NA +rstmt st#67 fassign so#1 702 9 so#1 702 29 st#68 NA +rstmt st#70 fio so#1 707 11 so#1 707 42 NA NA +rstmt st#69 fsingle_if so#1 706 10 so#1 707 42 st#71 st#70 +rstmt st#71 fassign so#1 708 10 so#1 708 19 st#72 NA +rstmt st#73 fassign so#1 710 11 so#1 710 22 st#74 NA +rstmt st#75 fassign so#1 712 13 so#1 712 17 st#76 NA +rstmt st#76 fassign so#1 713 13 so#1 713 23 st#77 NA +rstmt st#78 fassign so#1 716 15 so#1 716 23 NA NA +rstmt st#77 fdo so#1 714 13 so#1 717 17 st#79 st#78 +rstmt st#80 fio so#1 718 22 so#1 719 45 NA NA +rstmt st#79 fsingle_if so#1 718 13 so#1 719 45 NA st#80 +rstmt st#74 fif so#1 711 11 so#1 720 15 NA st#75 +rstmt st#72 fdo so#1 709 10 so#1 721 14 NA st#73 +rstmt st#68 fif so#1 705 9 so#1 722 15 NA st#69 +rstmt st#51 fif so#1 683 7 so#1 723 11 st#81 st#52 +rstmt st#82 fio so#1 726 9 so#1 726 25 st#83 NA +rstmt st#84 fio so#1 729 11 so#1 729 57 NA NA +rstmt st#85 fio so#1 731 11 so#1 731 57 NA NA +rstmt st#83 fif so#1 728 9 so#1 732 13 st#86 st#84 st#85 +rstmt st#87 fassign so#1 735 11 so#1 735 48 NA NA +rstmt st#86 fdo so#1 734 9 so#1 736 13 st#88 st#87 +rstmt st#89 fassign so#1 739 11 so#1 739 21 st#90 NA +rstmt st#90 fassign so#1 740 11 so#1 740 28 NA NA +rstmt st#88 fdo so#1 738 9 so#1 741 13 st#91 st#89 +rstmt st#92 fassign so#1 743 11 so#1 743 36 st#93 NA +rstmt st#93 fassign so#1 744 11 so#1 744 44 NA NA +rstmt st#91 fdo so#1 742 9 so#1 747 13 NA st#92 +rstmt st#81 fif so#1 724 7 so#1 748 12 st#94 st#82 +rstmt st#96 fassign so#1 757 11 so#1 757 19 NA NA +rstmt st#98 fassign so#1 763 4 so#1 763 12 NA NA +rstmt st#99 fassign so#1 765 4 so#1 765 12 NA NA +rstmt st#97 fif so#1 759 9 so#1 766 15 NA st#98 st#99 +rstmt st#95 fif so#1 753 9 so#1 766 15 NA st#96 st#97 +rstmt st#94 fdo so#1 751 7 so#1 767 11 st#100 st#95 +rstmt st#101 fio so#1 769 8 so#1 769 28 st#102 NA +rstmt st#103 fio so#1 771 10 so#1 771 42 NA NA +rstmt st#102 fdo so#1 770 8 so#1 772 12 st#104 st#103 +rstmt st#104 fio so#1 773 8 so#1 773 34 NA NA +rstmt st#100 fif so#1 768 7 so#1 774 11 st#105 st#101 +rstmt st#106 fassign so#1 778 9 so#1 778 25 st#107 NA +rstmt st#107 fassign so#1 779 9 so#1 779 24 NA NA +rstmt st#105 fdo so#1 777 7 so#1 780 11 st#108 st#106 +rstmt st#108 fio so#1 781 7 so#1 781 30 st#109 NA +rstmt st#110 fio so#1 783 9 so#1 783 26 st#111 NA +rstmt st#111 fio so#1 784 9 so#1 784 71 st#112 NA +rstmt st#113 fio so#1 786 10 so#1 787 62 st#114 NA +rstmt st#115 fio so#1 789 11 so#1 789 68 NA NA +rstmt st#114 fdo so#1 788 10 so#1 790 14 NA st#115 +rstmt st#112 fif so#1 785 9 so#1 791 13 st#116 st#113 +rstmt st#117 fassign so#1 793 11 so#1 793 33 st#118 NA +rstmt st#118 fassign so#1 794 11 so#1 794 37 NA NA +rstmt st#116 fdo so#1 792 9 so#1 795 13 st#119 st#117 +rstmt st#120 fio so#1 797 10 so#1 797 37 NA NA +rstmt st#119 fsingle_if so#1 796 9 so#1 797 37 st#121 st#120 +rstmt st#122 fassign so#1 799 11 so#1 799 29 st#123 NA +rstmt st#123 fassign so#1 800 11 so#1 800 44 st#124 NA +rstmt st#124 fassign so#1 801 11 so#1 801 44 NA NA +rstmt st#121 fdo so#1 798 9 so#1 802 14 NA st#122 +rstmt st#109 fif so#1 782 7 so#1 803 11 st#125 st#110 +rstmt st#125 fassign so#1 804 7 so#1 804 11 st#126 NA +rstmt st#127 fio so#1 808 8 so#1 808 61 st#128 NA +rstmt st#129 fio so#1 810 10 so#1 811 71 NA NA +rstmt st#128 fdo so#1 809 8 so#1 812 12 NA st#129 +rstmt st#126 fif so#1 806 7 so#1 814 11 st#130 st#127 +rstmt st#130 fassign so#1 816 7 so#1 816 14 st#131 NA +rstmt st#132 fassign so#1 818 27 so#1 818 31 NA NA +rstmt st#131 fsingle_if so#1 818 7 so#1 818 31 st#133 st#132 +rstmt st#134 fassign so#1 819 30 so#1 819 38 NA NA +rstmt st#133 fsingle_if so#1 819 7 so#1 819 38 st#135 st#134 +rstmt st#137 fio so#1 822 10 so#1 822 43 NA NA +rstmt st#136 fsingle_if so#1 821 9 so#1 822 43 st#138 st#137 +rstmt st#138 fassign so#1 823 9 so#1 823 22 st#139 NA +rstmt st#142 fassign so#1 827 15 so#1 827 30 st#143 NA +rstmt st#141 fif so#1 826 13 so#1 829 17 NA st#142 +rstmt st#140 fdo so#1 825 11 so#1 830 15 st#144 st#141 +rstmt st#144 fio so#1 831 11 so#1 832 68 st#145 NA +rstmt st#145 fstop so#1 833 11 NULL 0 0 NA NA +rstmt st#148 fassign so#1 838 15 so#1 838 37 st#149 NA +rstmt st#149 fassign so#1 839 15 so#1 839 28 st#150 NA +rstmt st#147 fif so#1 836 13 so#1 841 17 NA st#148 +rstmt st#146 fdo so#1 835 11 so#1 842 16 st#151 st#147 +rstmt st#151 fio so#1 843 11 so#1 844 68 NA NA +rstmt st#139 fif so#1 824 9 so#1 845 13 st#152 st#140 st#146 +rstmt st#150 fgoto so#1 840 15 so#1 840 22 NA NA st#152 +rstmt st#143 fgoto so#1 828 15 so#1 828 22 NA NA st#152 +rstmt st#152 flabel so#1 846 1 NULL 0 0 st#153 NA +rstmt st#154 fassign so#1 847 24 so#1 847 35 NA NA +rstmt st#153 fsingle_if so#1 847 9 so#1 847 35 st#155 st#154 +rstmt st#156 fassign so#1 848 30 so#1 848 43 NA NA +rstmt st#155 fsingle_if so#1 848 9 so#1 848 43 st#157 st#156 +rstmt st#158 fassign so#1 849 30 so#1 849 43 NA NA +rstmt st#157 fsingle_if so#1 849 9 so#1 849 43 st#159 st#158 +rstmt st#160 fio so#1 851 10 so#1 852 48 NA NA +rstmt st#159 fsingle_if so#1 850 9 so#1 852 48 NA st#160 +rstmt st#135 fif so#1 820 7 so#1 853 11 st#161 st#136 +rstmt st#162 fassign so#1 855 26 so#1 855 37 NA NA +rstmt st#161 fsingle_if so#1 855 7 so#1 855 37 st#163 st#162 +rstmt st#164 fassign so#1 857 9 so#1 857 25 NA NA +rstmt st#166 fassign so#1 859 9 so#1 859 18 NA NA +rstmt st#165 fif so#1 858 7 so#1 860 11 NA st#166 +rstmt st#163 fif so#1 856 7 so#1 860 11 st#167 st#164 st#165 +rstmt st#168 fio so#1 862 8 so#1 862 60 st#169 NA +rstmt st#169 fio so#1 863 8 so#1 863 36 NA NA +rstmt st#167 fif so#1 861 7 so#1 864 11 st#170 st#168 +rstmt st#173 flabel so#1 871 1 NULL 0 0 st#174 NA +rstmt st#174 fio so#1 871 4 so#1 871 65 st#175 NA +rstmt st#175 fstop so#1 874 11 NULL 0 0 st#176 NA +rstmt st#172 fgoto so#1 870 11 so#1 870 17 st#173 NA st#176 +rstmt st#176 flabel so#1 876 1 NULL 0 0 st#177 NA +rstmt st#177 fassign so#1 879 11 so#1 879 24 st#178 NA +rstmt st#178 fassign so#1 880 11 so#1 880 24 st#179 NA +rstmt st#179 fassign so#1 881 11 so#1 881 24 st#180 NA +rstmt st#182 fassign so#1 884 15 so#1 884 30 NA NA +rstmt st#181 fdo so#1 883 13 so#1 885 17 NA st#182 +rstmt st#180 fdo so#1 882 11 so#1 886 15 NA st#181 +rstmt st#171 fif so#1 868 9 so#1 888 13 st#183 st#172 +rstmt st#183 fsingle_if so#1 891 9 so#1 891 46 st#184 NA +rstmt st#185 fio so#1 893 10 so#1 893 43 NA NA +rstmt st#184 fsingle_if so#1 892 9 so#1 893 43 st#186 st#185 +rstmt st#188 fio so#1 896 10 so#1 896 63 NA NA +rstmt st#187 fsingle_if so#1 895 9 so#1 896 63 st#189 st#188 +rstmt st#191 fassign so#1 899 13 so#1 899 63 NA NA +rstmt st#190 fdo so#1 898 11 so#1 900 15 st#192 st#191 +rstmt st#193 fio so#1 902 12 so#1 904 59 NA NA +rstmt st#192 fsingle_if so#1 901 11 so#1 904 59 NA st#193 +rstmt st#189 fdo so#1 897 9 so#1 905 13 NA st#190 +rstmt st#186 fif so#1 894 9 so#1 906 13 NA st#187 +rstmt st#170 fif so#1 867 7 so#1 907 11 st#194 st#171 +rstmt st#197 fio so#1 915 12 so#1 915 65 NA NA +rstmt st#196 fsingle_if so#1 914 11 so#1 915 65 st#198 st#197 +rstmt st#199 fio so#1 917 13 so#1 919 44 st#200 NA +rstmt st#202 fassign so#1 923 17 so#1 923 39 st#203 NA +rstmt st#203 fassign so#1 924 17 so#1 924 55 NA NA +rstmt st#201 fdo so#1 922 15 so#1 925 19 NA st#202 +rstmt st#200 fdo so#1 921 13 so#1 926 17 st#204 st#201 +rstmt st#207 fassign so#1 930 19 so#1 930 50 st#208 NA +rstmt st#208 fassign so#1 931 19 so#1 931 70 NA NA +rstmt st#206 fdo so#1 929 17 so#1 932 21 NA st#207 +rstmt st#205 fif so#1 928 15 so#1 933 19 NA st#206 +rstmt st#204 fdo so#1 927 13 so#1 934 17 st#209 st#205 +rstmt st#209 freturn so#1 935 13 so#1 935 18 NA NA +rstmt st#198 fif so#1 916 11 so#1 938 15 st#210 st#199 +rstmt st#211 flabel so#1 940 1 NULL 0 0 st#212 NA +rstmt st#212 fio so#1 940 4 so#1 940 56 st#213 NA +rstmt st#213 fstop so#1 944 11 NULL 0 0 st#214 NA +rstmt st#210 fgoto so#1 939 11 so#1 939 17 st#211 NA st#214 +rstmt st#214 flabel so#1 945 1 NULL 0 0 NA NA +rstmt st#217 fio so#1 948 11 so#1 948 63 NA NA +rstmt st#216 fsingle_if so#1 947 10 so#1 948 63 st#218 st#217 +rstmt st#219 fassign so#1 950 11 so#1 950 31 NA NA +rstmt st#218 fdo so#1 949 10 so#1 951 14 st#220 st#219 +rstmt st#221 fassign so#1 953 11 so#1 953 30 NA NA +rstmt st#220 fdo so#1 952 10 so#1 954 14 st#222 st#221 +rstmt st#223 fassign so#1 956 11 so#1 956 31 NA NA +rstmt st#222 fdo so#1 955 10 so#1 957 14 st#224 st#223 +rstmt st#225 fassign so#1 959 11 so#1 959 32 NA NA +rstmt st#224 fdo so#1 958 10 so#1 960 14 NA st#225 +rstmt st#227 fio so#1 963 12 so#1 963 66 NA NA +rstmt st#226 fsingle_if so#1 962 11 so#1 963 66 st#228 st#227 +rstmt st#230 fassign so#1 971 15 so#1 971 20 st#231 NA +rstmt st#232 flabel so#1 974 1 NULL 0 0 st#233 NA +rstmt st#233 fio so#1 974 4 so#1 975 34 st#234 NA +rstmt st#234 fio so#1 976 15 so#1 978 33 NA NA +rstmt st#229 fdo so#1 970 13 so#1 986 17 st#235 st#230 +rstmt st#235 fio so#1 987 13 so#1 988 57 st#236 NA +rstmt st#236 fio so#1 989 13 so#1 990 57 st#237 NA +rstmt st#231 fgoto so#1 973 15 so#1 973 21 st#232 NA st#237 +rstmt st#237 flabel so#1 994 1 NULL 0 0 NA NA +rstmt st#228 fif so#1 967 11 so#1 995 15 NA st#229 +rstmt st#215 fif so#1 946 9 so#1 996 13 NA st#216 st#226 +rstmt st#195 fif so#1 913 9 so#1 996 13 NA st#196 st#215 +rstmt st#239 fio so#1 998 9 so#1 998 34 st#240 NA +rstmt st#240 fio so#1 999 9 so#1 999 56 st#241 NA +rstmt st#242 fio so#1 1001 9 so#1 1001 48 NA NA +rstmt st#241 fsingle_if so#1 1000 9 so#1 1001 48 st#243 st#242 +rstmt st#243 fio so#1 1002 9 so#1 1002 65 st#244 NA +rstmt st#245 flabel so#1 1004 1 NULL 0 0 st#246 NA +rstmt st#246 fio so#1 1004 3 so#1 1004 65 st#247 NA +rstmt st#247 fstop so#1 1008 9 NULL 0 0 st#248 NA +rstmt st#244 fgoto so#1 1003 9 so#1 1003 16 st#245 NA st#248 +rstmt st#248 flabel so#1 1009 1 NULL 0 0 NA NA +rstmt st#238 fif so#1 997 7 so#1 1011 12 NA st#239 +rstmt st#194 fif so#1 908 7 so#1 1011 12 st#249 st#195 st#238 +rstmt st#249 fif so#1 1013 7 so#1 1015 11 st#250 NA +rstmt st#250 fsingle_if so#1 1017 7 so#1 1018 18 st#251 NA +rstmt st#252 fio so#1 1020 9 so#1 1021 64 st#253 NA +rstmt st#253 fio so#1 1022 9 so#1 1022 45 st#254 NA +rstmt st#254 fio so#1 1023 9 so#1 1023 53 st#255 NA +rstmt st#256 fassign so#1 1025 4 so#1 1025 18 st#257 NA +rstmt st#257 fassign so#1 1026 4 so#1 1026 18 st#258 NA +rstmt st#258 fassign so#1 1027 4 so#1 1027 16 st#259 NA +rstmt st#259 fassign so#1 1028 4 so#1 1028 16 st#260 NA +rstmt st#261 fio so#1 1030 11 so#1 1032 23 NA NA +rstmt st#260 fsingle_if so#1 1029 4 so#1 1032 23 NA st#261 +rstmt st#255 fdo so#1 1024 2 so#1 1033 6 st#262 st#256 +rstmt st#262 fio so#1 1034 2 so#1 1034 19 NA NA +rstmt st#251 fif so#1 1019 7 so#1 1035 11 st#263 st#252 +rstmt st#263 fsingle_if so#1 1036 7 so#1 1036 41 st#264 NA +rstmt st#265 fio so#1 1047 9 so#1 1048 58 NA NA +rstmt st#264 fsingle_if so#1 1046 7 so#1 1048 58 st#266 st#265 +rstmt st#266 freturn so#1 1050 7 so#1 1050 12 st#267 NA +rstmt st#267 freturn so#1 1051 7 so#1 1051 9 NA NA +rbody st#0 + +ro#6 SEQ_COMP +rloc so#1 1053 24 +rlink f90 +rkind fint +rstart so#1 1057 7 +rstmt st#2 fassign so#1 1059 11 so#1 1059 26 st#3 NA +rstmt st#3 freturn so#1 1060 11 so#1 1060 16 NA NA +rstmt st#1 fif so#1 1058 9 so#1 1061 13 NA st#2 +rstmt st#0 fdo so#1 1057 7 so#1 1062 11 st#4 st#1 +rstmt st#4 fassign so#1 1063 7 so#1 1063 21 st#5 NA +rstmt st#5 freturn so#1 1064 7 so#1 1064 12 st#6 NA +rstmt st#6 freturn so#1 1065 7 so#1 1065 9 NA NA +rbody st#0 + +ro#7 READ_BRIDGE +rloc so#1 1067 18 +rlink f90 +rkind fext +rstart so#1 1090 7 +rstmt st#0 fio so#1 1090 7 so#1 1090 37 st#1 NA +rstmt st#1 fio so#1 1091 7 so#1 1091 22 st#2 NA +rstmt st#3 fio so#1 1093 9 so#1 1093 55 NA NA +rstmt st#2 fsingle_if so#1 1092 7 so#1 1093 55 st#4 st#3 +rstmt st#7 fio so#1 1097 37 so#1 1099 43 NA NA +rstmt st#6 fsingle_if so#1 1097 4 so#1 1099 43 st#8 st#7 +rstmt st#8 fio so#1 1100 4 so#1 1102 43 st#9 NA +rstmt st#9 fstop so#1 1105 10 NULL 0 0 NA NA +rstmt st#5 fif so#1 1096 2 so#1 1107 13 NA st#6 +rstmt st#4 fdo so#1 1095 7 so#1 1108 11 st#10 st#5 +rstmt st#11 fio so#1 1111 7 so#1 1111 48 st#12 NA +rstmt st#12 fio so#1 1112 7 so#1 1112 72 st#13 NA +rstmt st#14 fassign so#1 1114 9 so#1 1114 16 st#15 NA +rstmt st#18 fio so#1 1121 8 so#1 1122 56 st#19 NA +rstmt st#19 fio so#1 1123 8 so#1 1124 56 s \ No newline at end of file diff --git a/source/unres/src_MD-M-newcorr/permut.F b/source/unres/src_MD-M-newcorr/permut.F new file mode 100644 index 0000000..724f36c --- /dev/null +++ b/source/unres/src_MD-M-newcorr/permut.F @@ -0,0 +1,66 @@ + subroutine permut(isym) + 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' +c include 'COMMON.DISTFIT' +c include 'COMMON.SETUP' + integer n,a + logical nextp + external nextp + dimension a(isym) +c parameter(n=symetr) + n=isym + if (n.eq.1) then + tabperm(1,1)=1 + return + endif + kkk=0 + do i=1,n + a(i)=i + enddo + 10 print *,(a(i),i=1,n) + kkk=kkk+1 + do i=1,n + tabperm(kkk,i)=a(i) +c write (iout,*) "tututu", kkk + enddo + if(nextp(n,a)) go to 10 + return + end + + function nextp(n,a) + integer n,a,i,j,k,t + logical nextp + dimension a(n) + i=n-1 + 10 if(a(i).lt.a(i+1)) go to 20 + i=i-1 + if(i.eq.0) go to 20 + go to 10 + 20 j=i+1 + k=n + 30 t=a(j) + a(j)=a(k) + a(k)=t + j=j+1 + k=k-1 + if(j.lt.k) go to 30 + j=i + if(j.ne.0) go to 40 + nextp=.false. + return + 40 j=j+1 + if(a(j).lt.a(i)) go to 40 + t=a(i) + a(i)=a(j) + a(j)=t + nextp=.true. + return + end diff --git a/source/unres/src_MD-M-newcorr/pinorm.f b/source/unres/src_MD-M-newcorr/pinorm.f new file mode 100644 index 0000000..91392bf --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/printmat.f b/source/unres/src_MD-M-newcorr/printmat.f new file mode 100644 index 0000000..be2b38f --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/prng.f b/source/unres/src_MD-M-newcorr/prng.f new file mode 100644 index 0000000..73f6766 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/prng_32.F b/source/unres/src_MD-M-newcorr/prng_32.F new file mode 100644 index 0000000..21cac76 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/prng_32.F @@ -0,0 +1,1070 @@ +#if defined(AIX) || defined(AMD64) + 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) + if(me.gt.nmax) me=mod(me,nmax) + +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.gt.nmax) me=mod(me,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 +#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-M-newcorr/proc_proc.c b/source/unres/src_MD-M-newcorr/proc_proc.c new file mode 100644 index 0000000..f023520 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/proc_proc.c @@ -0,0 +1,140 @@ +#include +#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-M-newcorr/q_measure.F b/source/unres/src_MD-M-newcorr/q_measure.F new file mode 100644 index 0000000..8f12dc1 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/q_measure.F @@ -0,0 +1,491 @@ + 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 + do kkk=1,nperm + 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,kkk)-cref(1,il,kkk))**2+ + & (cref(2,jl,kkk)-cref(2,il,kkk))**2+ + & (cref(3,jl,kkk)-cref(3,il,kkk))**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,kkk)-cref(1,il+nres,kkk))**2+ + & (cref(2,jl+nres,kkk)-cref(2,il+nres,kkk))**2+ + & (cref(3,jl+nres,kkk)-cref(3,il+nres,kkk))**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,kkk)-cref(1,il,kkk))**2+ + & (cref(2,jl,kkk)-cref(2,il,kkk))**2+ + & (cref(3,jl,kkk)-cref(3,il,kkk))**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,kkk)-cref(1,il+nres,kkk))**2+ + & (cref(2,jl+nres,kkk)-cref(2,il+nres,kkk))**2+ + & (cref(3,jl+nres,kkk)-cref(3,il+nres,kkk))**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 + if (qqmax.le.qq) qqmax=qq + enddo + qwolynes=1.0d0-qqmax + 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 kkk=1,nperm + 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,kkk)-cref(1,il,kkk))**2+ + & (cref(2,jl,kkk)-cref(2,il,kkk))**2+ + & (cref(3,jl,kkk)-cref(3,il,kkk))**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,kkk)-cref(1,il+nres,kkk))**2+ + & (cref(2,jl+nres,kkk)-cref(2,il+nres,kkk))**2+ + & (cref(3,jl+nres,kkk)-cref(3,il+nres,kkk))**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,kkk)-cref(1,il,kkk))**2+ + & (cref(2,jl,kkk)-cref(2,il,kkk))**2+ + & (cref(3,jl,kkk)-cref(3,il,kkk))**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,kkk)-cref(1,il+nres,kkk))**2+ + & (cref(2,jl+nres,kkk)-cref(2,il+nres,kkk))**2+ + & (cref(3,jl+nres,kkk)-cref(3,il+nres,kkk))**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 + enddo + 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-M-newcorr/q_measure1.F b/source/unres/src_MD-M-newcorr/q_measure1.F new file mode 100644 index 0000000..9c1546d --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/q_measure3.F b/source/unres/src_MD-M-newcorr/q_measure3.F new file mode 100644 index 0000000..f0a030e --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/ran.f b/source/unres/src_MD-M-newcorr/ran.f new file mode 100644 index 0000000..dd23252 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/ran.f @@ -0,0 +1,128 @@ +ccccccccccccccccccccccccccccccccccccccccccccccccc + FUNCTION ran0(idum) + INTEGER idum,IA,IM,IQ,IR,MASK + REAL ran0,AM + PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836, + *MASK=123459876) + INTEGER k + idum=ieor(idum,MASK) + k=idum/IQ + idum=IA*(idum-k*IQ)-IR*k + if (idum.lt.0) idum=idum+IM + ran0=AM*idum + idum=ieor(idum,MASK) + return + END +C (C) Copr. 1986-92 Numerical Recipes Software *11915 +ccccccccccccccccccccccccccccccccccccccccccccccccc + FUNCTION ran1(idum) + INTEGER idum,IA,IM,IQ,IR,NTAB,NDIV + REAL ran1,AM,EPS,RNMX + PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836, + *NTAB=32,NDIV=1+(IM-1)/NTAB,EPS=1.2e-7,RNMX=1.-EPS) + INTEGER j,k,iv(NTAB),iy + SAVE iv,iy + DATA iv /NTAB*0/, iy /0/ + if (idum.le.0.or.iy.eq.0) then + idum=max(-idum,1) + do 11 j=NTAB+8,1,-1 + k=idum/IQ + idum=IA*(idum-k*IQ)-IR*k + if (idum.lt.0) idum=idum+IM + if (j.le.NTAB) iv(j)=idum +11 continue + iy=iv(1) + endif + k=idum/IQ + idum=IA*(idum-k*IQ)-IR*k + if (idum.lt.0) idum=idum+IM + j=1+iy/NDIV + iy=iv(j) + iv(j)=idum + ran1=min(AM*iy,RNMX) + return + END +C (C) Copr. 1986-92 Numerical Recipes Software *11915 +ccccccccccccccccccccccccccccccccccccccccccccccccc + FUNCTION ran2(idum) + INTEGER idum,IM1,IM2,IMM1,IA1,IA2,IQ1,IQ2,IR1,IR2,NTAB,NDIV + REAL ran2,AM,EPS,RNMX + PARAMETER (IM1=2147483563,IM2=2147483399,AM=1./IM1,IMM1=IM1-1, + *IA1=40014,IA2=40692,IQ1=53668,IQ2=52774,IR1=12211,IR2=3791, + *NTAB=32,NDIV=1+IMM1/NTAB,EPS=1.2e-7,RNMX=1.-EPS) + INTEGER idum2,j,k,iv(NTAB),iy + SAVE iv,iy,idum2 + DATA idum2/123456789/, iv/NTAB*0/, iy/0/ + if (idum.le.0) then + idum=max(-idum,1) + idum2=idum + do 11 j=NTAB+8,1,-1 + k=idum/IQ1 + idum=IA1*(idum-k*IQ1)-k*IR1 + if (idum.lt.0) idum=idum+IM1 + if (j.le.NTAB) iv(j)=idum +11 continue + iy=iv(1) + endif + k=idum/IQ1 + idum=IA1*(idum-k*IQ1)-k*IR1 + if (idum.lt.0) idum=idum+IM1 + k=idum2/IQ2 + idum2=IA2*(idum2-k*IQ2)-k*IR2 + if (idum2.lt.0) idum2=idum2+IM2 + j=1+iy/NDIV + iy=iv(j)-idum2 + iv(j)=idum + if(iy.lt.1)iy=iy+IMM1 + ran2=min(AM*iy,RNMX) + return + END +C (C) Copr. 1986-92 Numerical Recipes Software *11915 +ccccccccccccccccccccccccccccccccccccccccccccccccc + FUNCTION ran3(idum) + INTEGER idum + INTEGER MBIG,MSEED,MZ +C REAL MBIG,MSEED,MZ + REAL ran3,FAC + PARAMETER (MBIG=1000000000,MSEED=161803398,MZ=0,FAC=1./MBIG) +C PARAMETER (MBIG=4000000.,MSEED=1618033.,MZ=0.,FAC=1./MBIG) + INTEGER i,iff,ii,inext,inextp,k + INTEGER mj,mk,ma(55) +C REAL mj,mk,ma(55) + SAVE iff,inext,inextp,ma + DATA iff /0/ + if(idum.lt.0.or.iff.eq.0)then + iff=1 + mj=MSEED-iabs(idum) + mj=mod(mj,MBIG) + ma(55)=mj + mk=1 + do 11 i=1,54 + ii=mod(21*i,55) + ma(ii)=mk + mk=mj-mk + if(mk.lt.MZ)mk=mk+MBIG + mj=ma(ii) +11 continue + do 13 k=1,4 + do 12 i=1,55 + ma(i)=ma(i)-ma(1+mod(i+30,55)) + if(ma(i).lt.MZ)ma(i)=ma(i)+MBIG +12 continue +13 continue + inext=0 + inextp=31 + idum=1 + endif + inext=inext+1 + if(inext.eq.56)inext=1 + inextp=inextp+1 + if(inextp.eq.56)inextp=1 + mj=ma(inext)-ma(inextp) + if(mj.lt.MZ)mj=mj+MBIG + ma(inext)=mj + ran3=mj*FAC + return + END +C (C) Copr. 1986-92 Numerical Recipes Software *11915 +ccccccccccccccccccccccccccccccccccccccccccccccccc diff --git a/source/unres/src_MD-M-newcorr/randgens.f b/source/unres/src_MD-M-newcorr/randgens.f new file mode 100644 index 0000000..0daeb35 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/random_multi_chain/cont.unr b/source/unres/src_MD-M-newcorr/random_multi_chain/cont.unr new file mode 100644 index 0000000..7a854fb --- /dev/null +++ b/source/unres/src_MD-M-newcorr/random_multi_chain/cont.unr @@ -0,0 +1,2 @@ +42 1 1 + end of reading diff --git a/source/unres/src_MD-M-newcorr/random_multi_chain/ext_mono.pdb b/source/unres/src_MD-M-newcorr/random_multi_chain/ext_mono.pdb new file mode 100644 index 0000000..62bf112 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/random_multi_chain/ext_mono.pdb @@ -0,0 +1,42 @@ +ATOM 1 CA TYR 1 8.382 -13.657 -9.928 +ATOM 2 CB TYR 1 168.670-166.145 -5.869 +ATOM 3 CA ARG 2 9.042 -10.963 -7.273 +ATOM 4 CB ARG 2 169.196-168.255 -8.982 +ATOM 5 CA ILE 3 5.955 -9.381 -5.594 +ATOM 6 CB ILE 3 7.355 -17.267 -9.348 +ATOM 7 CA PRO 4 4.450 -6.011 -6.010 +ATOM 8 CB PRO 4 8.293 -15.262 -11.754 +ATOM 9 CA SER 5 7.190 -5.250 -8.539 +ATOM 10 CB SER 5 10.641 -9.174 -5.373 +ATOM 11 CA TYR 6 7.354 -5.535 -12.348 +ATOM 12 CB TYR 6 4.796 -10.792 -5.197 +ATOM 13 CA ASP 7 10.752 -3.958 -12.637 +ATOM 14 CB ASP 7 3.513 -6.163 -6.874 +ATOM 15 CA PHE 8 12.824 -6.283 -10.393 +ATOM 16 CB PHE 8 8.181 -5.602 -8.100 +ATOM 17 CA GLY 9 16.230 -6.896 -8.867 +ATOM 18 CA ASP 10 15.528 -10.562 -8.120 +ATOM 19 CB ASP 10 11.867 -3.361 -13.818 +ATOM 20 CA GLU 11 18.121 -13.316 -7.560 +ATOM 21 CB GLU 11 13.216 -7.681 -12.195 +ATOM 22 CA LEU 12 15.809 -16.273 -7.470 +ATOM 23 CB LEU 12 16.230 -6.896 -8.867 +ATOM 24 CA ALA 13 17.442 -19.233 -9.312 +ATOM 25 CB ALA 13 14.699 -11.588 -9.257 +ATOM 26 CA LYS 14 17.116 -22.328 -7.158 +ATOM 27 CB LYS 14 20.265 -13.685 -6.890 +ATOM 28 CA LEU 15 19.000 -23.404 -4.147 +ATOM 29 CB LEU 15 14.049 -15.539 -7.808 +ATOM 30 CA LEU 16 22.743 -23.767 -4.878 +ATOM 31 CB LEU 16 18.156 -19.310 -9.668 +ATOM 32 CA ARG 17 23.976 -24.680 -1.328 +ATOM 33 CB ARG 17 17.640 -24.337 -8.709 +ATOM 34 CA GLN 18 24.627 -28.315 -2.216 +ATOM 35 CB GLN 18 17.753 -23.570 -2.744 +ATOM 36 CA ALA 19 28.360 -28.817 -1.583 +ATOM 37 CB ALA 19 23.194 -24.346 -6.642 +ATOM 38 CA MET 20 30.487 -30.892 -3.948 +ATOM 39 CB MET 20 24.660 -21.877 -0.677 +ATOM 40 CA GLY 21 30.705 -34.625 -4.528 +ATOM 41 CA D 22 34.458 -36.431 -1.272 +ATOM 42 CB D 22 28.138 -29.185 -1.013 diff --git a/source/unres/src_MD-M-newcorr/random_multi_chain/ext_sing.pdb b/source/unres/src_MD-M-newcorr/random_multi_chain/ext_sing.pdb new file mode 100644 index 0000000..7849a15 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/random_multi_chain/ext_sing.pdb @@ -0,0 +1,42 @@ +ATOM 1 CA GLY 1 10.016 -0.162 -2.895 +ATOM 2 CA TYR 2 9.800 1.995 0.246 +ATOM 3 CB TYR 2 7.805 2.090 1.786 +ATOM 4 CA ARG 3 13.606 2.684 0.612 +ATOM 5 CB ARG 3 13.698 0.199 -1.130 +ATOM 6 CA ILE 4 15.292 6.106 0.367 +ATOM 7 CB ILE 4 15.459 7.277 1.758 +ATOM 8 CA PRO 5 17.298 8.071 -2.143 +ATOM 9 CB PRO 5 16.462 8.590 -3.113 +ATOM 10 CA SER 6 17.687 5.028 -4.340 +ATOM 11 CB SER 6 18.654 5.685 -4.411 +ATOM 12 CA TYR 7 15.262 2.522 -5.839 +ATOM 13 CB TYR 7 14.011 4.112 -4.475 +ATOM 14 CA ASP 8 16.605 -0.805 -6.925 +ATOM 15 CB ASP 8 18.130 -1.491 -6.849 +ATOM 16 CA PHE 9 14.458 -3.153 -8.962 +ATOM 17 CB PHE 9 12.508 -4.263 -9.379 +ATOM 18 CA GLY 10 16.407 -6.185 -9.924 +ATOM 19 CA ASP 11 15.230 -9.704 -10.533 +ATOM 20 CB ASP 11 14.156 -9.782 -11.867 +ATOM 21 CA GLU 12 16.670 -12.474 -8.174 +ATOM 22 CB GLU 12 16.970 -13.667 -6.237 +ATOM 23 CA LEU 13 17.758 -15.930 -9.223 +ATOM 24 CB LEU 13 17.453 -17.596 -10.066 +ATOM 25 CA ALA 14 20.810 -17.626 -7.681 +ATOM 26 CB ALA 14 21.136 -17.240 -7.073 +ATOM 27 CA LYS 15 22.101 -20.451 -5.570 +ATOM 28 CB LYS 15 24.290 -21.707 -6.036 +ATOM 29 CA LEU 16 24.426 -19.349 -2.750 +ATOM 30 CB LEU 16 24.431 -17.386 -3.007 +ATOM 31 CA LEU 17 26.368 -22.081 -0.978 +ATOM 32 CB LEU 17 26.300 -23.176 0.602 +ATOM 33 CA ARG 18 29.334 -23.295 -2.984 +ATOM 34 CB ARG 18 31.106 -20.948 -3.700 +ATOM 35 CA GLN 19 31.643 -25.851 -1.247 +ATOM 36 CB GLN 19 32.614 -26.996 0.441 +ATOM 37 CA ALA 20 34.350 -26.824 -3.781 +ATOM 38 CB ALA 20 34.912 -26.587 -3.411 +ATOM 39 CA MET 21 35.154 -29.805 -6.038 +ATOM 40 CB MET 21 31.463 -29.620 -5.509 +ATOM 41 CA GLY 22 38.268 -30.200 -8.056 +ATOM 42 CA GLY 23 39.823 -28.216 -10.858 diff --git a/source/unres/src_MD-M-newcorr/random_multi_chain/fort.4 b/source/unres/src_MD-M-newcorr/random_multi_chain/fort.4 new file mode 100644 index 0000000..882d9d2 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/random_multi_chain/fort.4 @@ -0,0 +1,43 @@ + ATOM 1CA GLYA 1 10.016 -0.162 -2.895 1. 10. + ATOM 2CA TYRA 2 9.8 1.995 0.246 1. 10. + ATOM 3CB TYRA 2 7.805 2.09 1.786 1. 10. + ATOM 4CA ARGA 3 13.606 2.684 0.612 1. 10. + ATOM 5CB ARGA 3 13.698 0.199 -1.13 1. 10. + ATOM 6CA ILEA 4 15.292 6.106 0.367 1. 10. + ATOM 7CB ILEA 4 15.459 7.277 1.758 1. 10. + ATOM 8CA PROA 5 17.298 8.071 -2.143 1. 10. + ATOM 9CB PROA 5 16.462 8.59 -3.113 1. 10. + ATOM 10CA SERA 6 17.687 5.028 -4.34 1. 10. + ATOM 11CB SERA 6 18.654 5.685 -4.411 1. 10. + ATOM 12CA TYRA 7 15.262 2.522 -5.839 1. 10. + ATOM 13CB TYRA 7 14.011 4.112 -4.475 1. 10. + ATOM 14CA ASPA 8 16.605 -0.805 -6.925 1. 10. + ATOM 15CB ASPA 8 18.13 -1.491 -6.849 1. 10. + ATOM 16CA PHEA 9 14.458 -3.153 -8.962 1. 10. + ATOM 17CB PHEA 9 12.508 -4.263 -9.379 1. 10. + ATOM 18CA GLYA 10 16.407 -6.185 -9.924 1. 10. + ATOM 19CA ASPA 11 15.23 -9.704 -10.533 1. 10. + ATOM 20CB ASPA 11 14.156 -9.782 -11.867 1. 10. + ATOM 21CA GLUA 12 16.67 -12.474 -8.174 1. 10. + ATOM 22CB GLUA 12 16.97 -13.667 -6.237 1. 10. + ATOM 23CA LEUA 13 17.758 -15.93 -9.223 1. 10. + ATOM 24CB LEUA 13 17.453 -17.596 -10.066 1. 10. + ATOM 25CA ALAA 14 20.81 -17.626 -7.681 1. 10. + ATOM 26CB ALAA 14 21.136 -17.24 -7.073 1. 10. + ATOM 27CA LYSA 15 22.101 -20.451 -5.57 1. 10. + ATOM 28CB LYSA 15 24.29 -21.707 -6.036 1. 10. + ATOM 29CA LEUA 16 24.426 -19.349 -2.75 1. 10. + ATOM 30CB LEUA 16 24.431 -17.386 -3.007 1. 10. + ATOM 31CA LEUA 17 26.368 -22.081 -0.978 1. 10. + ATOM 32CB LEUA 17 26.3 -23.176 0.602 1. 10. + ATOM 33CA ARGA 18 29.334 -23.295 -2.984 1. 10. + ATOM 34CB ARGA 18 31.106 -20.948 -3.7 1. 10. + ATOM 35CA GLNA 19 31.643 -25.851 -1.247 1. 10. + ATOM 36CB GLNA 19 32.614 -26.996 0.441 1. 10. + ATOM 37CA ALAA 20 34.35 -26.824 -3.781 1. 10. + ATOM 38CB ALAA 20 34.912 -26.587 -3.411 1. 10. + ATOM 39CA META 21 35.154 -29.805 -6.038 1. 10. + ATOM 40CB META 21 31.463 -29.62 -5.509 1. 10. + ATOM 41CA GLYA 22 38.268 -30.2 -8.056 1. 10. + ATOM 42CA GLYA 23 39.823 -28.216 -10.858 1. 10. + TER diff --git a/source/unres/src_MD-M-newcorr/random_multi_chain/output.pdb b/source/unres/src_MD-M-newcorr/random_multi_chain/output.pdb new file mode 100644 index 0000000..b195fc6 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/random_multi_chain/output.pdb @@ -0,0 +1,43 @@ +ATOM 1 CA GLY A 1 10.016 -0.162 -2.895 1.00 10.00 +ATOM 2 CA TYR A 2 9.800 1.995 0.246 1.00 10.00 +ATOM 3 CB TYR A 2 7.805 2.090 1.786 1.00 10.00 +ATOM 4 CA ARG A 3 13.606 2.684 0.612 1.00 10.00 +ATOM 5 CB ARG A 3 13.698 0.199 -1.130 1.00 10.00 +ATOM 6 CA ILE A 4 15.292 6.106 0.367 1.00 10.00 +ATOM 7 CB ILE A 4 15.459 7.277 1.758 1.00 10.00 +ATOM 8 CA PRO A 5 17.298 8.071 -2.143 1.00 10.00 +ATOM 9 CB PRO A 5 16.462 8.590 -3.113 1.00 10.00 +ATOM 10 CA SER A 6 17.687 5.028 -4.340 1.00 10.00 +ATOM 11 CB SER A 6 18.654 5.685 -4.411 1.00 10.00 +ATOM 12 CA TYR A 7 15.262 2.522 -5.839 1.00 10.00 +ATOM 13 CB TYR A 7 14.011 4.112 -4.475 1.00 10.00 +ATOM 14 CA ASP A 8 16.605 -0.805 -6.925 1.00 10.00 +ATOM 15 CB ASP A 8 18.130 -1.491 -6.849 1.00 10.00 +ATOM 16 CA PHE A 9 14.458 -3.153 -8.962 1.00 10.00 +ATOM 17 CB PHE A 9 12.508 -4.263 -9.379 1.00 10.00 +ATOM 18 CA GLY A 10 16.407 -6.185 -9.924 1.00 10.00 +ATOM 19 CA ASP A 11 15.230 -9.704 -10.533 1.00 10.00 +ATOM 20 CB ASP A 11 14.156 -9.782 -11.867 1.00 10.00 +ATOM 21 CA GLU A 12 16.670 -12.474 -8.174 1.00 10.00 +ATOM 22 CB GLU A 12 16.970 -13.667 -6.237 1.00 10.00 +ATOM 23 CA LEU A 13 17.758 -15.930 -9.223 1.00 10.00 +ATOM 24 CB LEU A 13 17.453 -17.596 -10.066 1.00 10.00 +ATOM 25 CA ALA A 14 20.810 -17.626 -7.681 1.00 10.00 +ATOM 26 CB ALA A 14 21.136 -17.240 -7.073 1.00 10.00 +ATOM 27 CA LYS A 15 22.101 -20.451 -5.570 1.00 10.00 +ATOM 28 CB LYS A 15 24.290 -21.707 -6.036 1.00 10.00 +ATOM 29 CA LEU A 16 24.426 -19.349 -2.750 1.00 10.00 +ATOM 30 CB LEU A 16 24.431 -17.386 -3.007 1.00 10.00 +ATOM 31 CA LEU A 17 26.368 -22.081 -0.978 1.00 10.00 +ATOM 32 CB LEU A 17 26.300 -23.176 0.602 1.00 10.00 +ATOM 33 CA ARG A 18 29.334 -23.295 -2.984 1.00 10.00 +ATOM 34 CB ARG A 18 31.106 -20.948 -3.700 1.00 10.00 +ATOM 35 CA GLN A 19 31.643 -25.851 -1.247 1.00 10.00 +ATOM 36 CB GLN A 19 32.614 -26.996 0.441 1.00 10.00 +ATOM 37 CA ALA A 20 34.350 -26.824 -3.781 1.00 10.00 +ATOM 38 CB ALA A 20 34.912 -26.587 -3.411 1.00 10.00 +ATOM 39 CA MET A 21 35.154 -29.805 -6.038 1.00 10.00 +ATOM 40 CB MET A 21 31.463 -29.620 -5.509 1.00 10.00 +ATOM 41 CA GLY A 22 38.268 -30.200 -8.056 1.00 10.00 +ATOM 42 CA GLY A 23 39.823 -28.216 -10.858 1.00 10.00 +TER diff --git a/source/unres/src_MD-M-newcorr/random_multi_chain/random.f b/source/unres/src_MD-M-newcorr/random_multi_chain/random.f new file mode 100644 index 0000000..aee6dbd --- /dev/null +++ b/source/unres/src_MD-M-newcorr/random_multi_chain/random.f @@ -0,0 +1,61 @@ + implicit none + double precision vec(3,1000,20),xtemp,ytemp,ztemp +cc vector is in the sequence: position, number of atom, number of chain + character*80 inname,outname,incontrol + character*8 junk + character*3 atype(1000),restyp(1000),atyptemp,resttemp,chain + integer natoms,i,ncopies,atnum,renum(1000),irestemp,actatom + integer unres,k,j,nrep + double precision occupan(1000),tempfact(1000),occutemp,temptemp + call getarg(1,inname) + call getarg(2,outname) + call getarg(3,incontrol) + k=18 + call RNUNF(k) + write (*,*) k + open (6,file=incontrol, status='old') + read (6,*) natoms,ncopies,unres + open (1,file=inname, status='old') + if (unres.eq.0) then + do i=1,natoms + read (1,*) junk,atnum,atyptemp,resttemp,chain,irestemp,xtemp, + &ytemp, ztemp,occutemp,temptemp + vec(1,i,1)=xtemp + vec(2,i,1)=ytemp + vec(3,i,1)=ztemp + atype(i)=atyptemp + restyp(i)=resttemp + renum(i)=irestemp + occupan(i)=occutemp + tempfact(i)=temptemp + enddo + endif + if (unres.ne.0) then + do i=1,natoms + read (1,*) junk,atnum,atyptemp,resttemp,irestemp,xtemp,ytemp, + &ztemp + vec(1,i,1)=xtemp + vec(2,i,1)=ytemp + vec(3,i,1)=ztemp + atype(i)=atyptemp + restyp(i)=resttemp + occupan(i)=1.0 + tempfact(i)=10.0 + renum(i)=irestemp + enddo + endif + write (*,*) "end of reading" + open (4,file=outname) + junk="ATOM " + do k=1,ncopies + if (k.eq.1) chain=" A" + do i=1,natoms + actatom=natoms*(k-1)+i + write (4,'(a8,i3,a4,a4,a2,i3,f12.3,2f8.3,2f6.2)') junk, actatom + &, atype(i),restyp(i),chain, + &renum(i), (vec(j,i,k),j=1,3),occupan(i),tempfact(i) + enddo + write (4,'(a3)') "TER" + enddo + end + diff --git a/source/unres/src_MD-M-newcorr/random_multi_chain/toggle b/source/unres/src_MD-M-newcorr/random_multi_chain/toggle new file mode 100755 index 0000000000000000000000000000000000000000..9e0844f25dc348b7390e1206df9a80512cb630ff GIT binary patch literal 15794 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 z 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 F`!BbIVdnq< literal 0 HcmV?d00001 diff --git a/source/unres/src_MD-M-newcorr/rattle.F b/source/unres/src_MD-M-newcorr/rattle.F new file mode 100644 index 0000000..5a8ed0c --- /dev/null +++ b/source/unres/src_MD-M-newcorr/rattle.F @@ -0,0 +1,724 @@ + 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' +#ifdef RATTLE + 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 +#else + write (iout,*) + & "RATTLE inactive; use -DRATTLE switch at compile time." + stop +#endif + 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' +#ifdef RATTLE + 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 +#else + write (iout,*) + & "RATTLE inactive; use -DRATTLE option at compile time." + stop +#endif + 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' +#ifdef RATTLE + 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 +#else + write (iout,*) + & "RATTLE inactive; use -DRATTLE option at compile time" + stop +#endif + end diff --git a/source/unres/src_MD-M-newcorr/readpdb.F b/source/unres/src_MD-M-newcorr/readpdb.F new file mode 100644 index 0000000..f2daadd --- /dev/null +++ b/source/unres/src_MD-M-newcorr/readpdb.F @@ -0,0 +1,557 @@ + 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) + integer rescode + logical fail + ibeg=1 + lsecondary=.false. + nhfrag=0 + nbfrag=0 + do + 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') then + goto 10 + else if (card(:3).eq.'TER') then +C End current chain + ires_old=ires+1 + itype(ires_old)=ntyp1 + ibeg=2 +c write (iout,*) "Chain ended",ires,ishift,ires_old + if (unres_pdb) then + do j=1,3 + dc(j,ires)=sccor(j,iii) + enddo + else + call sccenter(ires,iii,sccor) + endif + endif +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. +c write (iout,'(a80)') card + 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)=ntyp1 + endif +c write (iout,*) "ires",ires," ibeg",ibeg," ishift",ishift + ibeg=0 + else if (ibeg.eq.2) then +c Start a new chain + ishift=-ires_old+ires-1 +c write (iout,*) "New chain started",ires,ishift + ibeg=0 + endif + ires=ires-ishift +c write (2,*) "ires",ires," ishift",ishift + if (res.eq.'ACE') then + itype(ires)=10 + else + itype(ires)=rescode(ires,res,0) + endif + read(card(31:54),'(3f8.3)') (c(j,ires),j=1,3) + if(me.eq.king.or..not.out1file) + & write (iout,'(2i3,2x,a,3f8.3)') + & 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 dummy residue coordinates inside the "chain" of a multichain +C system + nres=ires + do i=2,nres-1 +c write (iout,*) i,itype(i) + if (itype(i).eq.ntyp1) then +c write (iout,*) "dummy",i,itype(i) + do j=1,3 + c(j,i)=((c(j,i-1)+c(j,i+1))/2+2*c(j,i-1)-c(j,i-2))/2 +c c(j,i)=(c(j,i-1)+c(j,i+1))/2 + dc(j,i)=c(j,i) + enddo + endif + enddo +C Calculate the CM of the last side chain. + if (unres_pdb) then + do j=1,3 + dc(j,ires)=sccor(j,iii) + enddo + else + call sccenter(ires,iii,sccor) + endif + nsup=nres + nstart_sup=1 + if (itype(nres).ne.10) then + nres=nres+1 + itype(nres)=ntyp1 + 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.ntyp1) 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 + 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(.true.) + 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 +C Splits to single chain if occurs + kkk=1 + lll=0 + cou=1 + do i=1,nres + lll=lll+1 +cc write (iout,*) "spraw lancuchy",(c(j,i),j=1,3) + if (i.gt.1) then + if ((itype(i-1).eq.ntyp1).and.(i.gt.2)) then + chain_length=lll-1 + kkk=kkk+1 +c write (iout,*) "spraw lancuchy",(c(j,i),j=1,3) + lll=1 + endif + endif + do j=1,3 + cref(j,i,cou)=c(j,i) + cref(j,i+nres,cou)=c(j,i+nres) + if (i.le.nres) then + chain_rep(j,lll,kkk)=c(j,i) + chain_rep(j,lll+nres,kkk)=c(j,i+nres) + endif + enddo + enddo + write (iout,*) chain_length + if (chain_length.eq.0) chain_length=nres + do j=1,3 + chain_rep(j,chain_length,symetr)=chain_rep(j,chain_length,1) + chain_rep(j,chain_length+nres,symetr) + &=chain_rep(j,chain_length+nres,1) + enddo +c diagnostic +c write (iout,*) "spraw lancuchy",chain_length,symetr +c do i=1,4 +c do kkk=1,chain_length +c write (iout,*) itype(kkk),(chain_rep(j,kkk,i), j=1,3) +c enddo +c enddo +c enddiagnostic +C makes copy of chains + write (iout,*) "symetr", symetr + + if (symetr.gt.1) then + call permut(symetr) + nperm=1 + do i=1,symetr + nperm=nperm*i + enddo + do i=1,nperm + write(iout,*) (tabperm(i,kkk),kkk=1,4) + enddo + do i=1,nperm + cou=0 + do kkk=1,symetr + icha=tabperm(i,kkk) +c write (iout,*) i,icha + do lll=1,chain_length + cou=cou+1 + if (cou.le.nres) then + do j=1,3 + kupa=mod(lll,chain_length) + iprzes=(kkk-1)*chain_length+lll + if (kupa.eq.0) kupa=chain_length +c write (iout,*) "kupa", kupa + cref(j,iprzes,i)=chain_rep(j,kupa,icha) + cref(j,iprzes+nres,i)=chain_rep(j,kupa+nres,icha) + enddo + endif + enddo + enddo + enddo + endif +C-koniec robienia kopii +c diag + do kkk=1,nperm + write (iout,*) "nowa struktura", nperm + do i=1,nres + write (iout,110) restyp(itype(i)),i,cref(1,i,kkk), + &cref(2,i,kkk), + &cref(3,i,kkk),cref(1,nres+i,kkk), + &cref(2,nres+i,kkk),cref(3,nres+i,kkk) + 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) + + enddo +cc enddiag + 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 +#ifdef MPI + if(me.eq.king.or..not.out1file)then +#endif + if (lprn) then + write (iout,'(/a)') + & 'Internal coordinates calculated from crystal structure.' + if (lside) then + write (iout,'(8a)') ' Res ',' dvb',' Theta', + & ' Phi',' Dsc_id',' Dsc',' Alpha', + & ' Omega' + else + write (iout,'(4a)') ' Res ',' dvb',' Theta', + & ' Phi' + endif + endif +#ifdef MPI + endif +#endif + do i=1,nres-1 + iti=itype(i) + if (iti.ne.ntyp1 .and. itype(i+1).ne.ntyp1 .and. + & (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) + 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 .and. itype(i).ne.ntyp1) 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 .and. itype(i).ne.ntyp1) 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) +#ifdef MPI + if(me.eq.king.or..not.out1file) + & write (iout,'(a3,i4,3f10.5)') restyp(iti),i,xxref(i), + & yyref(i),zzref(i) +#else + write (iout,'(a3,i4,3f10.5)') restyp(iti),i,xxref(i),yyref(i), + & zzref(i) +#endif + 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(iabs(itype(i+1))) + vbld_inv(i+1+nres)=dsc_inv(iabs(itype(i+1))) +c print *,vbld(i+1),vbld(i+1+nres) + enddo + return + end + diff --git a/source/unres/src_MD-M-newcorr/readpdb.f b/source/unres/src_MD-M-newcorr/readpdb.f new file mode 100644 index 0000000000000000000000000000000000000000..084d907c05b686ae11c3af387078936502ce1799 GIT binary patch literal 43512 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 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' + include 'mpif.h' + 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.ntyp1) 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(iabs(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=iabs(itype(i)) + itypi1=iabs(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=iabs(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-M-newcorr/select.tau b/source/unres/src_MD-M-newcorr/select.tau new file mode 100644 index 0000000..a91c73b --- /dev/null +++ b/source/unres/src_MD-M-newcorr/select.tau @@ -0,0 +1,81 @@ +BEGIN_FILE_INCLUDE_LIST +add.* +arcos.* +banach.* +bank.* +blas.* +bond_move.* +cartder.* +cartprint.* +chainbuild.* +check_bond.* +checkder_p.* +check_sc_distr.* +cinfo.* +compare_s1.* +contact.* +convert.* +cored.* +csa.* +diff12.* +dihed_cons.* +distfit.* +djacob.* +econstr_local.* +eigen.* +elecont.* +energy_p_new.* +energy_p_new-sep.* +energy_split-sep.* +entmcm.* +fitsq.* +gauss.* +geomout.* +gnmr1.* +gradient_p.* +indexx.* +initialize_p.* +intcartderiv.* +intcor.* +intlocal.* +int_to_cart.* +kinetic_lesyng.* +lagrangian_lesyng.* +local_move.* +map.* +matmult.* +mcm.* +mc.* +MD_A-MTS.* +minimize_p.* +minim_jlee.* +minim_mcmf.* +misc.* +moments.* +MP.* +MREMD.* +muca_md.* +newconf.* +parmread.* +pinorm.* +printmat.* +q_measure.* +rattle.* +readpdb.* +refsys.* +regularize.* +rescode.* +rmdd.* +rmsd.* +sc_move.* +shift.* +sort.* +stochfric.* +sumsld.* +surfatom.* +test.* +thread.* +timing.* +together.* +unres.* +END_FILE_INCLUDE_LIST diff --git a/source/unres/src_MD-M-newcorr/shift.F b/source/unres/src_MD-M-newcorr/shift.F new file mode 100644 index 0000000..6eb9b3f --- /dev/null +++ b/source/unres/src_MD-M-newcorr/shift.F @@ -0,0 +1,105 @@ +c--------------------------------- + subroutine csa_read + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.IOUNITS' + + open(icsa_in,file=csa_in,status="old",err=100) + read(icsa_in,*) nconf + read(icsa_in,*) jstart,jend + read(icsa_in,*) nstmax + read(icsa_in,*) n1,n2,n3,n4,n5,n6,n7,n8,is1,is2 + read(icsa_in,*) nran0,nran1,irr + read(icsa_in,*) nseed + read(icsa_in,*) ntotal,cut1,cut2 + read(icsa_in,*) estop + read(icsa_in,*) icmax,irestart + read(icsa_in,*) ntbankm,dele,difcut + read(icsa_in,*) iref,rmscut,pnccut + read(icsa_in,*) ndiff + close(icsa_in) + + return + + 100 continue + return + end +c--------------------------------- + subroutine initial_write + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.IOUNITS' + + open(icsa_seed,file=csa_seed,status="unknown") + write(icsa_seed,*) "seed" + close(31) +#if defined(AIX) || defined(PGI) + open(icsa_history,file=csa_history,status="unknown", + & position="append") +#else + open(icsa_history,file=csa_history,status="unknown", + & access="append") +#endif + write(icsa_history,*) nconf + write(icsa_history,*) jstart,jend + write(icsa_history,*) nstmax + write(icsa_history,*) n1,n2,n3,n4,n5,n6,n7,n8,is1,is2 + write(icsa_history,*) nran0,nran1,irr + write(icsa_history,*) nseed + write(icsa_history,*) ntotal,cut1,cut2 + write(icsa_history,*) estop + write(icsa_history,*) icmax,irestart + write(icsa_history,*) ntbankm,dele,difcut + write(icsa_history,*) iref,rmscut,pnccut + write(icsa_history,*) ndiff + + write(icsa_history,*) + close(icsa_history) + + open(icsa_bank1,file=csa_bank1,status="unknown") + write(icsa_bank1,*) 0 + close(icsa_bank1) + + return + end +c--------------------------------- + subroutine restart_write + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + +#if defined(AIX) || defined(PGI) + open(icsa_history,file=csa_history,position="append") +#else + open(icsa_history,file=csa_history,access="append") +#endif + write(icsa_history,*) + write(icsa_history,*) "This is restart" + write(icsa_history,*) + write(icsa_history,*) nconf + write(icsa_history,*) jstart,jend + write(icsa_history,*) nstmax + write(icsa_history,*) n1,n2,n3,n4,n5,n6,n7,n8,is1,is2 + write(icsa_history,*) nran0,nran1,irr + write(icsa_history,*) nseed + write(icsa_history,*) ntotal,cut1,cut2 + write(icsa_history,*) estop + write(icsa_history,*) icmax,irestart + write(icsa_history,*) ntbankm,dele,difcut + write(icsa_history,*) iref,rmscut,pnccut + write(icsa_history,*) ndiff + write(icsa_history,*) + write(icsa_history,*) "irestart is: ", irestart + + write(icsa_history,*) + close(icsa_history) + + return + end +c--------------------------------- diff --git a/source/unres/src_MD-M-newcorr/sizes.i b/source/unres/src_MD-M-newcorr/sizes.i new file mode 100644 index 0000000..45c44ff --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/sort.f b/source/unres/src_MD-M-newcorr/sort.f new file mode 100644 index 0000000..46b43d9 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/stochfric.F b/source/unres/src_MD-M-newcorr/stochfric.F new file mode 100644 index 0000000..bc12f3e --- /dev/null +++ b/source/unres/src_MD-M-newcorr/stochfric.F @@ -0,0 +1,627 @@ + 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.ntyp1) 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 + gamsc(ntyp1)=1.0d0 + do i=nnt,nct + ind=ind+1 + ii = ind+m + iti=itype(i) + gamvec(ii)=gamsc(iabs(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-M-newcorr/sumsld.f b/source/unres/src_MD-M-newcorr/sumsld.f new file mode 100644 index 0000000..1ce7b78 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/surfatom.f b/source/unres/src_MD-M-newcorr/surfatom.f new file mode 100644 index 0000000..9974842 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/symbols-lang0.txt b/source/unres/src_MD-M-newcorr/symbols-lang0.txt new file mode 100644 index 0000000..6550c2d --- /dev/null +++ b/source/unres/src_MD-M-newcorr/symbols-lang0.txt @@ -0,0 +1,257 @@ +bm_outfile 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_I_LONG_LONG_INT + 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +frag_ 0xa0 geomout.o +calcthet_ 0x9c energy_p_new_barrier.o +wagi_ 0x10 geomout.o +cache_ 0x5dcd0 mcm.o +rm_outfile_head 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +header_ 0x50 unres.o +mvstat_ 0x250 readrtns_CSA.o +timing_ 0x140 unres.o +MPIR_I_COMPLEX 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +MPIR_I_LONG_INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +ffield_ 0x174 unres.o +chuju_ 0x4 minimize_p.o +deriv_loc_ 0x1e0 initialize_p.o +splitele_ 0x10 initialize_p.o +cipiszcze_ 0x4 /tmp/ipo_ifortB4EXK9.o +MPIR_I_DOUBLE_PRECISION + 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +MPIR_I_SHORT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPI_LONG_DOUBLE_INT_var + 0x20 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_dtes 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_UB 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +refstruct_ 0x1c26c unres.o +dih_control_ 0xc readrtns_CSA.o +MPIR_I_FLOAT_INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_SHORT_INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +frozen_ 0x12c0 geomout.o +sumsl_flag_ 0x4 unres.o +execer_pg 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +links_split_ 0x8 unres.o +precomp1_ 0x70800 unres.o +bounds_ 0x4b00 readrtns_CSA.o +MPIR_I_2DCOMPLEX 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +alphaa_ 0x1e788 readrtns_CSA.o +MPIR_errhandlers 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initutil.o) +chain_ 0x54680 unres.o +parfiles_ 0xb00 unres.o +globmemsize 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +rotat_old_ 0x9600 unres.o +bank_ 0x25920 readrtns_CSA.o +p4_rm_rank 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +contacts1_ 0xc5d3c0 unres.o +mce_ 0x230 readrtns_CSA.o +diploc_ 0x3938 unres.o +mucarem_ 0x8000 readrtns_CSA.o +mdpmpi_ 0x8014 unres.o +iounits_ 0x6c unres.o +MPI_DOUBLE_INT_var 0x10 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +mapp_ 0x25804 readrtns_CSA.o +MPIR_real8_dte 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +p4_brdcst_info 0x18 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +langforc_ 0x582a594 readrtns_CSA.o +MPIR_I_2INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +minvar_ 0x12d78 readrtns_CSA.o +torsion_ 0x5adc parmread.o +struct_ 0xa2c readrtns_CSA.o +procgroup_file 0x100 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +mdpar_ 0x6c unres.o +MPID_MyWorldSize 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(adi2init.o) +spinka_ 0x384c newconf.o +thetas_ 0x960 chainbuild.o +__P4FROM 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4priv.o) +MPIR_int1_dte 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +MPIR_debug_q 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +MPIR_debug_sq 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +MPID_MyWorldRank 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(adi2init.o) +remdrestart_ 0x411808 unres.o +for__pthread_mutex_unlock_ptr + 0x8 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_aio.o) +restr_ 0xce44 unres.o +locel_ 0x274 energy_p_new_barrier.o +MPIR_I_REAL 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +fourier_ 0x344 initialize_p.o +precomp2_ 0x70800 unres.o +torsiond_ 0x14200 initialize_p.o +for__a_argv 0x8 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_init.o) +MPIR_debug_rh 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +pool_ 0x5dc5c readrtns_CSA.o +maxgrad_ 0xa8 energy_p_new_barrier.o +double_muca_ 0x25828 readrtns_CSA.o +links_ 0x107035c unres.o +MPID_byte_order 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(chhetero.o) +p4_global 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_I_2REAL 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +mdgrad_ 0x1c230 unres.o +execer_mastport 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +from_zscore_ 0xc unres.o +csa_input_ 0x98 readrtns_CSA.o +for__pthread_mutex_init_ptr + 0x8 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_aio.o) +machsw_ 0xc initialize_p.o +types_ 0x54 unres.o +MPIR_I_USHORT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_FLOAT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +sccalc_ 0x28 energy_p_new_barrier.o +pochodne_ 0xb01310 geomout.o +loc_work_ 0x30c local_move.o +peptbond_ 0x28 chainbuild.o +MPIR_I_UINT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +calc_ 0x1f0 gen_rand_conf.o +execer_id 0x84 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPI_FLOAT_INT_var 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +execer_numtotnodes 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +derivat_ 0x436dbe8 initialize_p.o +MPIR_I_BYTE 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_CHAR 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +deriv_scloc_ 0x3f480 initialize_p.o +listener_info 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +przechowalnia_ 0x7080000 MREMD.o +MPIR_All_communicators + 0x10 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +diffcuta_ 0x8 readrtns_CSA.o +vectors_ 0x62700 energy_p_new_barrier.o +thread_ 0x148 readrtns_CSA.o +back_constr_ 0x165cc unres.o +MPIR_I_PACKED 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +p4_local 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_I_DCOMPLEX 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +logging_flag 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +pizda_ 0x12c0 readrtns_CSA.o +execer_myhost 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_rhandles 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(adi2init.o) +MPIR_topo_els 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initutil.o) +par_ 0x20 eigen.o +info_ 0x4010 timing.o +MPIR_I_INTEGER 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +tty_orig 0x12 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_secure.o) +MPIR_I_DOUBLE_INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +mpgrad_ 0x2588 initialize_p.o +info1_ 0x2824 timing.o +setup_ 0x6040 unres.o +p4_wd 0x100 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_Op_errno 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(global_ops.o) +restraints_ 0x8 unres.o +MPIR_I_LONG_DOUBLE 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +torcnstr_ 0x7098 initialize_p.o +stochcalc_ 0xe100 MD_A-MTS.o +MPIR_I_2FLOAT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_real4_dte 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +indices_ 0x7060 chainbuild.o +qmeas_ 0x7633c unres.o +MPID_recvs 0x20 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(queue.o) +mpipriv_ 0x24 unres.o +p4_remote_debug_level + 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_shandles 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(adi2init.o) +total_pack_unacked 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(chpackflow.o) +kutas_ 0x4 energy_p_new_barrier.o +cntrl_ 0x7c unres.o +sserver_port 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +rotmat_ 0x54600 unres.o +varin_ 0x12d48 readrtns_CSA.o +p4_myname_in_procgroup + 0x40 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +lagrange_ 0x1085e2b8 unres.o +message_catalog 0x8 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_diags_intel.o) +MPIR_I_UCHAR 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +fnames_ 0x1007 unres.o +loc_const_ 0x40 local_move.o +stoptim_ 0x4 unres.o +sclocal_ 0x22cc chainbuild.o +time1_ 0x30 unres.o +MPIR_I_2DOUBLE 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +bank_disulfid_ 0x1f0 readrtns_CSA.o +MPID_pack_info 0x10 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(chpackflow.o) +MPIR_debug_qh 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +mdcalc_ 0x108 unres.o +dipmat_ 0xafc8000 unres.o +hand_start_remotes 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +execer_starting_remotes + 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +remdcommon_ 0x6030 unres.o +sbridge_ 0x9c unres.o +refer_ 0x98 bond_move.o +csafiles_ 0xc00 unres.o +MPIR_tid 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initutil.o) +thread1_ 0x1cd0 readrtns_CSA.o +langmat_ 0xc readrtns_CSA.o +__P4GLOBALTYPE 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4priv.o) +integer_muca_ 0xc readrtns_CSA.o +MPI_SHORT_INT_var 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +inertia_ 0x160 unres.o +mcm_ 0x20a4 initialize_p.o +MPIR_I_2DOUBLE_PRECISION + 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +for__pthread_mutex_lock_ptr + 0x8 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_aio.o) +mce_counters_ 0x14 readrtns_CSA.o +aaaa_ 0x8 MP.o +store0_ 0x4 geomout.o +MPIR_I_2INTEGER 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +banii_ 0xe100 banach.o +scrot_ 0x28a0 parmread.o +c_frag_ 0x2588 geomout.o +move_ 0x4b78 initialize_p.o +MPIR_fdtels 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initutil.o) +MPIR_I_LONG 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +vrandd_ 0x3f0 randgens.o +syfek_ 0xe100 stochfric.o +whoami_p4 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +windows_ 0x3844 initialize_p.o +contacts_hb_ 0x4e483c0 unres.o +MPIR_debug_s 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +MPIR_I_ULONG 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_hbt_els 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(util_hbt.o) +srutu_ 0x4 unres.o +contdistrib_ 0x2c0944c unres.o +expect_ack 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(chpackflow.o) +MPIR_hbts 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(util_hbt.o) +__P4TYPE 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4priv.o) +traj1cache_ 0x480dc unres.o +accept_stats_ 0x2008 initialize_p.o +execer_masthost 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +for__l_argc 0x4 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_init.o) +invlen_ 0x4b00 chainbuild.o +MPIR_I_LONG_DOUBLE_INT + 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_debug_c 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +MPI_LONG_INT_var 0x10 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_LB 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +p4_debug_level 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +stretch_ 0x608 unres.o +for__aio_lub_table 0x400 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_aio.o) +iofile_ 0x65c initialize_p.o +MPIR_qels 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initutil.o) +__P4LEN 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4priv.o) +local_domain 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +minimm_ 0x20 initialize_p.o +MPIR_debug_qel 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +send2_ 0x151b0 readrtns_CSA.o +MPIR_debug_sqel 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +MPIR_I_2COMPLEX 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +gucio_ 0x18 MD_A-MTS.o +ch_debug_buf 0x80 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(adi2init.o) +execer_mynumprocs 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +contacts_ 0x38408 unres.o +__BLNK__ 0xc djacob.o +MPIR_I_LOGICAL 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +MPIR_int2_dte 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +geo_ 0x40 unres.o +execer_mynodenum 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_int4_dte 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +MPIR_I_DOUBLE 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +csaunits_ 0x34 unres.o +body_ 0x6180 unres.o +interact_ 0x154bc unres.o +theta_abinitio_ 0x24a70 chainbuild.o +oldgeo_ 0xbb8f4 unres.o +rotat_ 0x38400 unres.o +var_ 0x35e90 unres.o +secondarys_ 0x4b0 dihed_cons.o +MPIR_debug_cl 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) + diff --git a/source/unres/src_MD-M-newcorr/symbolsizes.txt b/source/unres/src_MD-M-newcorr/symbolsizes.txt new file mode 100644 index 0000000..e2c457b --- /dev/null +++ b/source/unres/src_MD-M-newcorr/symbolsizes.txt @@ -0,0 +1,257 @@ +bm_outfile 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_I_LONG_LONG_INT + 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +frag_ 0xa0 geomout.o +calcthet_ 0x9c energy_p_new_barrier.o +wagi_ 0x10 geomout.o +cache_ 0x5dcd0 mcm.o +rm_outfile_head 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +header_ 0x50 unres.o +mvstat_ 0x250 readrtns_CSA.o +timing_ 0x140 unres.o +MPIR_I_COMPLEX 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +MPIR_I_LONG_INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +ffield_ 0x174 unres.o +chuju_ 0x4 minimize_p.o +deriv_loc_ 0x1e0 initialize_p.o +splitele_ 0x10 initialize_p.o +cipiszcze_ 0x4 /tmp/ipo_ifortx3jrsv.o +MPIR_I_DOUBLE_PRECISION + 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +MPIR_I_SHORT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPI_LONG_DOUBLE_INT_var + 0x20 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_dtes 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_UB 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +refstruct_ 0x1c26c unres.o +dih_control_ 0xc readrtns_CSA.o +MPIR_I_FLOAT_INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_SHORT_INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +frozen_ 0x12c0 geomout.o +sumsl_flag_ 0x4 unres.o +execer_pg 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +links_split_ 0x8 unres.o +precomp1_ 0x70800 unres.o +bounds_ 0x4b00 readrtns_CSA.o +MPIR_I_2DCOMPLEX 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +alphaa_ 0x1e788 readrtns_CSA.o +MPIR_errhandlers 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initutil.o) +chain_ 0x54680 unres.o +parfiles_ 0xb00 unres.o +globmemsize 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +rotat_old_ 0x9600 unres.o +bank_ 0x25920 readrtns_CSA.o +p4_rm_rank 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +contacts1_ 0xc5d3c0 unres.o +mce_ 0x230 readrtns_CSA.o +diploc_ 0x3938 unres.o +mucarem_ 0x8000 readrtns_CSA.o +mdpmpi_ 0x8014 unres.o +iounits_ 0x6c unres.o +MPI_DOUBLE_INT_var 0x10 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +mapp_ 0x25804 readrtns_CSA.o +MPIR_real8_dte 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +p4_brdcst_info 0x18 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +langforc_ 0x26782534 readrtns_CSA.o +MPIR_I_2INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +minvar_ 0x12d78 readrtns_CSA.o +torsion_ 0x5adc parmread.o +struct_ 0xa2c readrtns_CSA.o +procgroup_file 0x100 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +mdpar_ 0x6c unres.o +MPID_MyWorldSize 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(adi2init.o) +spinka_ 0x384c newconf.o +thetas_ 0x960 chainbuild.o +__P4FROM 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4priv.o) +MPIR_int1_dte 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +MPIR_debug_q 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +MPIR_debug_sq 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +MPID_MyWorldRank 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(adi2init.o) +remdrestart_ 0x411808 unres.o +for__pthread_mutex_unlock_ptr + 0x8 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_aio.o) +restr_ 0xce44 unres.o +locel_ 0x274 energy_p_new_barrier.o +MPIR_I_REAL 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +fourier_ 0x344 initialize_p.o +precomp2_ 0x70800 unres.o +torsiond_ 0x14200 initialize_p.o +for__a_argv 0x8 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_init.o) +MPIR_debug_rh 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +pool_ 0x5dc5c readrtns_CSA.o +maxgrad_ 0xa8 energy_p_new_barrier.o +double_muca_ 0x25828 readrtns_CSA.o +links_ 0x107035c unres.o +MPID_byte_order 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(chhetero.o) +p4_global 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_I_2REAL 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +mdgrad_ 0x1c230 unres.o +execer_mastport 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +from_zscore_ 0xc unres.o +csa_input_ 0x98 readrtns_CSA.o +for__pthread_mutex_init_ptr + 0x8 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_aio.o) +machsw_ 0xc initialize_p.o +types_ 0x54 unres.o +MPIR_I_USHORT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_FLOAT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +sccalc_ 0x28 energy_p_new_barrier.o +pochodne_ 0xb01310 geomout.o +loc_work_ 0x30c local_move.o +peptbond_ 0x28 chainbuild.o +MPIR_I_UINT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +calc_ 0x1f0 gen_rand_conf.o +execer_id 0x84 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPI_FLOAT_INT_var 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +execer_numtotnodes 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +derivat_ 0x436dbe8 initialize_p.o +MPIR_I_BYTE 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_CHAR 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +deriv_scloc_ 0x3f480 initialize_p.o +listener_info 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +przechowalnia_ 0x7080000 MREMD.o +MPIR_All_communicators + 0x10 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +diffcuta_ 0x8 readrtns_CSA.o +vectors_ 0x62700 energy_p_new_barrier.o +thread_ 0x148 readrtns_CSA.o +back_constr_ 0x165cc unres.o +MPIR_I_PACKED 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +p4_local 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_I_DCOMPLEX 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +logging_flag 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +pizda_ 0x12c0 readrtns_CSA.o +execer_myhost 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_rhandles 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(adi2init.o) +MPIR_topo_els 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initutil.o) +par_ 0x20 eigen.o +info_ 0x4010 timing.o +MPIR_I_INTEGER 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +tty_orig 0x12 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_secure.o) +MPIR_I_DOUBLE_INT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +mpgrad_ 0x2588 initialize_p.o +info1_ 0x2824 timing.o +setup_ 0x6040 unres.o +p4_wd 0x100 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_Op_errno 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(global_ops.o) +restraints_ 0x8 unres.o +MPIR_I_LONG_DOUBLE 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +torcnstr_ 0x7098 initialize_p.o +stochcalc_ 0xe100 MD_A-MTS.o +MPIR_I_2FLOAT 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_real4_dte 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +indices_ 0x7060 chainbuild.o +qmeas_ 0x7633c unres.o +MPID_recvs 0x20 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(queue.o) +mpipriv_ 0x24 unres.o +p4_remote_debug_level + 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_shandles 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(adi2init.o) +total_pack_unacked 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(chpackflow.o) +kutas_ 0x4 energy_p_new_barrier.o +cntrl_ 0x7c unres.o +sserver_port 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +rotmat_ 0x54600 unres.o +varin_ 0x12d48 readrtns_CSA.o +p4_myname_in_procgroup + 0x40 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +lagrange_ 0x1085e2b8 unres.o +message_catalog 0x8 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_diags_intel.o) +MPIR_I_UCHAR 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +fnames_ 0x1007 unres.o +loc_const_ 0x40 local_move.o +stoptim_ 0x4 unres.o +sclocal_ 0x22cc chainbuild.o +time1_ 0x30 unres.o +MPIR_I_2DOUBLE 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +bank_disulfid_ 0x1f0 readrtns_CSA.o +MPID_pack_info 0x10 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(chpackflow.o) +MPIR_debug_qh 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +mdcalc_ 0x108 unres.o +dipmat_ 0xafc8000 unres.o +hand_start_remotes 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +execer_starting_remotes + 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +remdcommon_ 0x6030 unres.o +sbridge_ 0x9c unres.o +refer_ 0x98 bond_move.o +csafiles_ 0xc00 unres.o +MPIR_tid 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initutil.o) +thread1_ 0x1cd0 readrtns_CSA.o +langmat_ 0x83d6000 readrtns_CSA.o +__P4GLOBALTYPE 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4priv.o) +integer_muca_ 0xc readrtns_CSA.o +MPI_SHORT_INT_var 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +inertia_ 0x160 unres.o +mcm_ 0x20a4 initialize_p.o +MPIR_I_2DOUBLE_PRECISION + 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +for__pthread_mutex_lock_ptr + 0x8 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_aio.o) +mce_counters_ 0x14 readrtns_CSA.o +aaaa_ 0x8 MP.o +store0_ 0x4 geomout.o +MPIR_I_2INTEGER 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +banii_ 0xe100 banach.o +scrot_ 0x28a0 parmread.o +c_frag_ 0x2588 geomout.o +move_ 0x4b78 initialize_p.o +MPIR_fdtels 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initutil.o) +MPIR_I_LONG 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +vrandd_ 0x3f0 randgens.o +syfek_ 0xe100 stochfric.o +whoami_p4 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +windows_ 0x3844 initialize_p.o +contacts_hb_ 0x4e483c0 unres.o +MPIR_debug_s 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +MPIR_I_ULONG 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_hbt_els 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(util_hbt.o) +srutu_ 0x4 unres.o +contdistrib_ 0x2c0944c unres.o +expect_ack 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(chpackflow.o) +MPIR_hbts 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(util_hbt.o) +__P4TYPE 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4priv.o) +traj1cache_ 0x480dc unres.o +accept_stats_ 0x2008 initialize_p.o +execer_masthost 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +for__l_argc 0x4 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_init.o) +invlen_ 0x4b00 chainbuild.o +MPIR_I_LONG_DOUBLE_INT + 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_debug_c 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +MPI_LONG_INT_var 0x10 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +MPIR_I_LB 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +p4_debug_level 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +stretch_ 0x608 unres.o +for__aio_lub_table 0x400 /opt/intel/Compiler/11.1/046/lib/intel64/libifcore.a(for_aio.o) +iofile_ 0x65c initialize_p.o +MPIR_qels 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initutil.o) +__P4LEN 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4priv.o) +local_domain 0x64 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +minimm_ 0x20 initialize_p.o +MPIR_debug_qel 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +send2_ 0x151b0 readrtns_CSA.o +MPIR_debug_sqel 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) +MPIR_I_2COMPLEX 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +gucio_ 0x18 MD_A-MTS.o +ch_debug_buf 0x80 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(adi2init.o) +execer_mynumprocs 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +contacts_ 0x38408 unres.o +__BLNK__ 0xc djacob.o +MPIR_I_LOGICAL 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +MPIR_int2_dte 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +geo_ 0x40 unres.o +execer_mynodenum 0x4 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(p4_globals.o) +MPIR_int4_dte 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initfutil.o) +MPIR_I_DOUBLE 0xa8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(initdte.o) +csaunits_ 0x34 unres.o +body_ 0x6180 unres.o +interact_ 0x154bc unres.o +theta_abinitio_ 0x24a70 chainbuild.o +oldgeo_ 0xbb8f4 unres.o +rotat_ 0x38400 unres.o +var_ 0x35e90 unres.o +secondarys_ 0x4b0 dihed_cons.o +MPIR_debug_cl 0x8 /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh/lib/libmpich.a(debugutil.o) + diff --git a/source/unres/src_MD-M-newcorr/tau.options b/source/unres/src_MD-M-newcorr/tau.options new file mode 100644 index 0000000..f17ddc3 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/tau.options @@ -0,0 +1,41 @@ +Usage: tau_compiler.sh + -optVerbose Turn on verbose debugging message + -optDetectMemoryLeaks Track mallocs/frees using TAU's memory wrapper + -optPdtDir="" PDT architecture directory. Typically $(PDTDIR)/$(PDTARCHDIR) + -optPdtF95Opts="" Options for Fortran parser in PDT (f95parse) + -optPdtF95Reset="" Reset options to the Fortran parser to the given list + -optPdtCOpts="" Options for C parser in PDT (cparse). Typically $(TAU_MPI_INCLUDE) $(TAU_INCLUDE) $(TAU_DEFS) + -optPdtCReset="" Reset options to the C parser to the given list + -optPdtCxxOpts="" Options for C++ parser in PDT (cxxparse). Typically $(TAU_MPI_INCLUDE) $(TAU_INCLUDE) $(TAU_DEFS) + -optPdtCxxReset="" Reset options to the C++ parser to the given list + -optPdtF90Parser="" Specify a different Fortran parser. For e.g., f90parse instead of f95parse + -optPdtGnuFortranParser Specify the GNU gfortran PDT parser gfparse instead of f95parse + -optPdtUser="" Optional arguments for parsing source code + -optTauInstr="" Specify location of tau_instrumentor. Typically $(TAUROOT)/$(CONFIG_ARCH)/bin/tau_instrumentor + -optPreProcess Preprocess the source code before parsing. Uses /usr/bin/cpp -P by default. + -optCPP="" Specify an alternative preprocessor and pre-process the sources. + -optCPPOpts="" Specify additional options to the C pre-processor. + -optCPPReset="" Reset C preprocessor options to the specified list. + -optTauSelectFile="" Specify selective instrumentation file for tau_instrumentor + -optPDBFile="" Specify PDB file for tau_instrumentor. Skips parsing stage. + -optTau="" Specify options for tau_instrumentor + -optCompile="" Options passed to the compiler by the user. + -optTauDefs="" Options passed to the compiler by TAU. Typically $(TAU_DEFS) + -optTauIncludes="" Options passed to the compiler by TAU. Typically $(TAU_MPI_INCLUDE) $(TAU_INCLUDE) + -optIncludeMemory="" Flags for replacement of malloc/free. Typically -I$(TAU_DIR)/include/Memory + -optReset="" Reset options to the compiler to the given list + -optLinking="" Options passed to the linker. Typically $(TAU_MPI_FLIBS) $(TAU_LIBS) $(TAU_CXXLIBS) + -optLinkReset="" Reset options to the linker to the given list + -optTauCC="" Specifies the C compiler used by TAU + -optOpariTool="" Specifies the location of the Opari tool + -optOpariDir="" Specifies the location of the Opari directory + -optOpariOpts="" Specifies optional arguments to the Opari tool + -optOpariReset="" Resets options passed to the Opari tool + -optNoMpi Removes -l*mpi* libraries during linking (default) + -optMpi Does not remove -l*mpi* libraries during linking + -optNoRevert Exit on error. Does not revert to the original compilation rule on error. + -optRevert Revert to the original compilation rule on error (default). + -optKeepFiles Does not remove intermediate .pdb and .inst.* files + -optAppCC="" Specifies the fallback C compiler. + -optAppCXX="" Specifies the fallback C++ compiler. + -optAppF90="" Specifies the fallback F90 compiler. diff --git a/source/unres/src_MD-M-newcorr/test.F b/source/unres/src_MD-M-newcorr/test.F new file mode 100644 index 0000000..4c7a728 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/test.F @@ -0,0 +1,2707 @@ + subroutine test + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + 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_n16 + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + 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 jdata(5) + logical debug + debug=.true. + +c + call geom_to_var(nvar,var1) + call chainbuild + call etotal(energy(0)) + etot=energy(0) + write(iout,*) nnt,nct,etot + call write_pdb(1,'first structure',etot) + call secondary2(.true.) + + do i=1,4 + jdata(i)=bfrag(i,2) + enddo + + DO ij=1,4 + ieval=0 + jdata(5)=ij + call var_to_geom(nvar,var1) + write(iout,*) 'N16 test',(jdata(i),i=1,5) + call beta_slide(jdata(1),jdata(2),jdata(3),jdata(4),jdata(5) + & ,ieval,ij) + call geom_to_var(nvar,var) + + if (minim) then + time0=MPI_WTIME() + call minimize(etot,var,iretcode,nfun) + write(iout,*)'------------------------------------------------' + write(iout,*)'SUMSL return code is',iretcode,' eval ',nfun, + & '+ DIST eval',ieval + + time1=MPI_WTIME() + 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(ij*100+99,'full min',etot) + endif + + + ENDDO + + 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 test11 + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + include 'COMMON.FFIELD' + include 'COMMON.MINIM' +c + include 'COMMON.DISTFIT' + integer if(20,maxres),nif,ifa(20) + integer ibc(0:maxres,0:maxres),istrand(20) + integer ibd(maxres),ifb(10,2),nifb,lifb(10),lifb0 + integer itmp(20,maxres) + double precision time0,time1 + double precision energy(0:n_ene),ee + double precision varia(maxvar),vorg(maxvar) +c + logical debug,ltest,usedbfrag(maxres/3) + character*50 linia +c + integer betasheet(maxres),ibetasheet(maxres),nbetasheet + integer bstrand(maxres/3,6),nbstrand + +c------------------------ + + debug=.true. +c------------------------ + nbstrand=0 + nbetasheet=0 + do i=1,nres + betasheet(i)=0 + ibetasheet(i)=0 + enddo + call geom_to_var(nvar,vorg) + call secondary2(debug) + + if (nbfrag.le.1) return + + do i=1,nbfrag + usedbfrag(i)=.false. + enddo + + + nbetasheet=nbetasheet+1 + nbstrand=2 + bstrand(1,1)=bfrag(1,1) + bstrand(1,2)=bfrag(2,1) + bstrand(1,3)=nbetasheet + bstrand(1,4)=1 + bstrand(1,5)=bfrag(1,1) + bstrand(1,6)=bfrag(2,1) + do i=bfrag(1,1),bfrag(2,1) + betasheet(i)=nbetasheet + ibetasheet(i)=1 + enddo +c + bstrand(2,1)=bfrag(3,1) + bstrand(2,2)=bfrag(4,1) + bstrand(2,3)=nbetasheet + bstrand(2,5)=bfrag(3,1) + bstrand(2,6)=bfrag(4,1) + + if (bfrag(3,1).le.bfrag(4,1)) then + bstrand(2,4)=2 + do i=bfrag(3,1),bfrag(4,1) + betasheet(i)=nbetasheet + ibetasheet(i)=2 + enddo + else + bstrand(2,4)=-2 + do i=bfrag(4,1),bfrag(3,1) + betasheet(i)=nbetasheet + ibetasheet(i)=2 + enddo + endif + + iused_nbfrag=1 + + do while (iused_nbfrag.ne.nbfrag) + + do j=2,nbfrag + + IF (.not.usedbfrag(j)) THEN + + write (*,*) j,(bfrag(i,j),i=1,4) + do jk=6,1,-1 + write (*,'(i4,a3,10i4)') jk,'B',(bstrand(i,jk),i=1,nbstrand) + enddo + write (*,*) '------------------' + + + if (bfrag(3,j).le.bfrag(4,j)) then + do i=bfrag(3,j),bfrag(4,j) + if(betasheet(i).eq.nbetasheet) then + in=ibetasheet(i) + do k=bfrag(3,j),bfrag(4,j) + betasheet(k)=nbetasheet + ibetasheet(k)=in + enddo + nbstrand=nbstrand+1 + usedbfrag(j)=.true. + iused_nbfrag=iused_nbfrag+1 + do k=bfrag(1,j),bfrag(2,j) + betasheet(k)=nbetasheet + ibetasheet(k)=nbstrand + enddo + if (bstrand(in,4).lt.0) then + bstrand(nbstrand,1)=bfrag(2,j) + bstrand(nbstrand,2)=bfrag(1,j) + bstrand(nbstrand,3)=nbetasheet + bstrand(nbstrand,4)=-nbstrand + bstrand(nbstrand,5)=bstrand(nbstrand,1) + bstrand(nbstrand,6)=bstrand(nbstrand,2) + if(bstrand(in,1).lt.bfrag(4,j)) then + call bgrow(bstrand,nbstrand,in,1,bfrag(4,j)) + else + bstrand(nbstrand,5)=bstrand(nbstrand,5)+ + & (bstrand(in,5)-bfrag(4,j)) + endif + if(bstrand(in,2).gt.bfrag(3,j)) then + call bgrow(bstrand,nbstrand,in,2,bfrag(3,j)) + else + bstrand(nbstrand,6)=bstrand(nbstrand,6)- + & (-bstrand(in,6)+bfrag(3,j)) + endif + else + bstrand(nbstrand,1)=bfrag(1,j) + bstrand(nbstrand,2)=bfrag(2,j) + bstrand(nbstrand,3)=nbetasheet + bstrand(nbstrand,4)=nbstrand + bstrand(nbstrand,5)=bstrand(nbstrand,1) + bstrand(nbstrand,6)=bstrand(nbstrand,2) + if(bstrand(in,1).gt.bfrag(3,j)) then + call bgrow(bstrand,nbstrand,in,1,bfrag(3,j)) + else + bstrand(nbstrand,5)=bstrand(nbstrand,5)- + & (-bstrand(in,5)+bfrag(3,j)) + endif + if(bstrand(in,2).lt.bfrag(4,j)) then + call bgrow(bstrand,nbstrand,in,2,bfrag(4,j)) + else + bstrand(nbstrand,6)=bstrand(nbstrand,6)+ + & (bstrand(in,6)-bfrag(4,j)) + endif + endif + goto 11 + endif + if(betasheet(bfrag(1,j)+i-bfrag(3,j)).eq.nbetasheet) then + in=ibetasheet(bfrag(1,j)+i-bfrag(3,j)) + do k=bfrag(1,j),bfrag(2,j) + betasheet(k)=nbetasheet + ibetasheet(k)=in + enddo + nbstrand=nbstrand+1 + usedbfrag(j)=.true. + iused_nbfrag=iused_nbfrag+1 + do k=bfrag(3,1),bfrag(4,1) + betasheet(k)=nbetasheet + ibetasheet(k)=nbstrand + enddo + if (bstrand(in,4).lt.0) then + bstrand(nbstrand,1)=bfrag(4,j) + bstrand(nbstrand,2)=bfrag(3,j) + bstrand(nbstrand,3)=nbetasheet + bstrand(nbstrand,4)=-nbstrand + bstrand(nbstrand,5)=bstrand(nbstrand,1) + bstrand(nbstrand,6)=bstrand(nbstrand,2) + if(bstrand(in,1).lt.bfrag(2,j)) then + call bgrow(bstrand,nbstrand,in,1,bfrag(2,j)) + else + bstrand(nbstrand,5)=bstrand(nbstrand,5)+ + & (bstrand(in,5)-bfrag(2,j)) + endif + if(bstrand(in,2).gt.bfrag(1,j)) then + call bgrow(bstrand,nbstrand,in,2,bfrag(1,j)) + else + bstrand(nbstrand,6)=bstrand(nbstrand,6)- + & (-bstrand(in,6)+bfrag(1,j)) + endif + else + bstrand(nbstrand,1)=bfrag(3,j) + bstrand(nbstrand,2)=bfrag(4,j) + bstrand(nbstrand,3)=nbetasheet + bstrand(nbstrand,4)=nbstrand + bstrand(nbstrand,5)=bstrand(nbstrand,1) + bstrand(nbstrand,6)=bstrand(nbstrand,2) + if(bstrand(in,1).gt.bfrag(1,j)) then + call bgrow(bstrand,nbstrand,in,1,bfrag(1,j)) + else + bstrand(nbstrand,5)=bstrand(nbstrand,5)- + & (-bstrand(in,5)+bfrag(1,j)) + endif + if(bstrand(in,2).lt.bfrag(2,j)) then + call bgrow(bstrand,nbstrand,in,2,bfrag(2,j)) + else + bstrand(nbstrand,6)=bstrand(nbstrand,6)+ + & (bstrand(in,6)-bfrag(2,j)) + endif + endif + goto 11 + endif + enddo + else + do i=bfrag(4,j),bfrag(3,j) + if(betasheet(i).eq.nbetasheet) then + in=ibetasheet(i) + do k=bfrag(4,j),bfrag(3,j) + betasheet(k)=nbetasheet + ibetasheet(k)=in + enddo + nbstrand=nbstrand+1 + usedbfrag(j)=.true. + iused_nbfrag=iused_nbfrag+1 + do k=bfrag(1,j),bfrag(2,j) + betasheet(k)=nbetasheet + ibetasheet(k)=nbstrand + enddo + if (bstrand(in,4).lt.0) then + bstrand(nbstrand,1)=bfrag(1,j) + bstrand(nbstrand,2)=bfrag(2,j) + bstrand(nbstrand,3)=nbetasheet + bstrand(nbstrand,4)=nbstrand + bstrand(nbstrand,5)=bstrand(nbstrand,1) + bstrand(nbstrand,6)=bstrand(nbstrand,2) + if(bstrand(in,1).lt.bfrag(3,j)) then + call bgrow(bstrand,nbstrand,in,1,bfrag(3,j)) + else + bstrand(nbstrand,5)=bstrand(nbstrand,5)- + & (bstrand(in,5)-bfrag(3,j)) + endif + if(bstrand(in,2).gt.bfrag(4,j)) then + call bgrow(bstrand,nbstrand,in,2,bfrag(4,j)) + else + bstrand(nbstrand,6)=bstrand(nbstrand,6)+ + & (-bstrand(in,6)+bfrag(4,j)) + endif + else + bstrand(nbstrand,1)=bfrag(2,j) + bstrand(nbstrand,2)=bfrag(1,j) + bstrand(nbstrand,3)=nbetasheet + bstrand(nbstrand,4)=-nbstrand + bstrand(nbstrand,5)=bstrand(nbstrand,1) + bstrand(nbstrand,6)=bstrand(nbstrand,2) + if(bstrand(in,1).gt.bfrag(4,j)) then + call bgrow(bstrand,nbstrand,in,1,bfrag(4,j)) + else + bstrand(nbstrand,5)=bstrand(nbstrand,5)+ + & (-bstrand(in,5)+bfrag(4,j)) + endif + if(bstrand(in,2).lt.bfrag(3,j)) then + call bgrow(bstrand,nbstrand,in,2,bfrag(3,j)) + else + bstrand(nbstrand,6)=bstrand(nbstrand,6)- + & (bstrand(in,6)-bfrag(3,j)) + endif + endif + goto 11 + endif + if(betasheet(bfrag(2,j)-i+bfrag(4,j)).eq.nbetasheet) then + in=ibetasheet(bfrag(2,j)-i+bfrag(4,j)) + do k=bfrag(1,j),bfrag(2,j) + betasheet(k)=nbetasheet + ibetasheet(k)=in + enddo + nbstrand=nbstrand+1 + usedbfrag(j)=.true. + iused_nbfrag=iused_nbfrag+1 + do k=bfrag(4,j),bfrag(3,j) + betasheet(k)=nbetasheet + ibetasheet(k)=nbstrand + enddo + if (bstrand(in,4).lt.0) then + bstrand(nbstrand,1)=bfrag(4,j) + bstrand(nbstrand,2)=bfrag(3,j) + bstrand(nbstrand,3)=nbetasheet + bstrand(nbstrand,4)=nbstrand + bstrand(nbstrand,5)=bstrand(nbstrand,1) + bstrand(nbstrand,6)=bstrand(nbstrand,2) + if(bstrand(in,1).lt.bfrag(2,j)) then + call bgrow(bstrand,nbstrand,in,1,bfrag(2,j)) + else + bstrand(nbstrand,5)=bstrand(nbstrand,5)- + & (bstrand(in,5)-bfrag(2,j)) + endif + if(bstrand(in,2).gt.bfrag(1,j)) then + call bgrow(bstrand,nbstrand,in,2,bfrag(1,j)) + else + bstrand(nbstrand,6)=bstrand(nbstrand,6)+ + & (-bstrand(in,6)+bfrag(1,j)) + endif + else + bstrand(nbstrand,1)=bfrag(3,j) + bstrand(nbstrand,2)=bfrag(4,j) + bstrand(nbstrand,3)=nbetasheet + bstrand(nbstrand,4)=-nbstrand + bstrand(nbstrand,5)=bstrand(nbstrand,1) + bstrand(nbstrand,6)=bstrand(nbstrand,2) + if(bstrand(in,1).gt.bfrag(1,j)) then + call bgrow(bstrand,nbstrand,in,1,bfrag(1,j)) + else + bstrand(nbstrand,5)=bstrand(nbstrand,5)+ + & (-bstrand(in,5)+bfrag(1,j)) + endif + if(bstrand(in,2).lt.bfrag(2,j)) then + call bgrow(bstrand,nbstrand,in,2,bfrag(2,j)) + else + bstrand(nbstrand,6)=bstrand(nbstrand,6)- + & (bstrand(in,6)-bfrag(2,j)) + endif + endif + goto 11 + endif + enddo + endif + + + + ENDIF + enddo + + j=2 + do while (usedbfrag(j)) + j=j+1 + enddo + + nbstrand=nbstrand+1 + nbetasheet=nbetasheet+1 + bstrand(nbstrand,1)=bfrag(1,j) + bstrand(nbstrand,2)=bfrag(2,j) + bstrand(nbstrand,3)=nbetasheet + bstrand(nbstrand,5)=bfrag(1,j) + bstrand(nbstrand,6)=bfrag(2,j) + + bstrand(nbstrand,4)=nbstrand + do i=bfrag(1,j),bfrag(2,j) + betasheet(i)=nbetasheet + ibetasheet(i)=nbstrand + enddo +c + nbstrand=nbstrand+1 + bstrand(nbstrand,1)=bfrag(3,j) + bstrand(nbstrand,2)=bfrag(4,j) + bstrand(nbstrand,3)=nbetasheet + bstrand(nbstrand,5)=bfrag(3,j) + bstrand(nbstrand,6)=bfrag(4,j) + + if (bfrag(3,j).le.bfrag(4,j)) then + bstrand(nbstrand,4)=nbstrand + do i=bfrag(3,j),bfrag(4,j) + betasheet(i)=nbetasheet + ibetasheet(i)=nbstrand + enddo + else + bstrand(nbstrand,4)=-nbstrand + do i=bfrag(4,j),bfrag(3,j) + betasheet(i)=nbetasheet + ibetasheet(i)=nbstrand + enddo + endif + + iused_nbfrag=iused_nbfrag+1 + usedbfrag(j)=.true. + + + 11 continue + do jk=6,1,-1 + write (*,'(i4,a3,10i4)') jk,'A',(bstrand(i,jk),i=1,nbstrand) + enddo + + + enddo + + do i=1,nres + if (betasheet(i).ne.0) write(*,*) i,betasheet(i),ibetasheet(i) + enddo + write(*,*) + do j=6,1,-1 + write (*,'(i4,a3,10i4)') j,':',(bstrand(i,j),i=1,nbstrand) + enddo + +c------------------------ + nifb=0 + do i=1,nbstrand + do j=i+1,nbstrand + if(iabs(bstrand(i,5)-bstrand(j,5)).le.5 .or. + & iabs(bstrand(i,6)-bstrand(j,6)).le.5 ) then + nifb=nifb+1 + ifb(nifb,1)=bstrand(i,4) + ifb(nifb,2)=bstrand(j,4) + endif + enddo + enddo + + write(*,*) + do i=1,nifb + write (*,'(a3,20i4)') "ifb",i,ifb(i,1),ifb(i,2) + enddo + + do i=1,nbstrand + ifa(i)=bstrand(i,4) + enddo + write (*,'(a3,20i4)') "ifa",(ifa(i),i=1,nbstrand) + + nif=iabs(bstrand(1,6)-bstrand(1,5))+1 + do j=2,nbstrand + if (iabs(bstrand(j,6)-bstrand(j,5))+1.gt.nif) + & nif=iabs(bstrand(j,6)-bstrand(j,5))+1 + enddo + + write(*,*) nif + do i=1,nif + do j=1,nbstrand + if(j,i)=bstrand(j,6)+(i-1)*sign(1,bstrand(j,5)-bstrand(j,6)) + if (if(j,i).gt.0) then + if(betasheet(if(j,i)).eq.0 .or. + & ibetasheet(if(j,i)).ne.iabs(bstrand(j,4))) if(j,i)=0 + else + if(j,i)=0 + endif + enddo + write(*,'(a3,10i4)') 'if ',(if(j,i),j=1,nbstrand) + enddo + +c read (inp,*) (ifa(i),i=1,4) +c do i=1,nres +c read (inp,*,err=20,end=20) (if(j,i),j=1,4) +c enddo +c 20 nif=i-1 + stop +c------------------------ + + isa=4 + is=2*isa-1 + iconf=0 +cccccccccccccccccccccccccccccccccc + DO ig=1,is**isa-1 +cccccccccccccccccccccccccccccccccc + + ii=ig + do j=1,is + istrand(is-j+1)=int(ii/is**(is-j)) + ii=ii-istrand(is-j+1)*is**(is-j) + enddo + ltest=.true. + do k=1,isa + istrand(k)=istrand(k)+1 + if(istrand(k).gt.isa) istrand(k)=istrand(k)-2*isa-1 + enddo + do k=1,isa + do l=1,isa + if(istrand(k).eq.istrand(l).and.k.ne.l.or. + & istrand(k).eq.-istrand(l).and.k.ne.l) ltest=.false. + enddo + enddo + + lifb0=1 + do m=1,nifb + lifb(m)=0 + do k=1,isa-1 + if( + & ifb(m,1).eq.istrand(k).and.ifb(m,2).eq.istrand(k+1).or. + & ifb(m,2).eq.istrand(k).and.ifb(m,1).eq.istrand(k+1).or. + & -ifb(m,1).eq.istrand(k).and.-ifb(m,2).eq.istrand(k+1).or. + & -ifb(m,2).eq.istrand(k).and.-ifb(m,1).eq.istrand(k+1)) + & lifb(m)=1 + enddo + lifb0=lifb0*lifb(m) + enddo + + if (mod(isa,2).eq.0) then + do k=isa/2+1,isa + if (istrand(k).eq.1) ltest=.false. + enddo + else + do k=(isa+1)/2+1,isa + if (istrand(k).eq.1) ltest=.false. + enddo + endif + + IF (ltest.and.lifb0.eq.1) THEN + iconf=iconf+1 + + call var_to_geom(nvar,vorg) + + write (*,'(i5,i10,10i3)') iconf,ig,(istrand(k),k=1,isa) + write (iout,'(i5,i10,10i3)') iconf,ig,(istrand(k),k=1,isa) + write (linia,'(10i3)') (istrand(k),k=1,isa) + + do i=1,nres + do j=1,nres + ibc(i,j)=0 + enddo + enddo + + + do i=1,4 + if ( sign(1,istrand(i)).eq.sign(1,ifa(iabs(istrand(i)))) ) then + do j=1,nif + itmp(iabs(istrand(i)),j)=if(iabs(ifa(iabs(istrand(i)))),j) + enddo + else + do j=1,nif + itmp(iabs(istrand(i)),j)=if(iabs(ifa(iabs(istrand(i)))),nif-j+1) + enddo + endif + enddo + + do i=1,nif + write(*,*) (itmp(j,i),j=1,4) + enddo + + do i=1,nif +c ifa(1),ifa(2),ifa(3),ifa(4) +c if(1,i),if(2,i),if(3,i),if(4,i) + do k=1,isa-1 + ltest=.false. + do m=1,nifb + if( + & ifb(m,1).eq.istrand(k).and.ifb(m,2).eq.istrand(k+1).or. + & ifb(m,2).eq.istrand(k).and.ifb(m,1).eq.istrand(k+1).or. + & -ifb(m,1).eq.istrand(k).and.-ifb(m,2).eq.istrand(k+1).or. + & -ifb(m,2).eq.istrand(k).and.-ifb(m,1).eq.istrand(k+1)) + & then + ltest=.true. + goto 110 + endif + enddo + 110 continue + if (ltest) then + ibc(itmp(iabs(istrand(k)),i),itmp(iabs(istrand(k+1)),i))=-1 + else + ibc(itmp(iabs(istrand(k)),i),itmp(iabs(istrand(k+1)),i))=-2 + endif +c + if (k.lt.3) + & ibc(itmp(iabs(istrand(k)),i),itmp(iabs(istrand(k+2)),i))=-3 + if (k.lt.2) + & ibc(itmp(iabs(istrand(k)),i),itmp(iabs(istrand(k+3)),i))=-4 + enddo + enddo +c------------------------ + +c +c freeze sec.elements +c + do i=1,nres + mask(i)=1 + mask_phi(i)=1 + mask_theta(i)=1 + mask_side(i)=1 + enddo + + do j=1,nbfrag + do i=bfrag(1,j),bfrag(2,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + enddo + if (bfrag(3,j).le.bfrag(4,j)) then + do i=bfrag(3,j),bfrag(4,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + enddo + else + do i=bfrag(4,j),bfrag(3,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + enddo + endif + enddo + do j=1,nhfrag + do i=hfrag(1,j),hfrag(2,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + enddo + enddo + mask_r=.true. + +c------------------------ +c generate constrains +c + nhpb0=nhpb + call chainbuild + ind=0 + do i=1,nres-3 + do j=i+3,nres + ind=ind+1 + if ( ibc(i,j).eq.-1 .or. ibc(j,i).eq.-1) then + d0(ind)=DIST(i,j) + w(ind)=10.0 + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=10.0 + dhpb(nhpb)=d0(ind) + else if ( ibc(i,j).eq.-2 .or. ibc(j,i).eq.-2) then + d0(ind)=5.0 + w(ind)=10.0 + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=10.0 + dhpb(nhpb)=d0(ind) + else if ( ibc(i,j).eq.-3 .or. ibc(j,i).eq.-3) then + d0(ind)=11.0 + w(ind)=10.0 + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=10.0 + dhpb(nhpb)=d0(ind) + else if ( ibc(i,j).eq.-4 .or. ibc(j,i).eq.-4) then + d0(ind)=16.0 + w(ind)=10.0 + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=10.0 + dhpb(nhpb)=d0(ind) + else if ( ibc(i,j).gt.0 ) then + d0(ind)=DIST(i,ibc(i,j)) + w(ind)=10.0 + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=10.0 + dhpb(nhpb)=d0(ind) + else if ( ibc(j,i).gt.0 ) then + d0(ind)=DIST(ibc(j,i),j) + w(ind)=10.0 + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=10.0 + dhpb(nhpb)=d0(ind) + else + w(ind)=0.0 + endif + dd(ind)=d0(ind) + enddo + enddo + call hpb_partition +cd-------------------------- + + write(iout,'(i3,2i4,a3,2i4,f7.2)') (i,ibc(ihpb(i),jhpb(i)), + & ibc(jhpb(i),ihpb(i)),' --', + & ihpb(i),jhpb(i),dhpb(i),i=1,nhpb) + +cd nhpb=0 +cd goto 901 +c +c + call contact_cp_min(varia,ifun,iconf,linia,debug) + if (minim) then + time0=MPI_WTIME() + call minimize(etot,varia,iretcode,nfun) + write(iout,*)'------------------------------------------------' + write(iout,*)'SUMSL return code is',iretcode,' eval ',nfun, + & '+ DIST eval',ifun + + time1=MPI_WTIME() + write (iout,'(a,f6.2,f8.2,a)')' Time for full min.',time1-time0, + & nfun/(time1-time0),' eval/s' + + write (linia,'(a10,10i3)') 'full_min',(istrand(k),k=1,isa) + call var_to_geom(nvar,varia) + call chainbuild + call write_pdb(900+iconf,linia,etot) + endif + + call etotal(energy(0)) + etot=energy(0) + call enerprint(energy(0)) +cd call intout +cd call briefout(0,etot) +cd call secondary2(.true.) + + 901 CONTINUE +ctest return +cccccccccccccccccccccccccccccccccccc + ENDIF + ENDDO +cccccccccccccccccccccccccccccccccccc + + return + 10 write (iout,'(a)') 'Error reading test structure.' + return + end +c-------------------------------------------------------- + + subroutine test3 + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + include 'COMMON.FFIELD' + include 'COMMON.MINIM' +c + include 'COMMON.DISTFIT' + integer if(3,maxres),nif + integer ibc(maxres,maxres),istrand(20) + integer ibd(maxres),ifb(10,2),nifb,lifb(10),lifb0 + double precision time0,time1 + double precision energy(0:n_ene),ee + double precision varia(maxvar) +c + logical debug,ltest + character*50 linia +c + do i=1,nres + read (inp,*,err=20,end=20) if(1,i),if(2,i),if(3,i) + enddo + 20 nif=i-1 + write (*,'(a4,3i5)') ('if =',if(1,i),if(2,i),if(3,i), + & i=1,nif) + + +c------------------------ + call secondary2(debug) +c------------------------ + do i=1,nres + do j=1,nres + ibc(i,j)=0 + enddo + enddo + +c +c freeze sec.elements and store indexes for beta constrains +c + do i=1,nres + mask(i)=1 + mask_phi(i)=1 + mask_theta(i)=1 + mask_side(i)=1 + enddo + + do j=1,nbfrag + do i=bfrag(1,j),bfrag(2,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + enddo + if (bfrag(3,j).le.bfrag(4,j)) then + do i=bfrag(3,j),bfrag(4,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + ibc(bfrag(1,j)+i-bfrag(3,j),i)=-1 + enddo + else + do i=bfrag(4,j),bfrag(3,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + ibc(bfrag(2,j)-i+bfrag(4,j),i)=-1 + enddo + endif + enddo + do j=1,nhfrag + do i=hfrag(1,j),hfrag(2,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + enddo + enddo + mask_r=.true. + + +c ---------------- test -------------- + do i=1,nif + if (ibc(if(1,i),if(2,i)).eq.-1) then + ibc(if(1,i),if(2,i))=if(3,i) + ibc(if(1,i),if(3,i))=if(2,i) + else if (ibc(if(2,i),if(1,i)).eq.-1) then + ibc(if(2,i),if(1,i))=0 + ibc(if(1,i),if(2,i))=if(3,i) + ibc(if(1,i),if(3,i))=if(2,i) + else + ibc(if(1,i),if(2,i))=if(3,i) + ibc(if(1,i),if(3,i))=if(2,i) + endif + enddo + + do i=1,nres + do j=1,nres + if (ibc(i,j).ne.0) write(*,'(3i5)') i,j,ibc(i,j) + enddo + enddo +c------------------------ + call chainbuild + ind=0 + do i=1,nres-3 + do j=i+3,nres + ind=ind+1 + if ( ibc(i,j).eq.-1 ) then + d0(ind)=DIST(i,j) + w(ind)=10.0 + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=10.0 + dhpb(nhpb)=d0(ind) + else if ( ibc(i,j).gt.0 ) then + d0(ind)=DIST(i,ibc(i,j)) + w(ind)=10.0 + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=10.0 + dhpb(nhpb)=d0(ind) + else if ( ibc(j,i).gt.0 ) then + d0(ind)=DIST(ibc(j,i),j) + w(ind)=10.0 + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=10.0 + dhpb(nhpb)=d0(ind) + else + w(ind)=0.0 + endif + enddo + enddo + call hpb_partition + +cd-------------------------- + write(*,'(i3,2i4,a3,2i4,f7.2)') (i,ibc(ihpb(i),jhpb(i)), + & ibc(jhpb(i),ihpb(i)),' --', + & ihpb(i),jhpb(i),dhpb(i),i=1,nhpb) + + + linia='dist' + debug=.true. + in_pdb=7 +c + call contact_cp_min(varia,ieval,in_pdb,linia,debug) + if (minim) then + time0=MPI_WTIME() + call minimize(etot,varia,iretcode,nfun) + write(iout,*)'------------------------------------------------' + write(iout,*)'SUMSL return code is',iretcode,' eval ',nfun, + & '+ DIST eval',ieval + + time1=MPI_WTIME() + write (iout,'(a,f6.2,f8.2,a)')' Time for full min.',time1-time0, + & nfun/(time1-time0),' eval/s' + + + call var_to_geom(nvar,varia) + call chainbuild + call write_pdb(999,'full min',etot) + endif + + call etotal(energy(0)) + etot=energy(0) + call enerprint(energy(0)) + call intout + call briefout(0,etot) + call secondary2(.true.) + + return + 10 write (iout,'(a)') 'Error reading test structure.' + return + end + + + + + subroutine test__ + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + include 'COMMON.FFIELD' + include 'COMMON.MINIM' +c + include 'COMMON.DISTFIT' + integer if(2,2),ind + integer iff(maxres) + double precision time0,time1 + double precision energy(0:n_ene),ee + double precision theta2(maxres),phi2(maxres),alph2(maxres), + & omeg2(maxres), + & theta1(maxres),phi1(maxres),alph1(maxres), + & omeg1(maxres) + double precision varia(maxvar),varia2(maxvar) +c + + + read (inp,*,err=10,end=10) if(1,1),if(1,2),if(2,1),if(2,2) + write (iout,'(a4,4i5)') 'if =',if(1,1),if(1,2),if(2,1),if(2,2) + read (inp,*,err=10,end=10) (theta2(i),i=3,nres) + read (inp,*,err=10,end=10) (phi2(i),i=4,nres) + read (inp,*,err=10,end=10) (alph2(i),i=2,nres-1) + read (inp,*,err=10,end=10) (omeg2(i),i=2,nres-1) + do i=1,nres + theta2(i)=deg2rad*theta2(i) + phi2(i)=deg2rad*phi2(i) + alph2(i)=deg2rad*alph2(i) + omeg2(i)=deg2rad*omeg2(i) + enddo + do i=1,nres + theta1(i)=theta(i) + phi1(i)=phi(i) + alph1(i)=alph(i) + omeg1(i)=omeg(i) + enddo + + do i=1,nres + mask(i)=1 + enddo + + +c------------------------ + do i=1,nres + iff(i)=0 + enddo + do j=1,2 + do i=if(j,1),if(j,2) + iff(i)=1 + enddo + enddo + + call chainbuild + call geom_to_var(nvar,varia) + call write_pdb(1,'first structure',0d0) + + call secondary(.true.) + + call secondary2(.true.) + + do j=1,nbfrag + if ( (bfrag(3,j).lt.bfrag(4,j) .or. + & bfrag(4,j)-bfrag(2,j).gt.4) .and. + & bfrag(2,j)-bfrag(1,j).gt.3 ) then + nn=nn+1 + + if (bfrag(3,j).lt.bfrag(4,j)) then + write(iout,'(a6,i3,a1,i3,a1,i3,a1,i3)') + & "select",bfrag(1,j)-1,"-",bfrag(2,j)-1 + & ,",",bfrag(3,j)-1,"-",bfrag(4,j)-1 + else + write(iout,'(a6,i3,a1,i3,a1,i3,a1,i3)') + & "select",bfrag(1,j)-1,"-",bfrag(2,j)-1 + & ,",",bfrag(4,j)-1,"-",bfrag(3,j)-1 + endif + endif + enddo + + do i=1,nres + theta(i)=theta2(i) + phi(i)=phi2(i) + alph(i)=alph2(i) + omeg(i)=omeg2(i) + enddo + + call chainbuild + call geom_to_var(nvar,varia2) + call write_pdb(2,'second structure',0d0) + + + +c------------------------------------------------------- + + ifun=-1 + call contact_cp(varia,varia2,iff,ifun,7) + if (minim) then + time0=MPI_WTIME() + call minimize(etot,varia,iretcode,nfun) + write(iout,*)'------------------------------------------------' + write(iout,*)'SUMSL return code is',iretcode,' eval ',nfun, + & '+ DIST eval',ifun + + time1=MPI_WTIME() + write (iout,'(a,f6.2,f8.2,a)')' Time for full min.',time1-time0, + & nfun/(time1-time0),' eval/s' + + + call var_to_geom(nvar,varia) + call chainbuild + call write_pdb(999,'full min',etot) + endif + + call etotal(energy(0)) + etot=energy(0) + call enerprint(energy(0)) + call intout + call briefout(0,etot) + + return + 10 write (iout,'(a)') 'Error reading test structure.' + return + end + +c------------------------------------------------- +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 contact_cp2(var,var2,iff,ieval,in_pdb) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SBRIDGE' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.DISTFIT' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.MINIM' + + character*50 linia + integer nf,ij(4) + double precision var(maxvar),var2(maxvar) + double precision time0,time1 + integer iff(maxres),ieval + double precision theta1(maxres),phi1(maxres),alph1(maxres), + & omeg1(maxres) + + + call var_to_geom(nvar,var) + call chainbuild + nhpb0=nhpb + ind=0 + do i=1,nres-3 + do j=i+3,nres + ind=ind+1 + if ( iff(i).eq.1.and.iff(j).eq.1 ) then + d0(ind)=DIST(i,j) + w(ind)=10.0 + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=10.0 + dhpb(nhpb)=d0(ind) + else + w(ind)=0.0 + endif + enddo + enddo + call hpb_partition + + do i=1,nres + theta1(i)=theta(i) + phi1(i)=phi(i) + alph1(i)=alph(i) + omeg1(i)=omeg(i) + enddo + + call var_to_geom(nvar,var2) + + do i=1,nres + if ( iff(i).eq.1 ) then + theta(i)=theta1(i) + phi(i)=phi1(i) + alph(i)=alph1(i) + omeg(i)=omeg1(i) + endif + enddo + + call chainbuild +cd call write_pdb(3,'combined structure',0d0) +cd time0=MPI_WTIME() + + NX=NRES-3 + NY=((NRES-4)*(NRES-5))/2 + call distfit(.true.,200) + +cd time1=MPI_WTIME() +cd write (iout,'(a,f6.2,a)') ' Time for distfit ',time1-time0,' sec' + + ipot0=ipot + maxmin0=maxmin + maxfun0=maxfun + wstrain0=wstrain + + ipot=6 + maxmin=2000 + maxfun=5000 + call geom_to_var(nvar,var) +cd time0=MPI_WTIME() + call minimize(etot,var,iretcode,nfun) + write(iout,*)'SUMSL return code is',iretcode,' eval SOFT',nfun + +cd time1=MPI_WTIME() +cd write (iout,'(a,f6.2,f8.2,a)')' Time for soft min.',time1-time0, +cd & nfun/(time1-time0),' SOFT eval/s' + call var_to_geom(nvar,var) + call chainbuild + + + iwsk=0 + nf=0 + if (iff(1).eq.1) then + iwsk=1 + nf=nf+1 + ij(nf)=0 + endif + do i=2,nres + if ( iwsk.eq.0.and.iff(i-1).eq.0.and.iff(i).eq.1 ) then + iwsk=1 + nf=nf+1 + ij(nf)=i + endif + if ( iwsk.eq.1.and.iff(i-1).eq.1.and.iff(i).eq.0 ) then + iwsk=0 + nf=nf+1 + ij(nf)=i-1 + endif + enddo + if (iff(nres).eq.1) then + nf=nf+1 + ij(nf)=nres + endif + + +cd write(linia,'(a6,i3,a1,i3,a1,i3,a1,i3)') +cd & "select",ij(1),"-",ij(2), +cd & ",",ij(3),"-",ij(4) +cd call write_pdb(in_pdb,linia,etot) + + + ipot=ipot0 + maxmin=maxmin0 + maxfun=maxfun0 +cd time0=MPI_WTIME() + call minimize(etot,var,iretcode,nfun) +cd write(iout,*)'SUMSL DIST return code is',iretcode,' eval ',nfun + ieval=nfun + +cd time1=MPI_WTIME() +cd write (iout,'(a,f6.2,f8.2,a)')' Time for DIST min.',time1-time0, +cd & nfun/(time1-time0),' eval/s' +cd call var_to_geom(nvar,var) +cd call chainbuild +cd call write_pdb(6,'dist structure',etot) + + + nhpb= nhpb0 + link_start=1 + link_end=nhpb + wstrain=wstrain0 + + return + end +c----------------------------------------------------------- + subroutine contact_cp(var,var2,iff,ieval,in_pdb) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.DISTFIT' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.MINIM' + + character*50 linia + integer nf,ij(4) + double precision energy(0:n_ene) + double precision var(maxvar),var2(maxvar) + double precision time0,time1 + integer iff(maxres),ieval + double precision theta1(maxres),phi1(maxres),alph1(maxres), + & omeg1(maxres) + logical debug + + debug=.false. +c debug=.true. + if (ieval.eq.-1) debug=.true. + + +c +c store selected dist. constrains from 1st structure +c +#ifdef OSF +c Intercept NaNs in the coordinates +c write(iout,*) (var(i),i=1,nvar) + x_sum=0.D0 + do i=1,nvar + x_sum=x_sum+var(i) + enddo + if (x_sum.ne.x_sum) then + write(iout,*)" *** contact_cp : Found NaN in coordinates" + call flush(iout) + print *," *** contact_cp : Found NaN in coordinates" + return + endif +#endif + + + call var_to_geom(nvar,var) + call chainbuild + nhpb0=nhpb + ind=0 + do i=1,nres-3 + do j=i+3,nres + ind=ind+1 + if ( iff(i).eq.1.and.iff(j).eq.1 ) then + d0(ind)=DIST(i,j) + w(ind)=10.0 + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=10.0 + dhpb(nhpb)=d0(ind) + else + w(ind)=0.0 + endif + enddo + enddo + call hpb_partition + + do i=1,nres + theta1(i)=theta(i) + phi1(i)=phi(i) + alph1(i)=alph(i) + omeg1(i)=omeg(i) + enddo + +c +c freeze sec.elements from 2nd structure +c + do i=1,nres + mask_phi(i)=1 + mask_theta(i)=1 + mask_side(i)=1 + enddo + + call var_to_geom(nvar,var2) + call secondary2(debug) + do j=1,nbfrag + do i=bfrag(1,j),bfrag(2,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + enddo + if (bfrag(3,j).le.bfrag(4,j)) then + do i=bfrag(3,j),bfrag(4,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + enddo + else + do i=bfrag(4,j),bfrag(3,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + enddo + endif + enddo + do j=1,nhfrag + do i=hfrag(1,j),hfrag(2,j) + mask(i)=0 + mask_phi(i)=0 + mask_theta(i)=0 + enddo + enddo + mask_r=.true. + +c +c copy selected res from 1st to 2nd structure +c + + do i=1,nres + if ( iff(i).eq.1 ) then + theta(i)=theta1(i) + phi(i)=phi1(i) + alph(i)=alph1(i) + omeg(i)=omeg1(i) + endif + enddo + + if(debug) then +c +c prepare description in linia variable +c + iwsk=0 + nf=0 + if (iff(1).eq.1) then + iwsk=1 + nf=nf+1 + ij(nf)=1 + endif + do i=2,nres + if ( iwsk.eq.0.and.iff(i-1).eq.0.and.iff(i).eq.1 ) then + iwsk=1 + nf=nf+1 + ij(nf)=i + endif + if ( iwsk.eq.1.and.iff(i-1).eq.1.and.iff(i).eq.0 ) then + iwsk=0 + nf=nf+1 + ij(nf)=i-1 + endif + enddo + if (iff(nres).eq.1) then + nf=nf+1 + ij(nf)=nres + endif + + write(linia,'(a6,i3,a1,i3,a1,i3,a1,i3)') + & "SELECT",ij(1)-1,"-",ij(2)-1, + & ",",ij(3)-1,"-",ij(4)-1 + + endif +c +c run optimization +c + call contact_cp_min(var,ieval,in_pdb,linia,debug) + + return + end + + subroutine contact_cp_min(var,ieval,in_pdb,linia,debug) +c +c input : theta,phi,alph,omeg,in_pdb,linia,debug +c output : var,ieval +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SBRIDGE' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.DISTFIT' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.MINIM' + + character*50 linia + integer nf,ij(4) + double precision energy(0:n_ene) + double precision var(maxvar) + double precision time0,time1 + integer ieval,info(3) + logical debug,fail,check_var,reduce,change + + write(iout,'(a20,i6,a20)') + & '------------------',in_pdb,'-------------------' + + if (debug) then + call chainbuild + call write_pdb(1000+in_pdb,'combined structure',0d0) + time0=MPI_WTIME() + endif + +c +c run optimization of distances +c +c uses d0(),w() and mask() for frozen 2D +c +ctest--------------------------------------------- +ctest NX=NRES-3 +ctest NY=((NRES-4)*(NRES-5))/2 +ctest call distfit(debug,5000) + + do i=1,nres + mask_side(i)=0 + enddo + + ipot01=ipot + maxmin01=maxmin + maxfun01=maxfun +c wstrain01=wstrain + wsc01=wsc + wscp01=wscp + welec01=welec + wvdwpp01=wvdwpp +c wang01=wang + wscloc01=wscloc + wtor01=wtor + wtor_d01=wtor_d + + ipot=6 + maxmin=2000 + maxfun=4000 +c wstrain=1.0 + wsc=0.0 + wscp=0.0 + welec=0.0 + wvdwpp=0.0 +c wang=0.0 + wscloc=0.0 + wtor=0.0 + wtor_d=0.0 + + call geom_to_var(nvar,var) +cde change=reduce(var) + if (check_var(var,info)) then + write(iout,*) 'cp_min error in input' + print *,'cp_min error in input' + return + endif + +cd call etotal(energy(0)) +cd call enerprint(energy(0)) +cd call check_eint + + time0=MPI_WTIME() +cdtest call minimize(etot,var,iretcode,nfun) +cdtest write(iout,*)'SUMSL return code is',iretcode,' eval SDIST',nfun + time1=MPI_WTIME() + +cd call etotal(energy(0)) +cd call enerprint(energy(0)) +cd call check_eint + + do i=1,nres + mask_side(i)=1 + enddo + + ipot=ipot01 + maxmin=maxmin01 + maxfun=maxfun01 +c wstrain=wstrain01 + wsc=wsc01 + wscp=wscp01 + welec=welec01 + wvdwpp=wvdwpp01 +c wang=wang01 + wscloc=wscloc01 + wtor=wtor01 + wtor_d=wtor_d01 +ctest-------------------------------------------------- + + if(debug) then + time1=MPI_WTIME() + write (iout,'(a,f6.2,a)')' Time for distfit ',time1-time0,' sec' + call write_pdb(2000+in_pdb,'distfit structure',0d0) + endif + + + ipot0=ipot + maxmin0=maxmin + maxfun0=maxfun + wstrain0=wstrain +c +c run soft pot. optimization +c with constrains: +c nhpb,ihpb(),jhpb(),forcon(),dhpb() and hpb_partition +c and frozen 2D: +c mask_phi(),mask_theta(),mask_side(),mask_r +c + ipot=6 + maxmin=2000 + maxfun=4000 + +cde change=reduce(var) +cde if (check_var(var,info)) write(iout,*) 'error before soft' + time0=MPI_WTIME() + call minimize(etot,var,iretcode,nfun) + + write(iout,*)'SUMSL return code is',iretcode,' eval SOFT',nfun + time1=MPI_WTIME() + 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(3000+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 + maxmin=maxmin0 + maxfun=maxfun0 +c +c check overlaps before calling full UNRES minim +c + call var_to_geom(nvar,var) + call chainbuild + call etotal(energy(0)) +#ifdef OSF + write(iout,*) 'N7 ',energy(0) + if (energy(0).ne.energy(0)) then + write(iout,*) 'N7 error - gives NaN',energy(0) + endif +#endif + ieval=1 + if (energy(1).eq.1.0d20) then + write (iout,'(a,1pe14.5)')'#N7_OVERLAP evdw=1d20',energy(1) + call overlap_sc(fail) + if(.not.fail) then + call etotal(energy(0)) + ieval=ieval+1 + write (iout,'(a,1pe14.5)')'#N7_OVERLAP evdw after',energy(1) + else + mask_r=.false. + nhpb= nhpb0 + link_start=1 + link_end=nhpb + wstrain=wstrain0 + return + endif + endif + call flush(iout) +c +cdte time0=MPI_WTIME() +cde change=reduce(var) +cde if (check_var(var,info)) then +cde write(iout,*) 'error before mask dist' +cde call var_to_geom(nvar,var) +cde call chainbuild +cde call write_pdb(10000+in_pdb,'before mask dist',etot) +cde endif +cdte call minimize(etot,var,iretcode,nfun) +cdte write(iout,*)'SUMSL MASK DIST return code is',iretcode, +cdte & ' eval ',nfun +cdte ieval=ieval+nfun +cdte +cdte time1=MPI_WTIME() +cdte write (iout,'(a,f6.2,f8.2,a)') +cdte & ' Time for mask dist min.',time1-time0, +cdte & nfun/(time1-time0),' eval/s' +cdte call flush(iout) + if (debug) then + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(4000+in_pdb,'mask dist',etot) + endif +c +c switch off freezing of 2D and +c run full UNRES optimization with constrains +c + mask_r=.false. + time0=MPI_WTIME() +cde change=reduce(var) +cde if (check_var(var,info)) then +cde write(iout,*) 'error before dist' +cde call var_to_geom(nvar,var) +cde call chainbuild +cde call write_pdb(11000+in_pdb,'before dist',etot) +cde endif + + call minimize(etot,var,iretcode,nfun) + +cde change=reduce(var) +cde if (check_var(var,info)) then +cde write(iout,*) 'error after dist',ico +cde call var_to_geom(nvar,var) +cde call chainbuild +cde call write_pdb(12000+in_pdb+ico*1000,'after dist',etot) +cde endif + write(iout,*)'SUMSL DIST return code is',iretcode,' eval ',nfun + ieval=ieval+nfun + + time1=MPI_WTIME() + write (iout,'(a,f6.2,f8.2,a)')' Time for dist min.',time1-time0, + & nfun/(time1-time0),' eval/s' +cde call etotal(energy(0)) +cde write(iout,*) 'N7 after dist',energy(0) + call flush(iout) + + if (debug) then + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(in_pdb,linia,etot) + endif +c +c reset constrains +c + nhpb= nhpb0 + link_start=1 + link_end=nhpb + wstrain=wstrain0 + + return + end +c-------------------------------------------------------- + subroutine softreg + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + 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) + time0=MPI_WTIME() + call minimize(etot,var,iretcode,nfun) + + write(iout,*)'SUMSL return code is',iretcode,' eval SOFT',nfun + time1=MPI_WTIME() + 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 + time0=MPI_WTIME() + call minimize(etot,var,iretcode,nfun) + write(iout,*)'SUMSL MASK DIST return code is',iretcode, + & ' eval ',nfun + ieval=nfun + + time1=MPI_WTIME() + 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 + + + time0=MPI_WTIME() + call minimize(etot,var,iretcode,nfun) + write(iout,*)'SUMSL MASK return code is',iretcode,' eval ',nfun + ieval=ieval+nfun + + time1=MPI_WTIME() + 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 + + time0=MPI_WTIME() + 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 + + time1=MPI_WTIME() + 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 + time0=MPI_WTIME() + call minimize(etot,var,iretcode,nfun) + write(iout,*)'------------------------------------------------' + write(iout,*)'SUMSL return code is',iretcode,' eval ',nfun, + & '+ DIST eval',ieval + + time1=MPI_WTIME() + 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 + + + subroutine beta_slide(i1,i2,i3,i4,i5,ieval,ij) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + 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) + integer jdata(5),isec(maxres) +c + jdata(1)=i1 + jdata(2)=i2 + jdata(3)=i3 + jdata(4)=i4 + jdata(5)=i5 + + call secondary2(.false.) + + do i=1,nres + isec(i)=0 + enddo + do j=1,nbfrag + do i=bfrag(1,j),bfrag(2,j) + isec(i)=1 + enddo + do i=bfrag(4,j),bfrag(3,j),sign(1,bfrag(3,j)-bfrag(4,j)) + isec(i)=1 + enddo + enddo + do j=1,nhfrag + do i=hfrag(1,j),hfrag(2,j) + isec(i)=2 + enddo + enddo + +c +c cut strands at the ends +c + if (jdata(2)-jdata(1).gt.3) then + jdata(1)=jdata(1)+1 + jdata(2)=jdata(2)-1 + if (jdata(3).lt.jdata(4)) then + jdata(3)=jdata(3)+1 + jdata(4)=jdata(4)-1 + else + jdata(3)=jdata(3)-1 + jdata(4)=jdata(4)+1 + endif + endif + +cv call chainbuild +cv call etotal(energy(0)) +cv etot=energy(0) +cv write(iout,*) nnt,nct,etot +cv call write_pdb(ij*100,'first structure',etot) +cv write(iout,*) 'N16 test',(jdata(i),i=1,5) + +c------------------------ +c generate constrains +c + ishift=jdata(5)-2 + if(ishift.eq.0) ishift=-2 + nhpb0=nhpb + call chainbuild + do i=jdata(1),jdata(2) + isec(i)=-1 + if(jdata(4).gt.jdata(3))then + do j=jdata(3)+i-jdata(1)-2,jdata(3)+i-jdata(1)+2 + isec(j)=-1 +cd print *,i,j,j+ishift + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=1000.0 + dhpb(nhpb)=DIST(i,j+ishift) + enddo + else + do j=jdata(3)-i+jdata(1)+2,jdata(3)-i+jdata(1)-2,-1 + isec(j)=-1 +cd print *,i,j,j+ishift + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=1000.0 + dhpb(nhpb)=DIST(i,j+ishift) + enddo + endif + enddo + + do i=nnt,nct-2 + do j=i+2,nct + if(isec(i).gt.0.or.isec(j).gt.0) then +cd print *,i,j + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=0.1 + dhpb(nhpb)=DIST(i,j) + endif + enddo + enddo + + call hpb_partition + + call geom_to_var(nvar,var) + maxfun0=maxfun + wstrain0=wstrain + maxfun=4000/5 + + do ico=1,5 + + wstrain=wstrain0/ico + +cv time0=MPI_WTIME() + 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=ieval+nfun +cv time1=MPI_WTIME() +cv write (iout,'(a,f6.2,f8.2,a)') +cv & ' Time for dist min.',time1-time0, +cv & nfun/(time1-time0),' eval/s' +cv call var_to_geom(nvar,var) +cv call chainbuild +cv call write_pdb(ij*100+ico,'dist cons',etot) + + enddo +c + nhpb=nhpb0 + call hpb_partition + wstrain=wstrain0 + maxfun=maxfun0 +c +cd print *,etot + wscloc0=wscloc + wscloc=10.0 + call sc_move(nnt,nct,100,100d0,nft_sc,etot) + wscloc=wscloc0 +cv call chainbuild +cv call etotal(energy(0)) +cv etot=energy(0) +cv call write_pdb(ij*100+10,'sc_move',etot) +cd call intout +cd print *,nft_sc,etot + + return + end + + subroutine beta_zip(i1,i2,ieval,ij) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + 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) + character*10 test + +cv call chainbuild +cv call etotal(energy(0)) +cv etot=energy(0) +cv write(test,'(2i5)') i1,i2 +cv call write_pdb(ij*100,test,etot) +cv write(iout,*) 'N17 test',i1,i2,etot,ij + +c +c generate constrains +c + nhpb0=nhpb + nhpb=nhpb+1 + ihpb(nhpb)=i1 + jhpb(nhpb)=i2 + forcon(nhpb)=1000.0 + dhpb(nhpb)=4.0 + + call hpb_partition + + call geom_to_var(nvar,var) + maxfun0=maxfun + wstrain0=wstrain + maxfun=1000/5 + + do ico=1,5 + wstrain=wstrain0/ico +cv time0=MPI_WTIME() + 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=ieval+nfun +cv time1=MPI_WTIME() +cv write (iout,'(a,f6.2,f8.2,a)') +cv & ' Time for dist min.',time1-time0, +cv & nfun/(time1-time0),' eval/s' +c do not comment the next line + call var_to_geom(nvar,var) +cv call chainbuild +cv call write_pdb(ij*100+ico,'dist cons',etot) + enddo + + nhpb=nhpb0 + call hpb_partition + wstrain=wstrain0 + maxfun=maxfun0 + +cv call etotal(energy(0)) +cv etot=energy(0) +cv write(iout,*) 'N17 test end',i1,i2,etot,ij + + + return + end diff --git a/source/unres/src_MD-M-newcorr/thread.F b/source/unres/src_MD-M-newcorr/thread.F new file mode 100644 index 0000000..f713744 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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.ntyp1) 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.ntyp1) 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-M-newcorr/timing.F b/source/unres/src_MD-M-newcorr/timing.F new file mode 100644 index 0000000..838d2d7 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/timing.F @@ -0,0 +1,337 @@ +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' + 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 + 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' + 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 + 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-M-newcorr/together.F b/source/unres/src_MD-M-newcorr/together.F new file mode 100644 index 0000000..b0e0997 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/together.F @@ -0,0 +1,1222 @@ + Subroutine together +c feeds tasks for parallel processing + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + real ran1,ran2 + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.TIME1' + include 'COMMON.SETUP' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + real tcpu + double precision time_start,time_start_c,time0f,time0i + logical ovrtim,sync_iter,timeout,flag,timeout1 + dimension muster(mpi_status_size) + dimension t100(0:100),indx(mxio) + dimension xout(maxvar),eout(mxch*(mxch+1)/2+1),ind(9) + dimension cout(2) + parameter (rad=1.745329252d-2) + +cccccccccccccccccccccccccccccccccccccccccccccccc + IF (ME.EQ.KING) THEN + + time0f=MPI_WTIME() + ilastnstep=1 + sync_iter=.false. + numch=1 + nrmsdb=0 + nrmsdb1=0 + rmsdbc1c=rmsdbc1 + nstep=0 + call csa_read + call make_array + + if(iref.ne.0) call from_int(1,0,idum) + +c To minimize input conformation (bank conformation) +c Output to $mol.reminimized + if (irestart.lt.0) then + call read_bank(0,nft,cutdifr) + if (irestart.lt.-10) then + p_cut=nres*4.d0 + call prune_bank(p_cut) + return + endif + call reminimize(jlee) + return + endif + + if (irestart.eq.0) then + call initial_write + nbank=nconf + ntbank=nconf + if (ntbankm.eq.0) ntbank=0 + nstep=0 + nft=0 + do i=1,mxio + ibank(i)=0 + jbank(i)=0 + enddo + else + call restart_write +c!bankt call read_bankt(jlee,nft,cutdifr) + call read_bank(jlee,nft,cutdifr) + call read_rbank(jlee,adif) + if(iref.ne.0) call from_int(1,0,idum) + endif + + nstmax=nstmax+nstep + ntrial=n1+n2+n3+n4+n5+n6+n7+n8 + ntry=ntrial+1 + ntry=ntry*nseed + +c ntrial : number of trial conformations per seed. +c ntry : total number of trial conformations including seed conformations. + + idum2=-123 +c imax=2**31-1 + imax=huge(0) + ENDIF + + call mpi_bcast(jend,1,mpi_integer,0,CG_COMM,ierr) +cccccccccccccccccccccccccccccccccccccccc + do 300 jlee=1,jend +cccccccccccccccccccccccccccccccccccccccc + 331 continue + IF (ME.EQ.KING) THEN + if(sync_iter) goto 333 + idum=- ran2(idum2)*imax + if(jlee.lt.jstart) goto 300 + +C Restart the random number generator for conformation generation + + if(irestart.gt.0) then + idum2=idum2+nstep + if(idum2.le.0) idum2=-idum2+1 + idum=- ran2(idum2)*imax + endif + + idumm=idum + call vrndst(idumm) + + open(icsa_seed,file=csa_seed,status="old") + write(icsa_seed,*) "jlee : ",jlee + close(icsa_seed) + + call history_append + write(icsa_history,*) "number of procs is ",nodes + write(icsa_history,*) jlee,idum,idum2 + close(icsa_history) + +cccccccccccccccccccccccccccccccccccccccccccccccc + 333 icycle=0 + + call history_append + write(icsa_history,*) "nbank is ",nbank + close(icsa_history) + + if(irestart.eq.1) goto 111 + if(irestart.eq.2) then + icycle=0 + do i=1,nbank + ibank(i)=1 + enddo + do i=nbank+1,nbank+nconf + ibank(i)=0 + enddo + endif + +c start energy minimization + nconfr=max0(nconf+nadd,nodes-1) + if (sync_iter) nconf_in=0 +c king-emperor - feed input and sort output + write (iout,*) "NCONF_IN",nconf_in + m=0 + if (nconf_in.gt.0) then +c al 7/2/00 - added possibility to read in some of the initial conformations + do m=1,nconf_in + read (intin,'(i5)',end=11,err=12) iconf + 12 continue + write (iout,*) "write READ_ANGLES",iconf,m + call read_angles(intin,*11) + if (iref.eq.0) then + mm=m + else + mm=m+1 + endif + do j=2,nres-1 + dihang_in(1,j,1,mm)=theta(j+1) + dihang_in(2,j,1,mm)=phi(j+2) + dihang_in(3,j,1,mm)=alph(j) + dihang_in(4,j,1,mm)=omeg(j) + enddo + enddo ! m + goto 13 + 11 write (iout,*) nconf_in," conformations requested, but only", + & m-1," found in the angle file." + nconf_in=m-1 + 13 continue + m=nconf_in + write (iout,*) nconf_in, + & " initial conformations have been read in." + endif + if (iref.eq.0) then + if (nconfr.gt.nconf_in) then + call make_ranvar(nconfr,m,idum) + write (iout,*) nconfr-nconf_in, + & " conformations have been generated randomly." + endif + else + nconfr=nconfr*2 + call from_int(nconfr,m,idum) +c call from_pdb(nconfr,idum) + endif + write (iout,*) 'Exitted from make_ranvar nconfr=',nconfr + write (*,*) 'Exitted from make_ranvar nconfr=',nconfr + do m=1,nconfr + write (iout,*) 'Initial conformation',m + write(iout,'(8f10.4)') (rad2deg*dihang_in(1,j,1,m),j=2,nres-1) + write(iout,'(8f10.4)') (rad2deg*dihang_in(2,j,1,m),j=2,nres-1) + write(iout,'(8f10.4)') (rad2deg*dihang_in(3,j,1,m),j=2,nres-1) + write(iout,'(8f10.4)') (rad2deg*dihang_in(4,j,1,m),j=2,nres-1) + enddo + write(iout,*)'Calling FEEDIN NCONF',nconfr + time1i=MPI_WTIME() + call feedin(nconfr,nft) + write (iout,*) ' Time for first bank min.',MPI_WTIME()-time1i + call history_append + write(icsa_history,*) jlee,nft,nbank + write(icsa_history,851) (etot(i),i=1,nconfr) + write(icsa_history,850) (rmsn(i),i=1,nconfr) + write(icsa_history,850) (pncn(i),i=1,nconfr) + write(icsa_history,*) + close(icsa_history) + ELSE +c To minimize input conformation (bank conformation) +c Output to $mol.reminimized + if (irestart.lt.0) then + call reminimize(jlee) + return + endif + if (irestart.eq.1) goto 111 +c soldier - perform energy minimization + 334 call minim_jlee + ENDIF + +ccccccccccccccccccccccccccccccccccc +c need to syncronize all procs + call mpi_barrier(CG_COMM,ierr) + if (ierr.ne.0) then + print *, ' cannot synchronize MPI' + stop + endif +ccccccccccccccccccccccccccccccccccc + + IF (ME.EQ.KING) THEN + +c print *,"ok after minim" + nstep=nstep+nconf + if(irestart.eq.2) then + nbank=nbank+nconf +c ntbank=ntbank+nconf + if(ntbank.gt.ntbankm) ntbank=ntbankm + endif +c print *,"ok before indexx" + if(iref.eq.0) then + call indexx(nconfr,etot,indx) + else +c cc/al 7/6/00 + do k=1,nconfr + indx(k)=k + enddo + call indexx(nconfr-nconf_in,rmsn(nconf_in+1),indx(nconf_in+1)) + do k=nconf_in+1,nconfr + indx(k)=indx(k)+nconf_in + enddo +c cc/al +c call indexx(nconfr,rmsn,indx) + endif +c print *,"ok after indexx" + do im=1,nconf + m=indx(im) + if (m.gt.mxio .or. m.lt.1) then + write (iout,*) 'Dimension ERROR in TOGEHER: IM',im,' M',m + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif + jbank(im+nbank-nconf)=0 + bene(im+nbank-nconf)=etot(m) + rene(im+nbank-nconf)=etot(m) +c!bankt btene(im)=etot(m) +c + brmsn(im+nbank-nconf)=rmsn(m) + bpncn(im+nbank-nconf)=pncn(m) + rrmsn(im+nbank-nconf)=rmsn(m) + rpncn(im+nbank-nconf)=pncn(m) + if (im+nbank-nconf.gt.mxio .or. im+nbank-nconf.lt.1) then + write (iout,*) 'Dimension ERROR in TOGEHER: IM',im, + & ' NBANK',nbank,' NCONF',nconf,' IM+NBANK-NCONF',im+nbank-nconf + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif + do k=1,numch + do j=2,nres-1 + do i=1,4 + bvar(i,j,k,im+nbank-nconf)=dihang(i,j,k,m) + rvar(i,j,k,im+nbank-nconf)=dihang(i,j,k,m) +c!bankt btvar(i,j,k,im)=dihang(i,j,k,m) +c + enddo + enddo + enddo + if(iref.eq.1) then + if(brmsn(im+nbank-nconf).gt.rmscut.or. + & bpncn(im+nbank-nconf).lt.pnccut) ibank(im+nbank-nconf)=9 + endif + if(vdisulf) then + bvar_ns(im+nbank-nconf)=ns-2*nss + k=0 + do i=1,ns + j=1 + do while( iss(i).ne.ihpb(j)-nres .and. + & iss(i).ne.jhpb(j)-nres .and. j.le.nss) + j=j+1 + enddo + if (j.gt.nss) then + k=k+1 + bvar_s(k,im+nbank-nconf)=iss(i) + endif + enddo + endif + bvar_nss(im+nbank-nconf)=nss + do i=1,nss + bvar_ss(1,i,im+nbank-nconf)=ihpb(i) + bvar_ss(2,i,im+nbank-nconf)=jhpb(i) + enddo + enddo + ENDIF + + 111 continue + + IF (ME.EQ.KING) THEN + + call find_max + call find_min + + call get_diff + if(nbank.eq.nconf.and.irestart.eq.0) then + adif=avedif + endif + + cutdif=adif/cut1 + ctdif1=adif/cut2 + +cd print *,"adif,xctdif,cutdifr" +cd print *,adif,xctdif,cutdifr + nst=ntotal/ntrial/nseed + xctdif=(cutdif/ctdif1)**(-1.0/nst) + if(irestart.ge.1) call estimate_cutdif(adif,xctdif,cutdifr) +c print *,"ok after estimate" + + irestart=0 + + call write_rbank(jlee,adif,nft) + call write_bank(jlee,nft) +c!bankt call write_bankt(jlee,nft) +c call write_bank1(jlee) + call history_append + write(icsa_history,*) "xctdif: ", xctdif,nst,adif/cut1,ctdif1 + write(icsa_history,851) (bene(i),i=1,nbank) + write(icsa_history,850) (brmsn(i),i=1,nbank) + write(icsa_history,850) (bpncn(i),i=1,nbank) + close(icsa_history) + 850 format(10f8.3) + 851 format(5e15.6) + + ifar=nseed/4*3+1 + ifar=nseed+1 + ENDIF + + + finished=.false. + iter = 0 + irecv = 0 + isent =0 + ifrom= 0 + time0i=MPI_WTIME() + time1i=time0i + time_start_c=time0i + if (.not.sync_iter) then + time_start=time0i + nft00=nft + else + sync_iter=.false. + endif + nft00_c=nft + nft0i=nft +ccccccccccccccccccccccccccccccccccccccc + do while (.not. finished) +ccccccccccccccccccccccccccccccccccccccc +crc print *,"iter ", iter,' isent=',isent + + IF (ME.EQ.KING) THEN +c start energy minimization + + if (isent.eq.0) then +c king-emperor - select seeds & make var & feed input +cd print *,'generating new conf',ntrial,MPI_WTIME() + call select_is(nseed,ifar,idum) + + open(icsa_seed,file=csa_seed,status="old") + write(icsa_seed,39) + & jlee,icycle,nstep,(is(i),bene(is(i)),i=1,nseed) + close(icsa_seed) + call history_append + write(icsa_history,40) jlee,icycle,nstep,cutdif,ibmin,ibmax, + * ebmin,ebmax,nft,iuse,nbank,ntbank + close(icsa_history) + + + + call make_var(ntry,idum,iter) +cd print *,'new trial generated',ntrial,MPI_WTIME() + time2i=MPI_WTIME() + write (iout,'(a20,i4,f12.2)') + & 'Time for make trial',iter+1,time2i-time1i + endif + +crc write(iout,*)'1:Calling FEEDIN NTRY',NTRY,' ntrial',ntrial +crc call feedin(ntry,nft) + + isent=isent+1 + if (isent.ge.nodes.or.iter.gt.0) then +ct print *,'waiting ',MPI_WTIME() + irecv=irecv+1 + call recv(0,ifrom,xout,eout,ind,timeout) +ct print *,' ',irecv,' received from',ifrom,MPI_WTIME() + else + ifrom=ifrom+1 + endif + +ct print *,'sending to',ifrom,MPI_WTIME() + call send(isent,ifrom,iter) +ct print *,isent,' sent ',MPI_WTIME() + +c store results ----------------------------------------------- + if (isent.ge.nodes.or.iter.gt.0) then + nft=nft+ind(3) + movernx(irecv)=iabs(ind(5)) + call getx(ind,xout,eout,cout,rad,iw_pdb,irecv) + if(vdisulf) then + nss_out(irecv)=nss + do i=1,nss + iss_out(i,irecv)=ihpb(i) + jss_out(i,irecv)=jhpb(i) + enddo + endif + if(iw_pdb.gt.0) + & call write_csa_pdb(xout,eout,nft,irecv,iw_pdb) + endif +c-------------------------------------------------------------- + if (isent.eq.ntry) then + time1i=MPI_WTIME() + write (iout,'(a18,f12.2,a14,f10.2)') + & 'Nonsetup time ',time1i-time_start_c, + & ' sec, Eval/s =',(nft-nft00_c)/(time1i-time_start_c) + write (iout,'(a14,i4,f12.2,a14,f10.2)') + & 'Time for iter ',iter+1,time1i-time0i, + & ' sec, Eval/s =',(nft-nft0i)/(time1i-time0i) + time0i=time1i + nft0i=nft + cutdif=cutdif*xctdif + if(cutdif.lt.ctdif1) cutdif=ctdif1 + if (iter.eq.0) then + print *,'UPDATING ',ntry-nodes+1,irecv + write(iout,*) 'UPDATING ',ntry-nodes+1 + iter=iter+1 +c----------------- call update(ntry-nodes+1) ------------------- + nstep=nstep+ntry-nseed-(nodes-1) + call refresh_bank(ntry-nodes+1) +c!bankt call refresh_bankt(ntry-nodes+1) + else +c----------------- call update(ntry) --------------------------- + iter=iter+1 + print *,'UPDATING ',ntry,irecv + write(iout,*) 'UPDATING ',ntry + nstep=nstep+ntry-nseed + call refresh_bank(ntry) +c!bankt call refresh_bankt(ntry) + endif +c----------------------------------------------------------------- + + call write_bank(jlee,nft) +c!bankt call write_bankt(jlee,nft) + call find_min + + time1i=MPI_WTIME() + write (iout,'(a20,i4,f12.2)') + & 'Time for refresh ',iter,time1i-time0i + + if(ebmin.lt.estop) finished=.true. + if(icycle.gt.icmax) then + call write_bank1(jlee) + do i=1,nbank + ibank(i)=2 + ibank(i)=1 + enddo + nbank=nbank+nconf + if(nbank.gt.1000) then + finished=.true. + else +crc goto 333 + sync_iter=.true. + endif + endif + if(nstep.gt.nstmax) finished=.true. + + if(finished.or.sync_iter) then + do ij=1,nodes-1 + call recv(1,ifrom,xout,eout,ind,timeout) + if (timeout) then + nstep=nstep+ij-1 + print *,'ERROR worker is not responding' + write(iout,*) 'ERROR worker is not responding' + time1i=MPI_WTIME()-time_start_c + print *,'End of cycle, master time for ',iter,' iters ', + & time1i,'sec, Eval/s ',(nft-nft00_c)/time1i + write (iout,*) 'End of cycle, master time for ',iter, + & ' iters ',time1i,' sec' + write (iout,*) 'Total eval/s ',(nft-nft00_c)/time1i + print *,'UPDATING ',ij-1 + write(iout,*) 'UPDATING ',ij-1 + call flush(iout) + call refresh_bank(ij-1) +c!bankt call refresh_bankt(ij-1) + goto 1002 + endif +c print *,'node ',ifrom,' finished ',ij,nft + write(iout,*) 'node ',ifrom,' finished ',ij,nft + call flush(iout) + nft=nft+ind(3) + movernx(ij)=iabs(ind(5)) + call getx(ind,xout,eout,cout,rad,iw_pdb,ij) + if(vdisulf) then + nss_out(ij)=nss + do i=1,nss + iss_out(i,ij)=ihpb(i) + jss_out(i,ij)=jhpb(i) + enddo + endif + if(iw_pdb.gt.0) + & call write_csa_pdb(xout,eout,nft,ij,iw_pdb) + enddo + nstep=nstep+nodes-1 +crc print *,'---------bcast finished--------',finished + time1i=MPI_WTIME()-time_start_c + print *,'End of cycle, master time for ',iter,' iters ', + & time1i,'sec, Eval/s ',(nft-nft00_c)/time1i + write (iout,*) 'End of cycle, master time for ',iter, + & ' iters ',time1i,' sec' + write (iout,*) 'Total eval/s ',(nft-nft00_c)/time1i + +ctimeout call mpi_bcast(finished,1,mpi_logical,0,CG_COMM,ierr) +ctimeout call mpi_bcast(sync_iter,1,mpi_logical,0, +ctimeout & CG_COMM,ierr) + do ij=1,nodes-1 + tstart=MPI_WTIME() + call mpi_issend(finished,1,mpi_logical,ij,idchar, + & CG_COMM,ireq,ierr) + call mpi_issend(sync_iter,1,mpi_logical,ij,idchar, + & CG_COMM,ireq2,ierr) + flag=.false. + timeout1=.false. + do while(.not. (flag .or. timeout1)) + call MPI_TEST(ireq2,flag,muster,ierr) + tend1=MPI_WTIME() + if(tend1-tstart.gt.60) then + print *,'ERROR worker ',ij,' is not responding' + write(iout,*) 'ERROR worker ',ij,' is not responding' + timeout1=.true. + endif + enddo + if(timeout1) then + write(iout,*) 'worker ',ij,' NOT OK ',tend1-tstart + timeout=.true. + else + write(iout,*) 'worker ',ij,' OK ',tend1-tstart + endif + enddo + print *,'UPDATING ',nodes-1,ij + write(iout,*) 'UPDATING ',nodes-1 + call refresh_bank(nodes-1) +c!bankt call refresh_bankt(nodes-1) + 1002 continue + call write_bank(jlee,nft) +c!bankt call write_bankt(jlee,nft) + call find_min + + do i=0,mxmv + do j=1,3 + nstatnx_tot(i,j)=nstatnx_tot(i,j)+nstatnx(i,j) + nstatnx(i,j)=0 + enddo + enddo + + write(iout,*)'### Total stats:' + do i=0,mxmv + if(nstatnx_tot(i,1).ne.0) then + if (i.le.9) then + write(iout,'(a5,i1,a7,i6,a7,i4,a5,i4,a5,f5.1)') + & '### N',i,' total=',nstatnx_tot(i,1), + & ' close=',nstatnx_tot(i,2),' far=',nstatnx_tot(i,3),'%acc', + & (nstatnx_tot(i,2)+nstatnx_tot(i,3))*100.0/nstatnx_tot(i,1) + else + write(iout,'(a4,i2,a7,i6,a7,i4,a5,i4,a5,f5.1)') + & '###N',i,' total=',nstatnx_tot(i,1), + & ' close=',nstatnx_tot(i,2),' far=',nstatnx_tot(i,3),'%acc', + & (nstatnx_tot(i,2)+nstatnx_tot(i,3))*100.0/nstatnx_tot(i,1) + endif + else + if (i.le.9) then + write(iout,'(a5,i1,a7,i6,a7,i4,a5,i4,a5,f5.1)') + & '### N',i,' total=',nstatnx_tot(i,1), + & ' close=',nstatnx_tot(i,2),' far=',nstatnx_tot(i,3), + & ' %acc',0.0 + else + write(iout,'(a4,i2,a7,i6,a7,i4,a5,i4,a5,f5.1)') + & '###N',i,' total=',nstatnx_tot(i,1), + & ' close=',nstatnx_tot(i,2),' far=',nstatnx_tot(i,3), + & ' %acc',0.0 + endif + endif + enddo + + endif + if(sync_iter) goto 331 + + 39 format(2i3,i7,5(i4,f8.3,1x),19(/,13x,5(i4,f8.3,1x))) + 40 format(2i2,i8,f8.1,2i4,2(1pe14.5),i10,3i4) + 43 format(10i8) + 44 format('jlee =',i3,':',4f10.1,' E =',f8.3,i7,i10) + + isent=0 + irecv=0 + endif + ELSE +c soldier - perform energy minimization + call minim_jlee + print *,'End of minim, proc',me,'time ',MPI_WTIME()-time_start + write (iout,*) 'End of minim, proc',me,'time ', + & MPI_WTIME()-time_start + call flush(iout) +ctimeout call mpi_bcast(finished,1,mpi_logical,0,CG_COMM,ierr) +ctimeout call mpi_bcast(sync_iter,1,mpi_logical,0,CG_COMM,ierr) + call mpi_recv(finished,1,mpi_logical,0,idchar, + * CG_COMM,muster,ierr) + call mpi_recv(sync_iter,1,mpi_logical,0,idchar, + * CG_COMM,muster,ierr) + if(sync_iter) goto 331 + ENDIF + +ccccccccccccccccccccccccccccccccccccccc + enddo +ccccccccccccccccccccccccccccccccccccccc + + IF (ME.EQ.KING) THEN + call history_append + write(icsa_history,40) jlee,icycle,nstep,cutdif,ibmin,ibmax, + * ebmin,ebmax,nft,iuse,nbank,ntbank + + write(icsa_history,44) jlee,0.0,0.0,0.0, + & 0.0,ebmin,nstep,nft + write(icsa_history,*) + close(icsa_history) + + time1i=MPI_WTIME()-time_start + print *,'End of RUN, master time ', + & time1i,'sec, Eval/s ',(nft-nft00)/time1i + write (iout,*) 'End of RUN, master time ', + & time1i,' sec' + write (iout,*) 'Total eval/s ',(nft-nft00)/time1i + + if(timeout) then + write(iout,*) '!!!! ERROR worker was not responding' + write(iout,*) '!!!! cannot finish work normally' + write(iout,*) 'Processor0 is calling MPI_ABORT' + print *,'!!!! ERROR worker was not responding' + print *,'!!!! cannot finish work normally' + print *,'Processor0 is calling MPI_ABORT' + call flush(iout) + call mpi_abort(mpi_comm_world, 111, ierr) + endif + ENDIF + +cccccccccccccccccccccccccccccc + 300 continue +cccccccccccccccccccccccccccccc + + return + end +c------------------------------------------------- + subroutine feedin(nconf,nft) +c sends out starting conformations and receives results of energy minimization + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + include 'mpif.h' + dimension xin(maxvar),xout(maxvar),eout(mxch*(mxch+1)/2+1), + * cout(2),ind(9),info(12) + dimension muster(mpi_status_size) + include 'COMMON.SETUP' + parameter (rad=1.745329252d-2) + + print *,'FEEDIN: NCONF=',nconf + mm=0 +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + if (nconf .lt. nodes-1) then + write (*,*) 'FATAL ERROR in FEEDIN, nconf < nodes -1', + & nconf,nodes-1 + write (iout,*) 'FATAL ERROR in FEEDIN, nconf < nodes -1', + & nconf,nodes-1 + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif + do n=1,nconf +c pull out external and internal variables for next start + call putx(xin,n,rad) +! write (iout,*) 'XIN from FEEDIN N=',n +! write(iout,'(8f10.4)') (xin(j),j=1,nvar) + mm=mm+1 + if (mm.lt.nodes) then +c feed task to soldier +! print *, ' sending input for start # ',n + info(1)=n + info(2)=-1 + info(3)=0 + info(4)=0 + info(5)=0 + info(6)=0 + call mpi_send(info,12,mpi_integer,mm,idint,CG_COMM, + * ierr) + call mpi_send(xin,nvar,mpi_double_precision,mm, + * idreal,CG_COMM,ierr) + else +c find an available soldier + call mpi_recv(ind,9,mpi_integer,mpi_any_source,idint, + * CG_COMM,muster,ierr) +! print *, ' receiving output from start # ',ind(1) + man=muster(mpi_source) +c receive final energies and variables + nft=nft+ind(3) + call mpi_recv(eout,1,mpi_double_precision, + * man,idreal,CG_COMM,muster,ierr) +! print *,eout +#ifdef CO_BIAS + call mpi_recv(co,1,mpi_double_precision, + * man,idreal,CG_COMM,muster,ierr) + write (iout,'(a15,f3.2,$)') ' BIAS by contact order*100 ',co +#endif + call mpi_recv(xout,nvar,mpi_double_precision, + * man,idreal,CG_COMM,muster,ierr) +! print *,nvar , ierr +c feed next task to soldier +! print *, ' sending input for start # ',n + info(1)=n + info(2)=-1 + info(3)=0 + info(4)=0 + info(5)=0 + info(6)=0 + info(7)=0 + info(8)=0 + info(9)=0 + call mpi_send(info,12,mpi_integer,man,idint,CG_COMM, + * ierr) + call mpi_send(xin,nvar,mpi_double_precision,man, + * idreal,CG_COMM,ierr) +c retrieve latest results + call getx(ind,xout,eout,cout,rad,iw_pdb,ind(1)) + if(iw_pdb.gt.0) + & call write_csa_pdb(xout,eout,nft,ind(1),iw_pdb) + endif + enddo +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +c no more input +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + do j=1,nodes-1 +c wait for a soldier + call mpi_recv(ind,9,mpi_integer,mpi_any_source,idint, + * CG_COMM,muster,ierr) +crc if (ierr.ne.0) go to 30 +! print *, ' receiving output from start # ',ind(1) + man=muster(mpi_source) +c receive final energies and variables + nft=nft+ind(3) + call mpi_recv(eout,1, + * mpi_double_precision,man,idreal, + * CG_COMM,muster,ierr) +! print *,eout +#ifdef CO_BIAS + call mpi_recv(co,1,mpi_double_precision, + * man,idreal,CG_COMM,muster,ierr) + write (iout,'(a15,f3.2,$)') ' BIAS by contact order*100 ',co +#endif +crc if (ierr.ne.0) go to 30 + call mpi_recv(xout,nvar,mpi_double_precision, + * man,idreal,CG_COMM,muster,ierr) +! print *,nvar , ierr +crc if (ierr.ne.0) go to 30 +c halt soldier + info(1)=0 + info(2)=-1 + info(3)=0 + info(4)=0 + info(5)=0 + info(6)=0 + call mpi_send(info,12,mpi_integer,man,idint,CG_COMM, + * ierr) +c retrieve results + call getx(ind,xout,eout,cout,rad,iw_pdb,ind(1)) + if(iw_pdb.gt.0) + & call write_csa_pdb(xout,eout,nft,ind(1),iw_pdb) + enddo +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + return + 10 print *, ' dispatching error' + call mpi_abort(mpi_comm_world,ierror,ierrcode) + return + 20 print *, ' communication error' + call mpi_abort(mpi_comm_world,ierror,ierrcode) + return + 30 print *, ' receiving error' + call mpi_abort(mpi_comm_world,ierror,ierrcode) + return + end +cccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine getx(ind,xout,eout,cout,rad,iw_pdb,k) +c receives and stores data from soldiers + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.CONTACTS' + dimension ind(9),xout(maxvar),eout(mxch*(mxch+1)/2+1) +cjlee + double precision przes(3),obr(3,3),cout(2) + logical non_conv +cjlee + iw_pdb=2 + if (k.gt.mxio .or. k.lt.1) then + write (iout,*) + & 'ERROR - dimensions of ANGMIN have been exceeded K=',k + call mpi_abort(mpi_comm_world,ierror,ierrcode) + endif +c store ind() + do j=1,9 + indb(k,j)=ind(j) + enddo +c store energies + etot(k)=eout(1) +c retrieve dihedral angles etc + call var_to_geom(nvar,xout) + do j=2,nres-1 + dihang(1,j,1,k)=theta(j+1) + dihang(2,j,1,k)=phi(j+2) + dihang(3,j,1,k)=alph(j) + dihang(4,j,1,k)=omeg(j) + enddo + dihang(2,nres-1,1,k)=0.0d0 +cjlee + if(iref.eq.0) then + iw_pdb=1 +cd write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a4,i3,i4)') +cd & ind(2),' e ',ind(3),ind(1),' etot ',etot(k),' mv ', +cd & ind(5),ind(4) + return + endif + call chainbuild +c call dihang_to_c(dihang(1,1,1,k)) +c call fitsq(rms,c(1,1),crefjlee(1,1),nres,przes,obr,non_conv) +c call fitsq(rms,c(1,2),crefjlee(1,2),nres-1,przes,obr,non_conv) +c call fitsq(rms,c(1,nstart_seq),crefjlee(1,nstart_sup), +c & nsup,przes,obr,non_conv) +c rmsn(k)=dsqrt(rms) + + call rmsd_csa(rmsn(k)) + call contact(.false.,ncont,icont,co) + pncn(k)=contact_fract(ncont,ncont_ref,icont,icont_ref) + +cd write(iout,'(i3,a3,i4,i5,a6,1pe12.4,a5 +cd & ,0pf5.2,a5,f5.1,a,f6.3,a4,i3,i4)') +cd & ind(2),' e ',ind(3),ind(1),' etot ',etot(k),' rms ', +cd & rmsn(k),' %NC ',pncn(k)*100,' cont.order',co,' mv ', +cd & ind(5),ind(4) + + + if (rmsn(k).gt.rmscut.or.pncn(k).lt.pnccut) iw_pdb=0 + return + end +cccccccccccccccccccccccccccccccccccccccccccccccccc + subroutine putx(xin,n,rad) +c gets starting variables + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + dimension xin(maxvar) + +c pull out starting values for variables +! write (iout,*)'PUTX: N=',n + do m=1,numch +! write (iout,'(8f10.4)') (dihang_in(1,j,m,n),j=2,nres-1) +! write (iout,'(8f10.4)') (dihang_in(2,j,m,n),j=2,nres-1) +! write (iout,'(8f10.4)') (dihang_in(3,j,m,n),j=2,nres-1) +! write (iout,'(8f10.4)') (dihang_in(4,j,m,n),j=2,nres-1) + do j=2,nres-1 + theta(j+1)=dihang_in(1,j,m,n) + phi(j+2)=dihang_in(2,j,m,n) + alph(j)=dihang_in(3,j,m,n) + omeg(j)=dihang_in(4,j,m,n) + enddo + enddo +c set up array of variables + call geom_to_var(nvar,xin) +! write (iout,*) 'xin in PUTX N=',n +! call intout +! write (iout,'(8f10.4)') (xin(i),i=1,nvar) + return + end +c-------------------------------------------------------- + subroutine putx2(xin,iff,n) +c gets starting variables + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + dimension xin(maxvar),iff(maxres) + +c pull out starting values for variables + do m=1,numch + do j=2,nres-1 + theta(j+1)=dihang_in2(1,j,m,n) + phi(j+2)=dihang_in2(2,j,m,n) + alph(j)=dihang_in2(3,j,m,n) + omeg(j)=dihang_in2(4,j,m,n) + enddo + enddo +c set up array of variables + call geom_to_var(nvar,xin) + + do i=1,nres + iff(i)=iff_in(i,n) + enddo + return + end + +c------------------------------------------------------- + subroutine prune_bank(p_cut) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.TIME1' + include 'COMMON.SETUP' +c--------------------------- +c This subroutine prunes bank conformations using p_cut +c--------------------------- + + nprune=0 + nprune=nprune+1 + m=1 + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang(i,j,k,nprune)=bvar(i,j,k,m) + enddo + enddo + enddo + bene(nprune)=bene(m) + brmsn(nprune)=brmsn(m) + bpncn(nprune)=bpncn(m) + + do m=2,nbank + ddmin=9.d190 + do ip=1,nprune + call get_diff12(dihang(1,1,1,ip),bvar(1,1,1,m),diff) + if(diff.lt.p_cut) goto 100 + if(diff.lt.ddmin) ddmin=diff + enddo + nprune=nprune+1 + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang(i,j,k,nprune)=bvar(i,j,k,m) + enddo + enddo + enddo + bene(nprune)=bene(m) + brmsn(nprune)=brmsn(m) + bpncn(nprune)=bpncn(m) + 100 continue + write (iout,*) 'Pruning :',m,nprune,p_cut,ddmin + enddo + nbank=nprune + print *, 'Pruning :',m,nprune,p_cut + call write_bank(0,0) + + return + end +c------------------------------------------------------- + + subroutine reminimize(jlee) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.CSA' + include 'COMMON.BANK' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.TIME1' + include 'COMMON.SETUP' +c--------------------------- +c This subroutine re-minimizes bank conformations: +c--------------------------- + + ntry=nbank + + call find_max + call find_min + + if (me.eq.king) then + open(icsa_history,file=csa_history,status="old") + write(icsa_history,*) "Re-minimization",nodes,"nodes" + write(icsa_history,851) (bene(i),i=1,nbank) + write(icsa_history,40) jlee,icycle,nstep,cutdif,ibmin,ibmax, + * ebmin,ebmax,nft,iuse,nbank,ntbank + close(icsa_history) + do index=1,ntry + do k=1,numch + do j=2,nres-1 + do i=1,4 + dihang_in(i,j,k,index)=bvar(i,j,k,index) + enddo + enddo + enddo + enddo + nft=0 + call feedin(ntry,nft) + else + call minim_jlee + endif + + call find_max + call find_min + + if (me.eq.king) then + do i=1,ntry + call replace_bvar(i,i) + enddo + open(icsa_history,file=csa_history,status="old") + write(icsa_history,40) jlee,icycle,nstep,cutdif,ibmin,ibmax, + * ebmin,ebmax,nft,iuse,nbank,ntbank + write(icsa_history,851) (bene(i),i=1,nbank) + close(icsa_history) + call write_bank_reminimized(jlee,nft) + endif + + 40 format(2i2,i8,f8.1,2i4,2(1pe14.5),i10,3i4) + 851 format(5e15.6) + 850 format(5e15.10) +c 850 format(10f8.3) + + return + end +c------------------------------------------------------- + subroutine send(n,mm,it) +c sends out starting conformation for minimization + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'mpif.h' + dimension xin(maxvar),xout(maxvar),eout(mxch*(mxch+1)/2+1), + * cout(2),ind(8),xin2(maxvar),iff(maxres),info(12) + dimension muster(mpi_status_size) + include 'COMMON.SETUP' + parameter (rad=1.745329252d-2) + + if (isend2(n).eq.0) then +c pull out external and internal variables for next start + call putx(xin,n,rad) + info(1)=n + info(2)=it + info(3)=movenx(n) + info(4)=nss_in(n) + info(5)=parent(1,n) + info(6)=parent(2,n) + + if (movenx(n).eq.14.or.movenx(n).eq.17) then + info(7)=idata(1,n) + info(8)=idata(2,n) + else if (movenx(n).eq.16) then + info(7)=idata(1,n) + info(8)=idata(2,n) + info(10)=idata(3,n) + info(11)=idata(4,n) + info(12)=idata(5,n) + else + info(7)=0 + info(8)=0 + info(10)=0 + info(11)=0 + info(12)=0 + endif + + if (movenx(n).eq.15) then + info(9)=parent(3,n) + else + info(9)=0 + endif + call mpi_send(info,12,mpi_integer,mm,idint,CG_COMM, + * ierr) + call mpi_send(xin,nvar,mpi_double_precision,mm, + * idreal,CG_COMM,ierr) + else +c distfit & minimization for n7 move + info(1)=-n + info(2)=it + info(3)=movenx(n) + info(4)=nss_in(n) + info(5)=parent(1,n) + info(6)=parent(2,n) + info(7)=0 + info(8)=0 + info(9)=0 + call mpi_send(info,12,mpi_integer,mm,idint,CG_COMM, + * ierr) + call putx2(xin,iff,isend2(n)) + call mpi_send(xin,nvar,mpi_double_precision,mm, + * idreal,CG_COMM,ierr) + call mpi_send(iff,nres,mpi_integer,mm, + * idint,CG_COMM,ierr) + call putx(xin2,n,rad) + call mpi_send(xin2,nvar,mpi_double_precision,mm, + * idreal,CG_COMM,ierr) + endif + if (vdisulf.and.nss_in(n).ne.0) then + call mpi_send(iss_in(1,n),nss_in(n),mpi_integer,mm, + * idint,CG_COMM,ierr) + call mpi_send(jss_in(1,n),nss_in(n),mpi_integer,mm, + * idint,CG_COMM,ierr) + endif + return + end +c------------------------------------------------- + + subroutine recv(ihalt,man,xout,eout,ind,tout) +c receives results of energy minimization + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + include 'COMMON.BANK' + include 'COMMON.CHAIN' + include 'mpif.h' + dimension xin(maxvar),xout(maxvar),eout(mxch*(mxch+1)/2+1), + * cout(2),ind(9),info(12) + dimension muster(mpi_status_size) + include 'COMMON.SETUP' + logical tout,flag + double precision twait,tstart,tend1 + parameter(twait=600.0d0) + +c find an available soldier + tout=.false. + flag=.false. + tstart=MPI_WTIME() + do while(.not. (flag .or. tout)) + call MPI_IPROBE(mpi_any_source,idint,CG_COMM,flag, + * muster,ierr) + tend1=MPI_WTIME() + if(tend1-tstart.gt.twait .and. ihalt.eq.1) tout=.true. +c_error if(tend1-tstart.gt.twait) tout=.true. + enddo + if (tout) then + write(iout,*) 'ERROR = timeout for recv ',tend1-tstart + call flush(iout) + return + endif + man=muster(mpi_source) + +ctimeout call mpi_recv(ind,9,mpi_integer,mpi_any_source,idint, +ctimeout * CG_COMM,muster,ierr) +! print *, ' receiving output from start # ',ind(1) +ct print *,'receiving ',MPI_WTIME() +ctimeout man=muster(mpi_source) + call mpi_recv(ind,9,mpi_integer,man,idint, + * CG_COMM,muster,ierr) +ctimeout +c receive final energies and variables + call mpi_recv(eout,1,mpi_double_precision, + * man,idreal,CG_COMM,muster,ierr) +! print *,eout +#ifdef CO_BIAS + call mpi_recv(co,1,mpi_double_precision, + * man,idreal,CG_COMM,muster,ierr) + write (iout,'(a15,f3.2,$)') ' BIAS by contact order*100 ',co +#endif + call mpi_recv(xout,nvar,mpi_double_precision, + * man,idreal,CG_COMM,muster,ierr) +! print *,nvar , ierr + if(vdisulf) nss=ind(6) + if(vdisulf.and.nss.ne.0) then + call mpi_recv(ihpb,nss,mpi_integer, + * man,idint,CG_COMM,muster,ierr) + call mpi_recv(jhpb,nss,mpi_integer, + * man,idint,CG_COMM,muster,ierr) + endif +c halt soldier + if(ihalt.eq.1) then +c print *,'sending halt to ',man + write(iout,*) 'sending halt to ',man + info(1)=0 + call mpi_send(info,12,mpi_integer,man,idint,CG_COMM,ierr) + endif + return + end + +c---------------------------------------------------------- + subroutine history_append + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + +#if defined(AIX) || defined(PGI) + open(icsa_history,file=csa_history,position="append") +#else + open(icsa_history,file=csa_history,access="append") +#endif + return + end diff --git a/source/unres/src_MD-M-newcorr/unres.F b/source/unres/src_MD-M-newcorr/unres.F new file mode 100644 index 0000000..d5031f0 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/unres.F @@ -0,0 +1,771 @@ +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 4/25/08 7:29PM by adam' + 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 + 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" +#endif + 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 + 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 + time00=MPI_Wtime() + 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)) + time_ene=MPI_Wtime()-time00 + 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' + time1=MPI_WTIME() + 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.' + time1=MPI_WTIME() + call minimize(etot,varia,iretcode,nfun) + endif + print *,'SUMSL return code is',iretcode,' eval ',nfun + evals=nfun/(MPI_WTIME()-time1) + 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(:50),ipdb) + if (outmol2) call mol2out(etot,titel) + 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,1),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,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:max_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,20a12)')"# ", + & (wname(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,20a12)')"# ", + & (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,20(f12.3))') iconf, + & (energy(print_order(i)),i=1,nprint_ene),etot, + & rms,frac,frac_nn,co +cjlee end + else + write (istat,'(i5,16(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 + write (iout,'(a,i7)') 'Conformation #',iconf + n=n+1 + 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,'(a,2i7)') 'Conformation #',iconf,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,19(f12.3))') iconf, + & (energy(print_order(i)),i=1,nprint_ene),etot, + & rms,frac,frac_nn,co + else + write (istat,'(i5,15(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=1101,err=1101) 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=1101,err=1101) iconf + call read_angles(intin,*11) + call geom_to_var(nvar,varia) + call chainbuild + endif + n=n+1 + 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,'(a,2i7)') 'Conformation #',iconf,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,19(f12.3))') iconf, + & (energy(print_order(i)),i=1,nprint_ene),etot, + & rms,frac,frac_nn,co + else + write (istat,'(i5,15(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 +#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 + 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 print *,'kurwa0' + call check_ecartint + print *,'kurwa' + call check_ecartint + return + 20 print *,'ja pierdole' + call check_cartgrad + 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 + call together +#else + write (iout,*) "CSA works on parallel machines only" +#endif + return + end +c--------------------------------------------------------------------------- + subroutine exec_softreg + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + double precision energy(0:max_ene) + 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-M-newcorr/xdrf/CMakeLists.txt b/source/unres/src_MD-M-newcorr/xdrf/CMakeLists.txt new file mode 100644 index 0000000..26baa36 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/xdrf/Makefile b/source/unres/src_MD-M-newcorr/xdrf/Makefile new file mode 100644 index 0000000..02c29f6 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/xdrf/Makefile_jubl b/source/unres/src_MD-M-newcorr/xdrf/Makefile_jubl new file mode 100644 index 0000000..8dc35cf --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/xdrf/Makefile_linux b/source/unres/src_MD-M-newcorr/xdrf/Makefile_linux new file mode 100644 index 0000000..f03276e --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/xdrf/RS6K.m4 b/source/unres/src_MD-M-newcorr/xdrf/RS6K.m4 new file mode 100644 index 0000000..0331d97 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/xdrf/ftocstr.c b/source/unres/src_MD-M-newcorr/xdrf/ftocstr.c new file mode 100644 index 0000000..ed2113f --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/xdrf/libxdrf.m4 b/source/unres/src_MD-M-newcorr/xdrf/libxdrf.m4 new file mode 100644 index 0000000..eebf199 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/xdrf/libxdrf.m4 @@ -0,0 +1,1237 @@ +/*____________________________________________________________________________ + | + | 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 +#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-M-newcorr/xdrf/underscore.m4 b/source/unres/src_MD-M-newcorr/xdrf/underscore.m4 new file mode 100644 index 0000000..4d620a0 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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-M-newcorr/xdrf/xdrf.h b/source/unres/src_MD-M-newcorr/xdrf/xdrf.h new file mode 100644 index 0000000..dedf5a2 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/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/wham/src-NEWSC/CMakeLists.txt b/source/wham/src-NEWSC/CMakeLists.txt new file mode 100755 index 0000000..aca8eb4 --- /dev/null +++ b/source/wham/src-NEWSC/CMakeLists.txt @@ -0,0 +1,298 @@ +# +# CMake project file for WHAM single chain version +# + +enable_language (Fortran) + +#================================ +# Set source file lists +#================================ +set(UNRES_WHAM_SRC0 + wham_multparm.F + bxread.F + xread.F + cxread.F + enecalc1.F + energy_p_new.F + initialize_p.F + molread_zs.F + openunits.F + readrtns.F + arcos.f + cartder.f + cartprint.f + chainbuild.f + geomout.F + gnmr1.f + icant.f + intcor.f + int_from_cart.f + make_ensemble1.F + matmult.f + misc.f + mygetenv.F + parmread.F + pinorm.f + printmat.f + rescode.f + setup_var.f + slices.F + store_parm.F + timing.F + wham_calc1.F + readrtns_compar.F + readpdb.f + fitsq.f + contact.f + elecont.f + contfunc.f + cont_frag.f + conf_compar.F + match_contact.f + angnorm.f + odlodc.f + promienie.f + qwolynes.f + read_ref_str.F + rmscalc.f + secondary.f + proc_cont.f + define_pairs.f + mysort.f +) + +set(UNRES_WHAM_PP_SRC + bxread.F + chainbuild.F + conf_compar.F + cxread.F + enecalc1.F + energy_p_new.F + geomout.F + initialize_p.F + make_ensemble1.F + molread_zs.F + mygetenv.F + openunits.F + parmread.F + read_ref_str.F + readrtns_compar.F + readrtns.F + slices.F + store_parm.F + timing.F + wham_calc1.F + wham_multparm.F + xread.F + proc_proc.c +) + + +#================================================ +# Set comipiler flags for different sourcefiles +#================================================ +if (Fortran_COMPILER_NAME STREQUAL "ifort") + set(FFLAGS0 "-mcmodel=medium -g -CB -I. -I${CMAKE_CURRENT_SOURCE_DIR}/include_unres" ) +elseif (Fortran_COMPILER_NAME STREQUAL "gfortran") + set(FFLAGS0 "-std=legacy -g -I. -I${CMAKE_CURRENT_SOURCE_DIR}/include_unres" ) +endif (Fortran_COMPILER_NAME STREQUAL "ifort") + + +#========================================= +# Add MPI compiler flags +#========================================= +if(UNRES_WITH_MPI) + set(FFLAGS0 "${FFLAGS0} -I${MPIF_INCLUDE_DIRECTORIES}") +endif(UNRES_WITH_MPI) + +set_property(SOURCE ${UNRES_WHAM_SRC0} PROPERTY COMPILE_FLAGS ${FFLAGS0} ) + +#========================================= +# WHAM preprocesor flags +#========================================= + +set(CPPFLAGS "PROCOR -DUNRES -DISNAN -DSPLITELE -DCRYST_BOND -DCRYST_THETA -DCRYST_SC" ) + +#========================================= +# 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 +#========================================= +set(CPPFLAGS "${CPPFLAGS} -DMPI") + +#========================================= +# Add 64-bit specific preprocessor flags +#========================================= +if (architektura STREQUAL "64") + set(CPPFLAGS "${CPPFLAGS} -DAMD64") +endif (architektura STREQUAL "64") + +#========================================= +# Apply preprocesor flags to *.F files +#========================================= +set_property(SOURCE ${UNRES_WHAM_PP_SRC} PROPERTY COMPILE_DEFINITIONS ${CPPFLAGS} ) + + +#======================================== +# Setting binary name +#======================================== +set(UNRES_WHAM_BIN "wham_${Fortran_COMPILER_NAME}.exe") + +#========================================= +# 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 ") + +# set include path +set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/cinfo.f PROPERTY COMPILE_FLAGS "${FFLAGS0} -I${CMAKE_CURRENT_SOURCE_DIR}" ) + +#========================================= +# Set full unres CSA sources +#========================================= +set(UNRES_WHAM_SRCS ${UNRES_WHAM_SRC0} ${CMAKE_CURRENT_BINARY_DIR}/cinfo.f proc_proc.c) + +#========================================= +# Build the binary +#========================================= +add_executable(UNRES_WHAM_BIN ${UNRES_WHAM_SRCS} ) +set_target_properties(UNRES_WHAM_BIN PROPERTIES OUTPUT_NAME ${UNRES_WHAM_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) +target_link_libraries( UNRES_WHAM_BIN ${MPIF_LIBRARIES} ) +# link libxdrf.a +target_link_libraries( UNRES_WHAM_BIN 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}/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/rotcorr_AM1.parm +#export PATTERN=$DD/patterns.cart +#----------------------------------------------------------------------------- +#$UNRES_BIN +#") + +#========================================= +# ala10.inp +#========================================= + +#file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/ala10.inp +#"ala10 unblocked +#SEED=-1111333 MD ONE_LETTER rescale_mode=2 PDBOUT +#nstep=15000 ntwe=100 ntwx=1000 dt=0.1 lang=0 tbf t_bath=300 damax=1.0 & +#reset_moment=1000 reset_vel=1000 MDPDB +#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 ) + +#endif(NOT UNRES_WITH_MPI) diff --git a/source/wham/src-NEWSC/COMMON.ALLPARM b/source/wham/src-NEWSC/COMMON.ALLPARM new file mode 100755 index 0000000..62d1e47 --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.ALLPARM @@ -0,0 +1,99 @@ + double precision ww_all(max_ene,max_parm), + & vbldp0_all(max_parm),akp_all(max_parm), + & vbldsc0_all(maxbondterm,ntyp,max_parm), + & aksc_all(maxbondterm,ntyp,max_parm), + & abond0_all(maxbondterm,ntyp,max_parm), + & a0thet_all(ntyp,max_parm),athet_all(2,ntyp,max_parm), + & bthet_all(2,ntyp,max_parm),polthet_all(0:3,ntyp,max_parm), + & gthet_all(3,ntyp,max_parm),theta0_all(ntyp,max_parm), + & sig0_all(ntyp,max_parm),sigc0_all(ntyp,max_parm), + & aa0thet_all(maxthetyp1,maxthetyp1,maxthetyp1,max_parm), + & aathet_all(maxtheterm,maxthetyp1,maxthetyp1,maxthetyp1,max_parm), + & bbthet_all(maxsingle,maxtheterm2,maxthetyp1,maxthetyp1, + & maxthetyp1,max_parm), + & ccthet_all(maxsingle,maxtheterm2,maxthetyp1,maxthetyp1, + & maxthetyp1,max_parm), + & ddthet_all(maxsingle,maxtheterm2,maxthetyp1,maxthetyp1, + & maxthetyp1,max_parm), + & eethet_all(maxsingle,maxtheterm2,maxthetyp1,maxthetyp1, + & maxthetyp1,max_parm), + & ffthet_all(maxdouble,maxdouble,maxtheterm3,maxthetyp1,maxthetyp1, + & maxthetyp1,max_parm), + & ggthet_all(maxdouble,maxdouble,maxtheterm3,maxthetyp1,maxthetyp1, + & maxthetyp1,max_parm), + & dsc_all(ntyp1,max_parm),bsc_all(maxlob,ntyp,max_parm), + & censc_all(3,maxlob,ntyp,max_parm), + & gaussc_all(3,3,maxlob,ntyp,max_parm),dsc0_all(ntyp1,max_parm), + & sc_parmin_all(65,ntyp,max_parm), + & v0_all(maxtor,maxtor,max_parm), + & v1_all(maxterm,maxtor,maxtor,max_parm), + & v2_all(maxterm,maxtor,maxtor,max_parm), + & vlor1_all(maxlor,maxtor,maxtor,max_parm), + & vlor2_all(maxlor,maxtor,maxtor,max_parm), + & vlor3_all(maxlor,maxtor,maxtor,max_parm), + & v1c_all(2,maxtermd_1,maxtor,maxtor,maxtor,max_parm), + & v1s_all(2,maxtermd_1,maxtor,maxtor,maxtor,max_parm), + & v2c_all(maxtermd_2,maxtermd_2,maxtor,maxtor,maxtor,max_parm), + & v2s_all(maxtermd_2,maxtermd_2,maxtor,maxtor,maxtor,max_parm), + & b1_all(2,maxtor,max_parm),b2_all(2,maxtor,max_parm), + & cc_all(2,2,maxtor,max_parm),dd_all(2,2,maxtor,max_parm), + & ee_all(2,2,maxtor,max_parm),ctilde_all(2,2,maxtor,max_parm), + & dtilde_all(2,2,maxtor,max_parm),b1tilde_all(2,maxtor,max_parm), + & app_all(2,2,max_parm),bpp_all(2,2,max_parm), + & ael6_all(2,2,max_parm),ael3_all(2,2,max_parm), + & aad_all(ntyp,2,max_parm),bad_all(ntyp,2,max_parm), + & aa_all(ntyp,ntyp,max_parm),bb_all(ntyp,ntyp,max_parm), + & augm_all(ntyp,ntyp,max_parm),eps_all(ntyp,ntyp,max_parm), + & sigma_all(ntyp,ntyp,max_parm),r0_all(ntyp,ntyp,max_parm), + & chi_all(ntyp,ntyp,max_parm),chip_all(ntyp,max_parm), + & chipp_all(ntyp,ntyp,max_parm),sigmap1_all(ntyp,ntyp,max_parm), + & sigmap2_all(ntyp,ntyp,max_parm),chis_all(ntyp,ntyp,max_parm), + & alphasur_all(4,ntyp,ntyp,max_parm), + & wstate_all(4,ntyp,ntyp,max_parm), + & nstate_all(ntyp,ntyp,max_parm), + & dhead_all(2,2,ntyp,ntyp,max_parm), + & dtail_all(2,ntyp,ntyp,max_parm), + & epshead_all(ntyp,ntyp,max_parm), + & rborn_all(ntyp,ntyp,max_parm), + & wqdip_all(2,ntyp,ntyp,max_parm),wquad_all(ntyp,ntyp,max_parm), + & alphapol_all(ntyp,ntyp,max_parm), + & alphiso_all(4,ntyp,ntyp,max_parm), + & sigiso1_all(ntyp,ntyp,max_parm), + & sigiso2_all(ntyp,ntyp,max_parm), + & epsintab_all(ntyp,ntyp,max_parm), + & alp_all(ntyp,max_parm),ebr_all(max_parm),d0cm_all(max_parm), + & akcm_all(max_parm),akth_all(max_parm),akct_all(max_parm), + & v1ss_all(max_parm),v2ss_all(max_parm),v3ss_all(max_parm), + & v1sccor_all(maxterm_sccor,3,ntyp,ntyp,max_parm), + & v2sccor_all(maxterm_sccor,3,ntyp,ntyp,max_parm) + integer nlob_all(ntyp1,max_parm),nlor_all(maxtor,maxtor,max_parm), + & nterm_all(maxtor,maxtor,max_parm), + & ntermd1_all(maxtor,maxtor,maxtor,max_parm), + & ntermd2_all(maxtor,maxtor,maxtor,max_parm), + & nbondterm_all(ntyp,max_parm),nthetyp_all(max_parm), + & ithetyp_all(ntyp1,max_parm),ntheterm_all(max_parm), + & ntheterm2_all(max_parm),ntheterm3_all(max_parm), + & nsingle_all(max_parm),ndouble_all(max_parm), + & nntheterm_all(max_parm),nterm_sccor_all(ntyp,ntyp,max_parm) + common /allparm/ ww_all,vbldp0_all,akp_all,vbldsc0_all,aksc_all, + & abond0_all,aa0thet_all,aathet_all,bbthet_all,ccthet_all, + & ddthet_all,eethet_all,ffthet_all,ggthet_all, + & a0thet_all,athet_all,bthet_all,polthet_all,gthet_all,theta0_all, + & sig0_all,sigc0_all,dsc_all,bsc_all,censc_all,gaussc_all,dsc0_all, + & sc_parmin_all, + & v0_all,v1_all,v2_all,vlor1_all,vlor2_all,vlor3_all,v1c_all, + & v1s_all,v2c_all,v2s_all,b1_all,b2_all,cc_all,dd_all,ee_all, + & ctilde_all,dtilde_all,b1tilde_all,app_all,bpp_all,ael6_all, + & ael3_all,aad_all,bad_all,aa_all,bb_all,augm_all, + & eps_all,sigma_all,r0_all,chi_all,chipp_all,sigmap1_all, + & sigmap2_all, + & chis_all,alphasur_all,wstate_all,dhead_all,dtail_all, + & epshead_all, + & rborn_all,wqdip_all,wquad_all,alphapol_all,alphiso_all, + & sigiso1_all, + & sigiso2_all,epsintab_all,chip_all,alp_all,ebr_all, + & d0cm_all,akcm_all,akth_all,akct_all,v1ss_all,v2ss_all,v3ss_all, + & v1sccor_all,v2sccor_all,nbondterm_all, + & nlob_all,nlor_all,nterm_all,ntermd1_all,ntermd2_all, + & nthetyp_all,ithetyp_all,ntheterm_all,ntheterm2_all,ntheterm3_all, + & nsingle_all,ndouble_all,nntheterm_all,nterm_sccor_all,nstate_all diff --git a/source/wham/src-NEWSC/COMMON.CHAIN b/source/wham/src-NEWSC/COMMON.CHAIN new file mode 100755 index 0000000..07dd87e --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.CHAIN @@ -0,0 +1,8 @@ + integer nres,nres0,nsup,nstart_sup,nend_sup,nstart_seq,ishift_pdb + double precision c,cref,dc,xloc,xrot,dc_norm,t,r,prod,rt + common /chain/ c(3,maxres2+2),dc(3,maxres2),xloc(3,maxres), + & xrot(3,maxres),dc_norm(3,maxres2),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),nsup,nstart_sup,nend_sup, + & nstart_seq,ishift_pdb diff --git a/source/wham/src-NEWSC/COMMON.COMPAR b/source/wham/src-NEWSC/COMMON.COMPAR new file mode 100755 index 0000000..eb59ea4 --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.COMPAR @@ -0,0 +1,39 @@ + integer ifrag,nfrag,npiece,iclass,iscore,ishifft,ncont_nat,ibase, + & n_shift,ipiece,istruct,ielecont,isccont,irms,len_frag,isnfrag, + & nc_req_setf,iloc,iloc_single,list_frag,nlist_frag,nlevel + double precision rmsfrag,rmscutfrag,rmscut_base_low, + & rmscut_base_up, + & rmsup_lim,rmsupup_lim,rms_nat,rmsang,ang_cut,ang_cut1, + & frac_min,nc_fragm,qfrag,qnat + logical lgrp,lgrp_out,binary + integer ncreq_hel,ncreq_bet,ncreq_pair,irms_pair,icont_pair, + & isplit_bet,nshift_hel,nshift_bet,nshift_strand,nshift_pair, + & irms_single,icont_single + double precision angcut_hel,angcut1_hel,angcut_bet,angcut1_bet, + & angcut_strand,angcut1_strand,frac_min_set,ncfrac_hel,ncfrac_bet, + & ncfrac_pair,frac_sec + common /compar/ rmsfrag(maxfrag,maxlevel), + & qfrag(maxfrag,2),rmscut_base_low, + & rmscut_base_up,rmsup_lim,rmsupup_lim, + & rmscutfrag(2,maxfrag,maxlevel), + & rms_nat,qnat,rmsang,ang_cut(maxfrag), + & ang_cut1(maxfrag), + & frac_min(maxfrag),nc_fragm(maxfrag,maxlevel), + & nc_req_setf(maxfrag,maxlevel), + & ncont_nat(2,maxfrag,maxlevel),nfrag(maxlevel), + & isnfrag(maxlevel+1), + & npiece(maxfrag,maxlevel),ifrag(2,maxpiece,maxfrag), + & ipiece(maxpiece,maxfrag,2:maxlevel),istruct(maxfrag), + & ielecont(maxfrag,maxlevel), + & isccont(maxfrag,maxlevel),irms(maxfrag,maxlevel), + & iloc(maxfrag), + & iclass(maxlevel*maxfrag,maxlevel), + & iscore,ishifft(maxfrag,maxlevel), + & len_frag(maxfrag,maxlevel),n_shift(2,maxfrag,maxlevel), + & nlevel,ibase,lgrp,lgrp_out,binary, + & nlist_frag(maxfrag),list_frag(maxres,maxfrag) + common /compar1/ angcut_hel,angcut1_hel,angcut_bet,angcut1_bet, + & angcut_strand,angcut1_strand,frac_min_set,ncfrac_hel,ncfrac_bet, + & ncfrac_pair,frac_sec,ncreq_hel,ncreq_bet,ncreq_pair,irms_pair, + & icont_pair,isplit_bet,nshift_hel,nshift_bet,nshift_strand, + & nshift_pair,irms_single,icont_single,iloc_single diff --git a/source/wham/src-NEWSC/COMMON.CONTACTS1 b/source/wham/src-NEWSC/COMMON.CONTACTS1 new file mode 100755 index 0000000..04affa9 --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.CONTACTS1 @@ -0,0 +1,5 @@ + integer ncont,ncont_ref,icont,icont_ref,num_cont,jcont, + & nsccont_frag_ref,isccont_frag_ref + common /contacts/ ncont,ncont_ref,icont(2,maxcont), + & icont_ref(2,maxcont),nsccont_frag_ref(mmaxfrag), + & isccont_frag_ref(2,maxcont,mmaxfrag) diff --git a/source/wham/src-NEWSC/COMMON.CONTROL b/source/wham/src-NEWSC/COMMON.CONTROL new file mode 100755 index 0000000..1178504 --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.CONTROL @@ -0,0 +1,10 @@ + integer iscode,indpdb,outpdb,outmol2,icomparfunc,pdbint, + & ensembles,constr_dist + logical refstr,pdbref,punch_dist,print_rms,caonly,verbose, + & merge_helices,bxfile,cxfile,histfile,entfile,zscfile, + & rmsrgymap,with_dihed_constr,check_conf,histout,energy_dec + common /cntrl/ iscode,indpdb,refstr,pdbref,outpdb,outmol2, + & punch_dist,print_rms,caonly,verbose,icomparfunc,pdbint, + & merge_helices,bxfile,cxfile,histfile,entfile,zscfile,rmsrgymap, + & ensembles,with_dihed_constr,check_conf,histout,constr_dist, + & energy_dec diff --git a/source/wham/src-NEWSC/COMMON.CONTROL.org b/source/wham/src-NEWSC/COMMON.CONTROL.org new file mode 100755 index 0000000..7dc2298 --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.CONTROL.org @@ -0,0 +1,9 @@ + integer iscode,indpdb,outpdb,outmol2,icomparfunc,pdbint, + & ensembles + logical refstr,pdbref,punch_dist,print_rms,caonly,verbose, + & merge_helices,bxfile,cxfile,histfile,entfile,zscfile, + & rmsrgymap + common /cntrl/ iscode,indpdb,refstr,pdbref,outpdb,outmol2, + & punch_dist,print_rms,caonly,verbose,icomparfunc,pdbint, + & merge_helices,bxfile,cxfile,histfile,entfile,zscfile,rmsrgymap, + & ensembles diff --git a/source/wham/src-NEWSC/COMMON.EMP b/source/wham/src-NEWSC/COMMON.EMP new file mode 100755 index 0000000..5a39536 --- /dev/null +++ b/source/wham/src-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/wham/src-NEWSC/COMMON.ENEPS b/source/wham/src-NEWSC/COMMON.ENEPS new file mode 100755 index 0000000..eaf002e --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.ENEPS @@ -0,0 +1,3 @@ + double precision eneps_temp(2,nntyp) + integer n_ene + common /weightder/ eneps_temp,n_ene diff --git a/source/wham/src-NEWSC/COMMON.ENERGIES b/source/wham/src-NEWSC/COMMON.ENERGIES new file mode 100755 index 0000000..2d40a95 --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.ENERGIES @@ -0,0 +1,4 @@ + double precision potE(MaxStr_Proc,Max_Parm),entfac(MaxStr_Proc), + & q(MaxQ+2,MaxStr_Proc),enetb(max_ene,MaxStr_Proc,Max_Parm) + integer einicheck + common /energies/ potE,entfac,q,enetb,einicheck diff --git a/source/wham/src-NEWSC/COMMON.FREE b/source/wham/src-NEWSC/COMMON.FREE new file mode 100755 index 0000000..3e378ca --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.FREE @@ -0,0 +1,15 @@ + integer nQ,nparmset,stot(maxslice),rescale_mode,iparmprint,myparm + logical hamil_rep,separate_parset + double precision Kh(MaxQ,MaxR,MaxT_h,max_parm), + & q0(MaxQ,MaxR,MaxT_h,max_parm),delta,deltrms,deltrgy,fimin, + & f(maxR,maxT_h,max_parm),beta_h(MaxT_h,max_parm) + double precision delta_T,startGridT + integer nR(maxT_h,max_parm),snk(MaxR,MaxT_h,max_parm,MaxSlice), + & nT_h(max_parm),maxit,totraj(maxR,max_parm),nRR(maxT_h,max_parm) + integer nGridT + logical replica(max_parm),umbrella(max_parm),read_iset(max_parm) + common /wham/ Kh,q0,f,beta_h,delta,deltrms,deltrgy,delta_T, + & startGridT,fimin,snk,nR, + & nRR,nT_h,nQ,stot,nparmset,maxit,rescale_mode,replica,umbrella, + & read_iset,totraj,hamil_rep,separate_parset,iparmprint,myparm, + & nGridT diff --git a/source/wham/src-NEWSC/COMMON.IOUNITS b/source/wham/src-NEWSC/COMMON.IOUNITS new file mode 100755 index 0000000..23783bb --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.IOUNITS @@ -0,0 +1,51 @@ +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,isccor,icbase, + & istat,ientin,ientout,isidep1,ibond,ihist,izsc,idistr + common /iounits/ inp,iout,igeom,intin,ipdb,imol2,ipdbin,ithep, + & irotam,itorp,itordp,ifourier,ielep,isidep,iscpp,isccor, + & icbase,istat,ientin,ientout,isidep1,ibond,ihist,izsc, + & idistr + character*256 outname,intname,pdbname,mol2name,statname,intinname, + & entname,restartname,prefix,scratchdir,sidepname,pdbfile, + & histname,zscname + common /fnames/ outname,intname,pdbname,mol2name,statname, + & intinname,entname,restartname,prefix,pot,scratchdir, + & sidepname,pdbfile,histname,zscname +C Parameter files + character*256 bondname,thetname,rotname,torname,tordname, + & fouriername,elename,sidename,scpname,sccorname,patname + common /parfiles/ thetname,rotname,torname,tordname,bondname, + & fouriername,elename,sidename,scpname,sccorname,patname + 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 preceding simulation(s) to be read in. +C----------------------------------------------------------------------- diff --git a/source/wham/src-NEWSC/COMMON.MPI b/source/wham/src-NEWSC/COMMON.MPI new file mode 100755 index 0000000..037c1c9 --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.MPI @@ -0,0 +1,8 @@ + integer me, me1, Master, Master1, Nprocs, Nprocs1, Comm1, + & Indstart, Indend, scount, idispl, i2ii, WHAM_COMM + integer indstart_map,indend_map,idispl_map,scount_map + common /MPI_Data/ Nprocs, Master,Master1,Me,Comm1,Me1,Nprocs1, + & WHAM_COMM, + & Indstart(0:MaxProcs), + & Indend(0:MaxProcs), idispl(0:MaxProcs), + & scount(0:MaxProcs) diff --git a/source/wham/src-NEWSC/COMMON.OBCINKA b/source/wham/src-NEWSC/COMMON.OBCINKA new file mode 100755 index 0000000..e0d9c61 --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.OBCINKA @@ -0,0 +1,3 @@ + real*8 time_start_collect(maxR,MaxT_h,Max_Parm), + & time_end_collect(maxR,MaxT_h,Max_Parm) + common /obcinka/ time_start_collect,time_end_collect diff --git a/source/wham/src-NEWSC/COMMON.PEPTCONT b/source/wham/src-NEWSC/COMMON.PEPTCONT new file mode 100755 index 0000000..59e05dd --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.PEPTCONT @@ -0,0 +1,7 @@ + integer ncont_pept_ref,icont_pept_ref,ncont_frag_ref, + & icont_frag_ref,isec_ref + common /peptcont/ ncont_pept_ref, + & icont_pept_ref(2,maxcont), + & ncont_frag_ref(mmaxfrag), + & icont_frag_ref(2,maxcont,mmaxfrag), + & isec_ref(maxres) diff --git a/source/wham/src-NEWSC/COMMON.PROT b/source/wham/src-NEWSC/COMMON.PROT new file mode 100755 index 0000000..054ec47 --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.PROT @@ -0,0 +1,2 @@ + integer ntot(maxslice),isampl(max_parm),nslice + common /protein/ ntot,isampl,nslice diff --git a/source/wham/src-NEWSC/COMMON.PROTFILES b/source/wham/src-NEWSC/COMMON.PROTFILES new file mode 100755 index 0000000..3287326 --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.PROTFILES @@ -0,0 +1,10 @@ + character*80 protfiles(maxfile_prot,2,MaxR,MaxT_h,Max_Parm), + & bprotfiles + integer nfile_bin(MaxR,MaxT_h,Max_Parm), + & nfile_asc(MaxR,MaxT_h,Max_Parm), + & nfile_cx(MaxR,MaxT_h,Max_Parm), + & rec_start(MaxR,MaxT_h,Max_Parm), + & rec_end(MaxR,MaxT_h,Max_Parm),lenrec,lenrec1,lenrec2 + common /protfil/ protfiles,bprotfiles, + & nfile_bin,nfile_asc,nfile_cx,rec_start,rec_end,lenrec,lenrec1, + & lenrec2 diff --git a/source/wham/src-NEWSC/COMMON.VAR b/source/wham/src-NEWSC/COMMON.VAR new file mode 100755 index 0000000..2b11894 --- /dev/null +++ b/source/wham/src-NEWSC/COMMON.VAR @@ -0,0 +1,17 @@ +C Store the geometric variables in the following COMMON block. + integer ntheta,nphi,nside,nvar,ialph,ivar + double precision theta,phi,alph,omeg,vbld,vbld_ref, + & theta_ref,phi_ref,alph_ref,omeg_ref, + & costtab,sinttab,cost2tab,sint2tab, + & xxtab,yytab,zztab,tauangle,omicron + common /var/ theta(maxres),phi(maxres),alph(maxres),omeg(maxres), + & omicron(2,maxres),tauangle(3,maxres), + & vbld(2*maxres), + & costtab(maxres), sinttab(maxres), cost2tab(maxres), + & sint2tab(maxres),xxtab(maxres),yytab(maxres), + & zztab(maxres), + & ialph(maxres,2),ivar(4*maxres2),ntheta,nphi,nside,nvar +C Angles from experimental structure + common /varref/ vbld_ref(maxres), + & theta_ref(maxres),phi_ref(maxres), + & alph_ref(maxres),omeg_ref(maxres) diff --git a/source/wham/src-NEWSC/DIMENSIONS b/source/wham/src-NEWSC/DIMENSIONS new file mode 100755 index 0000000..4d9279d --- /dev/null +++ b/source/wham/src-NEWSC/DIMENSIONS @@ -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 +c parameter (maxres=250) + 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-NEWSC/DIMENSIONS.COMPAR b/source/wham/src-NEWSC/DIMENSIONS.COMPAR new file mode 100755 index 0000000..911bd4e --- /dev/null +++ b/source/wham/src-NEWSC/DIMENSIONS.COMPAR @@ -0,0 +1,25 @@ +****************************************************************** +* +* Array dimensions for level-based conformation comparison program: +* +* Max. number of conformations in the data set. +* + integer maxconf + PARAMETER (MAXCONF=maxstr_proc) +* +* Max. number levels of comparison +* + integer maxlevel + PARAMETER (MAXLEVEL=3) +* +* Max. number of fragments at a given level of comparison +* + integer maxfrag,mmaxfrag + PARAMETER (MAXFRAG=30,MMAXFRAG=MAXFRAG*(MAXFRAG+1)/2) +* +* Max. number of pieces forming a substructure to be compared +* + integer maxpiece + PARAMETER (MAXPIECE=20) +* +******************************************************************* diff --git a/source/wham/src-NEWSC/DIMENSIONS.FREE b/source/wham/src-NEWSC/DIMENSIONS.FREE new file mode 100755 index 0000000..5f1a041 --- /dev/null +++ b/source/wham/src-NEWSC/DIMENSIONS.FREE @@ -0,0 +1,14 @@ + integer Max_Parm + integer MaxQ,MaxQ1 + integer MaxR,MaxT_h + integer MaxSlice + parameter (Max_Parm=1) + 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-NEWSC/DIMENSIONS.FREE.old b/source/wham/src-NEWSC/DIMENSIONS.FREE.old new file mode 100755 index 0000000..e579dd1 --- /dev/null +++ b/source/wham/src-NEWSC/DIMENSIONS.FREE.old @@ -0,0 +1,12 @@ + integer Max_Parm + integer MaxQ,MaxQ1 + integer MaxR,MaxT_h + integer MaxSlice + parameter (Max_Parm=6) + parameter (MaxQ=5,MaxQ1=MaxQ+2) + parameter(MaxR=1,MaxT_h=32) + parameter(MaxSlice=40) + integer MaxN + parameter (MaxN=100) + integer MaxPrintConf + parameter (MaxPrintConf=1000) diff --git a/source/wham/src-NEWSC/DIMENSIONS.ZSCOPT b/source/wham/src-NEWSC/DIMENSIONS.ZSCOPT new file mode 100755 index 0000000..0d8e64b --- /dev/null +++ b/source/wham/src-NEWSC/DIMENSIONS.ZSCOPT @@ -0,0 +1,40 @@ + integer maxstr,max_ene,maxprot,maxclass,maxfile_prot,maxobj, + & maxstr_proc, maxclass1 +c Maximum number of structures in the database, energy components, proteins, +c and structural classes +c#ifdef JUBL + parameter (maxstr=200000,max_ene=21,maxprot=7,maxclass=5000) + parameter (maxclass1=10) +c Maximum number of structures to be dealt with by one processor + parameter (maxstr_proc=20000) +c Maximum number of temperatures + integer maxT + parameter (maxT=10) +c Maximum number of batches + integer maxbatch + parameter (maxbatch=1) +c Maximum number of energy/Zscore gaps for a single protein + integer maxgap + parameter (maxgap=2*maxclass1) +c Maximum number of the components of the target function + parameter (maxobj=maxgap*maxprot*maxT) +c Maximum number of files with energies/coordinates + parameter (maxfile_prot=100) +c Maximum number of grid points in energy map evaluation + integer max_x,max_y,max_minim + parameter (max_x=200,max_y=200,max_minim=1000) +c Maximum number of processors + integer MaxProcs + parameter (MaxProcs = 2048) +c Maximum number of optimizable parameters + integer max_paropt + parameter (max_paropt=500) +c Maximum number of fragments +c integer maxfrag +c parameter (maxfrag=0) +c Maximum number of sublevels + integer maxlev + parameter (maxlev=maxclass) +c Maximum number of grid points in temperature + integer MaxGridT + parameter (MaxGridT=2000) diff --git a/source/wham/src-NEWSC/Makefile b/source/wham/src-NEWSC/Makefile new file mode 100755 index 0000000..8b92f57 --- /dev/null +++ b/source/wham/src-NEWSC/Makefile @@ -0,0 +1,89 @@ +INSTALL_DIR = /users/local/mpi64/mpich-1.2.7p1 +BIN = /users/adam/bin +FC= ifort +OPT = -mcmodel=medium -O3 -ip -w +#OPT = -mcmodel=medium -g -CA -CB +FFLAGS = ${OPT} -c -I. -I./include_unres -I$(INSTALL_DIR)/include +LIBS = -L$(INSTALL_DIR)/lib -lmpich -lpmpich xdrf/libxdrf.a + +.f.o: + ${FC} ${FFLAGS} $*.f + +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +objects = \ + wham_multparm.o \ + bxread.o \ + xread.o \ + cxread.o \ + enecalc1.o \ + energy_p_new.o \ + gnmr1.o \ + initialize_p.o \ + molread_zs.o \ + openunits.o \ + readrtns.o \ + arcos.o \ + cartder.o \ + cartprint.o \ + chainbuild.o \ + geomout.o \ + icant.o \ + intcor.o \ + int_from_cart.o \ + make_ensemble1.o \ + matmult.o \ + misc.o \ + mygetenv.o \ + parmread.o \ + pinorm.o \ + printmat.o \ + proc_proc.o \ + rescode.o \ + setup_var.o \ + slices.o \ + store_parm.o \ + timing.o \ + wham_calc1.o + +objects_compar = \ + readrtns_compar.o \ + readpdb.o fitsq.o contact.o \ + elecont.o contfunc.o cont_frag.o conf_compar.o match_contact.o \ + angnorm.o odlodc.o promienie.o qwolynes.o read_ref_str.o \ + rmscalc.o secondary.o proc_cont.o define_pairs.o mysort.o + +GABs: CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI -DISNAN -DAMD64 \ + -DCRYST_BOND -DCRYST_THETA -DCRYST_SC -DSCALREP +GABs: ${objects} ${objects_compar} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o \ + ${LIBS} -static-intel -o ${BIN}/wham_ifort_MPICH_MM-KN-DEBUG-scalrep.exe + +GAB: CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI -DISNAN -DAMD64 \ + -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +GAB: ${objects} ${objects_compar} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o \ + ${LIBS} -static-intel -o ${BIN}/wham_ifort_MPICH_MM-KN-DEBUG.exe + +E0LL2Y: CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI -DISNAN -DAMD64 +E0LL2Y: ${objects} ${objects_compar} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o \ + ${LIBS} -static-intel -o ${BIN}/wham_ifort_MPICH_MM-PH.exe + +xdrf/libxdrf.a: + cd xdrf && make + + +clean: + /bin/rm -f *.o && /bin/rm -f compinfo && cd xdrf && make clean + diff --git a/source/wham/src-NEWSC/Makefile-pgi b/source/wham/src-NEWSC/Makefile-pgi new file mode 100755 index 0000000..40cc442 --- /dev/null +++ b/source/wham/src-NEWSC/Makefile-pgi @@ -0,0 +1,74 @@ +BIN = /users/adam/ZSCOREZ/bin +CC = cc +FC = mpif90 +#FC = ifc +OPT = -fast -pc 64 -tp p6 -Minline=name:scalar2,scalar,transpose2,matvec2,prodmat3 +#FFLAGS = ${OPT} -g -c -I. -I./include_unres +#FFLAGS = ${OPT} -c -C -g -I. -I./include_unres +FFLAGS = ${OPT} -c -I. -I./include_unres +LIBS = -L../../MEY_MD/src_Tc/xdrf -lxdrf +#LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich -lpmpich -Vaxlib +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DMOMENT -DCHECKGRAD -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DCHECKGRAD -DPGI -DMYGETENV +CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES + +.f.o: + ${FC} ${FFLAGS} $*.f + +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +all: make_dbase + +objects = \ + wham_multparm.o \ + bxread.o \ + xread.o \ + cxread.o \ + enecalc1.o \ + energy_p_new.o \ + initialize_p.o \ + molread_zs.o \ + openunits.o \ + readrtns.o \ + arcos.o \ + cartder.o \ + cartprint.o \ + chainbuild.o \ + geomout.o \ + icant.o \ + intcor.o \ + int_from_cart.o \ + make_ensemble1.o \ + matmult.o \ + misc.o \ + mygetenv.o \ + parmread.o \ + pinorm.o \ + printmat.o \ + proc_proc.o \ + rescode.o \ + setup_var.o \ + slices.o \ + store_parm.o \ + timing.o \ + wham_calc1.o + +objects_compar = \ + readrtns_compar.o \ + readpdb.o fitsq.o contact.o \ + elecont.o contfunc.o cont_frag.o conf_compar.o match_contact.o \ + angnorm.o odlodc.o promienie.o qwolynes.o read_ref_str.o \ + rmscalc.o secondary.o proc_cont.o define_pairs.o mysort.o + +make_dbase: ${objects} ${objects_compar} + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} -Wl,-Bstatic ${objects} ${objects_compar} cinfo.o \ + ${LIBS} -o ${BIN}/wham_multparm-T-sccor + +clean: + /bin/rm *.o diff --git a/source/wham/src-NEWSC/Makefile1_jump b/source/wham/src-NEWSC/Makefile1_jump new file mode 100755 index 0000000..1df1586 --- /dev/null +++ b/source/wham/src-NEWSC/Makefile1_jump @@ -0,0 +1,60 @@ +BIN = ../bin +CC = cc +FC = mpxlf90 -qfixed -w +OPT = -q64 +FFLAGS = -c ${OPT} -O3 -I./include_unres +LIBS = xdrf/libxdrf.o xdrf/ftocstr.o +CPPFLAGS = -WF,-DMPI -WF,-DAIX -WF,-DUNRES -WF,-DSPLITELE -WF,-DPROCOR -WF,-DISNAN + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +all: make_dbase + +objects = \ + wham_multparm.o \ + cxread.o \ + enecalc1.o \ + energy_p_new.o \ + initialize_p.o \ + molread_zs.o \ + openunits.o \ + readrtns.o \ + arcos.o \ + cartder.o \ + cartprint.o \ + chainbuild.o \ + geomout.o \ + icant.o \ + intcor.o \ + int_from_cart.o \ + make_ensemble1.o \ + matmult.o \ + misc.o \ + mygetenv.o \ + parmread.o \ + pinorm.o \ + printmat.o \ + rescode.o \ + setup_var.o \ + store_parm.o \ + timing.o \ + wham_calc1.o + +objects_compar = \ + readrtns_compar.o \ + readpdb.o fitsq.o contact.o \ + elecont.o contfunc.o cont_frag.o conf_compar.o match_contact.o \ + angnorm.o odlodc.o promienie.o qwolynes.o read_ref_str.o \ + rmscalc.o secondary.o proc_cont.o define_pairs.o mysort.o + +make_dbase: ${objects} ${objects_compar} + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o \ + ${LIBS} -o ${BIN}/wham_multparm1-T-procor + +clean: + /bin/rm *.o diff --git a/source/wham/src-NEWSC/Makefile_MPICH_ifort b/source/wham/src-NEWSC/Makefile_MPICH_ifort new file mode 100755 index 0000000..8b92f57 --- /dev/null +++ b/source/wham/src-NEWSC/Makefile_MPICH_ifort @@ -0,0 +1,89 @@ +INSTALL_DIR = /users/local/mpi64/mpich-1.2.7p1 +BIN = /users/adam/bin +FC= ifort +OPT = -mcmodel=medium -O3 -ip -w +#OPT = -mcmodel=medium -g -CA -CB +FFLAGS = ${OPT} -c -I. -I./include_unres -I$(INSTALL_DIR)/include +LIBS = -L$(INSTALL_DIR)/lib -lmpich -lpmpich xdrf/libxdrf.a + +.f.o: + ${FC} ${FFLAGS} $*.f + +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +objects = \ + wham_multparm.o \ + bxread.o \ + xread.o \ + cxread.o \ + enecalc1.o \ + energy_p_new.o \ + gnmr1.o \ + initialize_p.o \ + molread_zs.o \ + openunits.o \ + readrtns.o \ + arcos.o \ + cartder.o \ + cartprint.o \ + chainbuild.o \ + geomout.o \ + icant.o \ + intcor.o \ + int_from_cart.o \ + make_ensemble1.o \ + matmult.o \ + misc.o \ + mygetenv.o \ + parmread.o \ + pinorm.o \ + printmat.o \ + proc_proc.o \ + rescode.o \ + setup_var.o \ + slices.o \ + store_parm.o \ + timing.o \ + wham_calc1.o + +objects_compar = \ + readrtns_compar.o \ + readpdb.o fitsq.o contact.o \ + elecont.o contfunc.o cont_frag.o conf_compar.o match_contact.o \ + angnorm.o odlodc.o promienie.o qwolynes.o read_ref_str.o \ + rmscalc.o secondary.o proc_cont.o define_pairs.o mysort.o + +GABs: CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI -DISNAN -DAMD64 \ + -DCRYST_BOND -DCRYST_THETA -DCRYST_SC -DSCALREP +GABs: ${objects} ${objects_compar} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o \ + ${LIBS} -static-intel -o ${BIN}/wham_ifort_MPICH_MM-KN-DEBUG-scalrep.exe + +GAB: CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI -DISNAN -DAMD64 \ + -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +GAB: ${objects} ${objects_compar} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o \ + ${LIBS} -static-intel -o ${BIN}/wham_ifort_MPICH_MM-KN-DEBUG.exe + +E0LL2Y: CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI -DISNAN -DAMD64 +E0LL2Y: ${objects} ${objects_compar} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o \ + ${LIBS} -static-intel -o ${BIN}/wham_ifort_MPICH_MM-PH.exe + +xdrf/libxdrf.a: + cd xdrf && make + + +clean: + /bin/rm -f *.o && /bin/rm -f compinfo && cd xdrf && make clean + diff --git a/source/wham/src-NEWSC/Makefile_jubl b/source/wham/src-NEWSC/Makefile_jubl new file mode 100755 index 0000000..5f37ee7 --- /dev/null +++ b/source/wham/src-NEWSC/Makefile_jubl @@ -0,0 +1,95 @@ +CPPFLAGS = -WF,-DOLD_GINV \ + -WF,-DUNRES -WF,-DMPI \ + -WF,-DSPLITELE -WF,-DISNAN \ + -WF,-DAIX -WF,-DLANG0 -WF,-DPROCOR -WF,-DJUBL +#-WF,-DNOXDR +#-WF,-DPROCOR +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +BGLSYS = /bgl/BlueLight/ppcfloor/bglsys + +CC = /usr/bin/blrts_xlc +CPPC = /usr/bin/blrts_xlc +FC = /usr/bin/blrts_xlf90 +#-pg -g + +# try -qarch=440 first, then use -qarch=440d for 2nd FPU later on +# (SIMDization requires at least -O3) +# use -qlist -qsource with 440d and look for Parallel ASM instructions. +# +OPT= -I$(BGLSYS)/include -L$(BGLSYS)/lib -qarch=440d -qtune=440 -qfixed -w -qnosave +CFLAGS= -O3 -I$(BGLSYS)/include -L$(BGLSYS)/lib -qarch=440d -qtune=440 +FFLAGS= -c -O3 ${OPT} -I./include_unres +# +LIBS_MPI = -lmpich.rts -lmsglayer.rts -lrts.rts -ldevices.rts +LIBSF_MPI = -lmpich.rts -lfmpich.rts -lmsglayer.rts -lrts.rts -ldevices.rts + +FFLAGS1 = -c ${OPT} -O2 +FFLAGS2 = -c ${OPT} -O +FFLAGSE = -c ${OPT} -O4 + + +BIN = ${HOME}/UNRES/bin/wham_multparm-T-procor.rts +LIBS = ${LIBSF_MPI} ../src_Tc/xdrf/libxdrf.a +#LIBS = ${LIBSF_MPI} + +ARCH = LINUX +PP = /lib/cpp -P + +all: unresCSA + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +objects = \ + wham_multparm.o \ + cxread.o \ + enecalc.o \ + energy_p_new.o \ + initialize_p.o \ + molread_zs.o \ + openunits.o \ + readrtns.o \ + arcos.o \ + cartder.o \ + cartprint.o \ + chainbuild.o \ + geomout.o \ + icant.o \ + intcor.o \ + int_from_cart.o \ + make_ensemble.o \ + matmult.o \ + misc.o \ + mygetenv.o \ + parmread.o \ + pinorm.o \ + printmat.o \ + rescode.o \ + setup_var.o \ + store_parm.o \ + timing.o \ + wham_calc.o + +objects_compar = \ + readrtns_compar.o \ + readpdb.o fitsq.o contact.o \ + elecont.o contfunc.o cont_frag.o conf_compar.o match_contact.o \ + angnorm.o odlodc.o promienie.o qwolynes.o read_ref_str.o \ + rmscalc.o secondary.o proc_cont.o define_pairs.o mysort.o + + +unresCSA: ${objects} ${objects_compar} + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${objects} ${objects_compar} cinfo.o ${LIBS} -o ${BIN} + + +clean: + /bin/rm *.o diff --git a/source/wham/src-NEWSC/Makefile_jump b/source/wham/src-NEWSC/Makefile_jump new file mode 100755 index 0000000..e79c218 --- /dev/null +++ b/source/wham/src-NEWSC/Makefile_jump @@ -0,0 +1,69 @@ +BIN = ../bin +CC = cc +CFLAGS = -DAIX -c +FC = mpxlf90 -qlistopt -qfixed -w +OPT = -q64 +FFLAGS = -c ${OPT} -O3 -I./include_unres +#FFLAGS = -c ${OPT} -g -C -I./include_unres +LIBS = xdrf/libxdrf.o xdrf/ftocstr.o +CPPFLAGS = -WF,-DMPI -WF,-DAIX -WF,-DUNRES -WF,-DSPLITELE -WF,-DPROCOR -WF,-DISNAN + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +.SUFFIXES: .c +.c.o: + ${CC} ${CFLAGS} $*.c + +all: make_dbase + +objects = \ + wham_multparm.o \ + bxread.o \ + xread.o \ + cxread.o \ + enecalc1.o \ + energy_p_new.o \ + initialize_p.o \ + molread_zs.o \ + openunits.o \ + readrtns.o \ + arcos.o \ + cartder.o \ + cartprint.o \ + chainbuild.o \ + geomout.o \ + icant.o \ + intcor.o \ + int_from_cart.o \ + make_ensemble1.o \ + matmult.o \ + misc.o \ + mygetenv.o \ + parmread.o \ + pinorm.o \ + printmat.o \ + rescode.o \ + setup_var.o \ + slices.o \ + store_parm.o \ + timing.o \ + wham_calc1.o + +objects_compar = \ + readrtns_compar.o \ + readpdb.o fitsq.o contact.o \ + elecont.o contfunc.o cont_frag.o conf_compar.o match_contact.o \ + angnorm.o odlodc.o promienie.o qwolynes.o read_ref_str.o \ + rmscalc.o secondary.o proc_cont.o define_pairs.o mysort.o + +make_dbase: ${objects} ${objects_compar} + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o \ + ${LIBS} -o ${BIN}/wham_multparm-T-procor-c1 + +clean: + /bin/rm *.o diff --git a/source/wham/src-NEWSC/Makefile_matrix b/source/wham/src-NEWSC/Makefile_matrix new file mode 100755 index 0000000..d16bc8c --- /dev/null +++ b/source/wham/src-NEWSC/Makefile_matrix @@ -0,0 +1,67 @@ +INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh +BIN = ../bin +FC= ifort +#OPT = -mcmodel=medium -O3 -ip -w +OPT = -mcmodel=medium -g -CB +FFLAGS = ${OPT} -c -I. -I./include_unres -I$(INSTALL_DIR)/include +LIBS = -L$(INSTALL_DIR)/lib -lmpich -lpmpich xdrf/libxdrf.a +CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI -DISNAN -DAMD64 + +.f.o: + ${FC} ${FFLAGS} $*.f + +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +all: make_dbase + +objects = \ + wham_multparm.o \ + bxread.o \ + xread.o \ + cxread.o \ + enecalc1.o \ + energy_p_new.o \ + initialize_p.o \ + molread_zs.o \ + openunits.o \ + readrtns.o \ + arcos.o \ + cartder.o \ + cartprint.o \ + chainbuild.o \ + geomout.o \ + icant.o \ + intcor.o \ + int_from_cart.o \ + make_ensemble1.o \ + matmult.o \ + misc.o \ + mygetenv.o \ + parmread.o \ + pinorm.o \ + printmat.o \ + proc_proc.o \ + rescode.o \ + setup_var.o \ + slices.o \ + store_parm.o \ + timing.o \ + wham_calc1.o + +objects_compar = \ + readrtns_compar.o \ + readpdb.o fitsq.o contact.o \ + elecont.o contfunc.o cont_frag.o conf_compar.o match_contact.o \ + angnorm.o odlodc.o promienie.o qwolynes.o read_ref_str.o \ + rmscalc.o secondary.o proc_cont.o define_pairs.o mysort.o + +make_dbase: ${objects} ${objects_compar} + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o \ + ${LIBS} -static-intel -o ${BIN}/wham_multparm-ham_rep + +clean: + /bin/rm *.o diff --git a/source/wham/src-NEWSC/Makefile_matrix_PGI b/source/wham/src-NEWSC/Makefile_matrix_PGI new file mode 100755 index 0000000..bb4982d --- /dev/null +++ b/source/wham/src-NEWSC/Makefile_matrix_PGI @@ -0,0 +1,76 @@ +INSTALL_DIR = /users/software/mpich-1.2.7p1_pgi_9.0_64bit_ssh +BIN = ../bin +CC = cc +FC = pgf90 +#FC = ifc +#OPT = -mcmodel=medium -Mlarge_arrays -fast -pc 64 -tp amd64 -C -g +OPT = -mcmodel=medium -Mlarge_arrays -tp amd64 +#FFLAGS = ${OPT} -g -c -I. -I./include_unres -I$(INSTALL_DIR)/include +FFLAGS = ${OPT} -c -C -g -I. -I./include_unres -I$(INSTALL_DIR)/include +#FFLAGS = ${OPT} -c -I. -I./include_unres -I$(INSTALL_DIR)/include +LIBS = -L$(INSTALL_DIR)/lib -lmpich -lpmpich xdrf/libxdrf.a +#LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich -lpmpich -Vaxlib +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DMOMENT -DCHECKGRAD -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DCHECKGRAD -DPGI -DMYGETENV +CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES + +.f.o: + ${FC} ${FFLAGS} $*.f + +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +all: make_dbase + +objects = \ + wham_multparm.o \ + bxread.o \ + xread.o \ + cxread.o \ + enecalc1.o \ + energy_p_new.o \ + initialize_p.o \ + molread_zs.o \ + openunits.o \ + readrtns.o \ + arcos.o \ + cartder.o \ + cartprint.o \ + chainbuild.o \ + geomout.o \ + icant.o \ + intcor.o \ + int_from_cart.o \ + make_ensemble1.o \ + matmult.o \ + misc.o \ + mygetenv.o \ + parmread.o \ + pinorm.o \ + printmat.o \ + proc_proc.o \ + rescode.o \ + setup_var.o \ + slices.o \ + store_parm.o \ + timing.o \ + wham_calc1.o + +objects_compar = \ + readrtns_compar.o \ + readpdb.o fitsq.o contact.o \ + elecont.o contfunc.o cont_frag.o conf_compar.o match_contact.o \ + angnorm.o odlodc.o promienie.o qwolynes.o read_ref_str.o \ + rmscalc.o secondary.o proc_cont.o define_pairs.o mysort.o + +make_dbase: ${objects} ${objects_compar} + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o -Bstatic_pgi \ + ${LIBS} -o ${BIN}/wham_multparm-hamrep-sep + +clean: + /bin/rm *.o diff --git a/source/wham/src-NEWSC/Makefile_matrix_PGI-SCT-oldparm b/source/wham/src-NEWSC/Makefile_matrix_PGI-SCT-oldparm new file mode 100755 index 0000000..82001ca --- /dev/null +++ b/source/wham/src-NEWSC/Makefile_matrix_PGI-SCT-oldparm @@ -0,0 +1,76 @@ +INSTALL_DIR = /users/software/mpich-1.2.7p1_pgi_9.0_64bit_ssh +BIN = ../bin +CC = cc +FC = pgf90 +#FC = ifc +OPT = -mcmodel=medium -Mlarge_arrays -fast -pc 64 -tp amd64 +#OPT = -mcmodel=medium -Mlarge_arrays -tp amd64 +#FFLAGS = ${OPT} -g -c -I. -I./include_unres -I$(INSTALL_DIR)/include +#FFLAGS = ${OPT} -c -C -g -I. -I./include_unres -I$(INSTALL_DIR)/include +FFLAGS = ${OPT} -c -I. -I./include_unres -I$(INSTALL_DIR)/include +LIBS = -L$(INSTALL_DIR)/lib -lmpich -lpmpich xdrf/libxdrf.a +#LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich -lpmpich -Vaxlib +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DMOMENT -DCHECKGRAD -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DCHECKGRAD -DPGI -DMYGETENV +CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI -DCRYST_BOND -DCRYST_SC -DCRYST_THETA -DFUNCT +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES + +.f.o: + ${FC} ${FFLAGS} $*.f + +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +all: make_dbase + +objects = \ + wham_multparm.o \ + bxread.o \ + xread.o \ + cxread.o \ + enecalc1.o \ + energy_p_new.o \ + initialize_p.o \ + molread_zs.o \ + openunits.o \ + readrtns.o \ + arcos.o \ + cartder.o \ + cartprint.o \ + chainbuild.o \ + geomout.o \ + icant.o \ + intcor.o \ + int_from_cart.o \ + make_ensemble1.o \ + matmult.o \ + misc.o \ + mygetenv.o \ + parmread.o \ + pinorm.o \ + printmat.o \ + proc_proc.o \ + rescode.o \ + setup_var.o \ + slices.o \ + store_parm.o \ + timing.o \ + wham_calc1.o + +objects_compar = \ + readrtns_compar.o \ + readpdb.o fitsq.o contact.o \ + elecont.o contfunc.o cont_frag.o conf_compar.o match_contact.o \ + angnorm.o odlodc.o promienie.o qwolynes.o read_ref_str.o \ + rmscalc.o secondary.o proc_cont.o define_pairs.o mysort.o + +make_dbase: ${objects} ${objects_compar} + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o -Bstatic_pgi \ + ${LIBS} -o ${BIN}/wham_multparm-OPTERON-SCT-sccor-oldparm + +clean: + /bin/rm *.o diff --git a/source/wham/src-NEWSC/Makefile_matrix_PGI-SCTF-oldparm b/source/wham/src-NEWSC/Makefile_matrix_PGI-SCTF-oldparm new file mode 100755 index 0000000..66ebf03 --- /dev/null +++ b/source/wham/src-NEWSC/Makefile_matrix_PGI-SCTF-oldparm @@ -0,0 +1,76 @@ +INSTALL_DIR = /users/software/mpich-1.2.7p1_pgi_9.0_64bit_ssh +BIN = ../bin +CC = cc +FC = pgf90 +#FC = ifc +OPT = -mcmodel=medium -Mlarge_arrays -fast -pc 64 -tp amd64 +#OPT = -mcmodel=medium -Mlarge_arrays -tp amd64 +#FFLAGS = ${OPT} -g -c -I. -I./include_unres -I$(INSTALL_DIR)/include +#FFLAGS = ${OPT} -c -C -g -I. -I./include_unres -I$(INSTALL_DIR)/include +FFLAGS = ${OPT} -c -I. -I./include_unres -I$(INSTALL_DIR)/include +LIBS = -L$(INSTALL_DIR)/lib -lmpich -lpmpich xdrf/libxdrf.a +#LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich -lpmpich -Vaxlib +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DMOMENT -DCHECKGRAD -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DCHECKGRAD -DPGI -DMYGETENV +CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI -DCRYST_BOND -DCRYST_SC -DCRYST_THETA -DFUNCTH +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES + +.f.o: + ${FC} ${FFLAGS} $*.f + +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +all: make_dbase + +objects = \ + wham_multparm.o \ + bxread.o \ + xread.o \ + cxread.o \ + enecalc1.o \ + energy_p_new.o \ + initialize_p.o \ + molread_zs.o \ + openunits.o \ + readrtns.o \ + arcos.o \ + cartder.o \ + cartprint.o \ + chainbuild.o \ + geomout.o \ + icant.o \ + intcor.o \ + int_from_cart.o \ + make_ensemble1.o \ + matmult.o \ + misc.o \ + mygetenv.o \ + parmread.o \ + pinorm.o \ + printmat.o \ + proc_proc.o \ + rescode.o \ + setup_var.o \ + slices.o \ + store_parm.o \ + timing.o \ + wham_calc1.o + +objects_compar = \ + readrtns_compar.o \ + readpdb.o fitsq.o contact.o \ + elecont.o contfunc.o cont_frag.o conf_compar.o match_contact.o \ + angnorm.o odlodc.o promienie.o qwolynes.o read_ref_str.o \ + rmscalc.o secondary.o proc_cont.o define_pairs.o mysort.o + +make_dbase: ${objects} ${objects_compar} + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} -Bstatic_pgi cinfo.o \ + ${LIBS} -o ${BIN}/wham_multparm-OPTERON-SCTF-sccor-oldparm + +clean: + /bin/rm *.o diff --git a/source/wham/src-NEWSC/Makefile_matrix_PGI-oldparm b/source/wham/src-NEWSC/Makefile_matrix_PGI-oldparm new file mode 100755 index 0000000..1c9d56b --- /dev/null +++ b/source/wham/src-NEWSC/Makefile_matrix_PGI-oldparm @@ -0,0 +1,76 @@ +INSTALL_DIR = /usr/local/mpich-1.2.7p1_pgi64-6.2-3_ssh +BIN = ../bin +CC = cc +FC = pgf90 +#FC = ifc +OPT = -mcmodel=medium -Mlarge_arrays -fast -pc 64 -tp amd64 +#OPT = -mcmodel=medium -Mlarge_arrays -tp amd64 +#FFLAGS = ${OPT} -g -c -I. -I./include_unres -I$(INSTALL_DIR)/include +#FFLAGS = ${OPT} -c -C -g -I. -I./include_unres -I$(INSTALL_DIR)/include +FFLAGS = ${OPT} -c -I. -I./include_unres -I$(INSTALL_DIR)/include +LIBS = -L$(INSTALL_DIR)/lib -lmpich -lpmpich xdrf/libxdrf.a +#LIBS = -L$(INSTALL_DIR)/lib_pgi -lmpich -lpmpich -Vaxlib +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DMOMENT -DCHECKGRAD -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DCHECKGRAD -DPGI -DMYGETENV +CPPFLAGS = -DMPI -DLINUX -DUNRES -DSPLITELE -DPROCOR -DPGI -DCRYST_BOND -DCRYST_SC -DCRYST_THETA +#CPPFLAGS = -DMPI -DLINUX -DUNRES -DPGI +#CPPFLAGS = -DMPI -DLINUX -DUNRES + +.f.o: + ${FC} ${FFLAGS} $*.f + +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +all: make_dbase + +objects = \ + wham_multparm.o \ + bxread.o \ + xread.o \ + cxread.o \ + enecalc1.o \ + energy_p_new.o \ + initialize_p.o \ + molread_zs.o \ + openunits.o \ + readrtns.o \ + arcos.o \ + cartder.o \ + cartprint.o \ + chainbuild.o \ + geomout.o \ + icant.o \ + intcor.o \ + int_from_cart.o \ + make_ensemble1.o \ + matmult.o \ + misc.o \ + mygetenv.o \ + parmread.o \ + pinorm.o \ + printmat.o \ + proc_proc.o \ + rescode.o \ + setup_var.o \ + slices.o \ + store_parm.o \ + timing.o \ + wham_calc1.o + +objects_compar = \ + readrtns_compar.o \ + readpdb.o fitsq.o contact.o \ + elecont.o contfunc.o cont_frag.o conf_compar.o match_contact.o \ + angnorm.o odlodc.o promienie.o qwolynes.o read_ref_str.o \ + rmscalc.o secondary.o proc_cont.o define_pairs.o mysort.o + +make_dbase: ${objects} ${objects_compar} + cc -o compinfo compinfo.c + ./compinfo + ${FC} -c ${FFLAGS} cinfo.f + $(FC) ${OPT} ${objects} ${objects_compar} cinfo.o \ + ${LIBS} -o ${BIN}/wham_multparm-OPTERON-SCTF-sccor-oldparm + +clean: + /bin/rm *.o diff --git a/source/wham/src-NEWSC/a.sh b/source/wham/src-NEWSC/a.sh new file mode 100755 index 0000000..00b1548 --- /dev/null +++ b/source/wham/src-NEWSC/a.sh @@ -0,0 +1,9 @@ +a=1 +echo $a +while [ $a -lt 10 ] +do + a=`expr $a + 1` +done +echo $a +b=`expr $a / 5` +echo a=$a b=$b diff --git a/source/wham/src-NEWSC/angnorm.f b/source/wham/src-NEWSC/angnorm.f new file mode 100755 index 0000000..2d17942 --- /dev/null +++ b/source/wham/src-NEWSC/angnorm.f @@ -0,0 +1,439 @@ + subroutine add_angpair(ici,icj,nang_pair,iang_pair) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + integer ici,icj,nang_pair,iang_pair(2,maxres) + integer i,ian1,ian2 +c write (iout,*) "add_angpair: ici",ici," icj",icj, +c & " nang_pair",nang_pair + ian1=ici+2 + if (ian1.lt.4 .or. ian1.gt.nres) return + ian2=icj+2 +c write (iout,*) "ian1",ian1," ian2",ian2 + if (ian2.lt.4 .or. ian2.gt.nres) return + do i=1,nang_pair + if (ian1.eq.iang_pair(1,i) .and. ian2.eq.iang_pair(2,i)) return + enddo + nang_pair=nang_pair+1 + iang_pair(1,nang_pair)=ian1 + iang_pair(2,nang_pair)=ian2 + return + end +c------------------------------------------------------------------------- + subroutine angnorm(jfrag,ishif1,ishif2,diffang_max,angn,fract, + & lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + double precision pinorm,deltang + logical lprn + if (lprn) write (iout,'(80(1h*))') + angn=0.0d0 + nn = 0 + fract = 1.0d0 + npart = npiece(jfrag,1) + nn4 = nstart_sup+3 + nne = min0(nend_sup,nres) + if (lprn) write (iout,*) "nn4",nn4," nne",nne + do i=1,npart + nbeg = ifrag(1,i,jfrag) + 3 - ishif1 + if (nbeg.lt.nn4) nbeg=nn4 + nend = ifrag(2,i,jfrag) + 1 - ishif2 + if (nend.gt.nne) nend=nne + if (nend.ge.nbeg) then + nn = nn + nend - nbeg + 1 + if (lprn) write (iout,*) "i=",i," nbeg",nbeg," nend",nend, + & " nn",nn," ishift1",ishif1," ishift2",ishif2 + if (lprn) write (iout,*) "angles" + longest=0 + ll = 0 + do j=nbeg,nend +c deltang = pinorm(phi(j)-phi_ref(j+ishif1)) + deltang=spherang(phi_ref(j+ishif1),theta_ref(j-1+ishif1), + & theta_ref(j+ishif1),phi(j),theta(j-1),theta(j)) + if (dabs(deltang).gt.diffang_max) then + if (ll.gt.longest) longest = ll + ll = 0 + else + ll=ll+1 + endif + if (ll.gt.longest) longest = ll + if (lprn) write (iout,'(i5,3f10.5)')j,rad2deg*phi(j), + & rad2deg*phi_ref(j+ishif1),rad2deg*deltang + angn=angn+dabs(deltang) + enddo + longest=longest+3 + ff = dfloat(longest)/dfloat(nend - nbeg + 4) + if (lprn) write (iout,*)"segment",i," longest fragment within", + & diffang_max*rad2deg,":",longest," fraction",ff + if (ff.lt.fract) fract = ff + endif + enddo + if (nn.gt.0) then + angn = angn/nn + else + angn = dwapi + endif + if (lprn) write (iout,*) "nn",nn," norm",rad2deg*angn, + & " fract",fract + return + end +c------------------------------------------------------------------------- + subroutine angnorm2(jfrag,ishif1,ishif2,ncont,icont,lprn, + & diffang_max,anorm,fract) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + integer ncont,icont(2,ncont),longest + double precision anorm,diffang_max,fract + integer npiece_c,ifrag_c(2,maxpiece),ishift_c(maxpiece) + double precision pinorm + logical lprn + if (lprn) write (iout,'(80(1h*))') +c +c Determine the segments for which angles will be compared +c + nn4 = nstart_sup+3 + nne = min0(nend_sup,nres) + if (lprn) write (iout,*) "nn4",nn4," nne",nne + npart=npiece(jfrag,1) + npiece_c=0 + do i=1,npart +c write (iout,*) "i",i," ifrag",ifrag(1,i,jfrag),ifrag(2,i,jfrag) + if (icont(1,ncont).lt.ifrag(1,i,jfrag) .or. + & icont(1,1).gt.ifrag(2,i,jfrag)) goto 11 + jstart=1 + do while (jstart.lt.ncont .and. + & icont(1,jstart).lt.ifrag(1,i,jfrag)) +c write (iout,*) "jstart",jstart," icont",icont(1,jstart), +c & " ifrag",ifrag(1,i,jfrag) + jstart=jstart+1 + enddo +c write (iout,*) "jstart",jstart," icont",icont(1,jstart), +c & " ifrag",ifrag(1,i,jfrag) + if (icont(1,jstart).lt.ifrag(1,i,jfrag)) goto 11 + npiece_c=npiece_c+1 + ic1=icont(1,jstart) + ifrag_c(1,npiece_c)=icont(1,jstart) + jend=ncont + do while (jend.gt.1 .and. icont(1,jend).gt.ifrag(2,i,jfrag)) +c write (iout,*) "jend",jend," icont",icont(1,jend), +c & " ifrag",ifrag(2,i,jfrag) + jend=jend-1 + enddo +c write (iout,*) "jend",jend," icont",icont(1,jend), +c & " ifrag",ifrag(2,i,jfrag) + ic2=icont(1,jend) + ifrag_c(2,npiece_c)=icont(1,jend)+1 + ishift_c(npiece_c)=ishif1 +c write (iout,*) "1: i",i," jstart:",jstart," jend",jend, +c & " ic1",ic1," ic2",ic2, +c & " ifrag",ifrag(1,i,jfrag),ifrag(2,i,jfrag) + 11 continue + if (ncont.eq.1 .or. icont(2,ncont).gt.icont(2,1)) then + idi=1 + else + idi=-1 + endif +c write (iout,*) "idi",idi + if (idi.eq.1) then + if (icont(2,1).gt.ifrag(2,i,jfrag) .or. + & icont(2,ncont).lt.ifrag(1,i,jfrag)) goto 12 + jstart=1 + do while (jstart.lt.ncont .and. + & icont(2,jstart).lt.ifrag(1,i,jfrag)) +c write (iout,*) "jstart",jstart," icont",icont(2,jstart), +c & " ifrag",ifrag(1,i,jfrag) + jstart=jstart+1 + enddo +c write (iout,*) "jstart",jstart," icont",icont(2,jstart), +c & " ifrag",ifrag(1,i,jfrag) + if (icont(2,jstart).lt.ifrag(1,i,jfrag)) goto 12 + npiece_c=npiece_c+1 + ic1=icont(2,jstart) + ifrag_c(2,npiece_c)=icont(2,jstart)+1 + jend=ncont + do while (jend.gt.1 .and. icont(2,jend).gt.ifrag(2,i,jfrag)) +c write (iout,*) "jend",jend," icont",icont(2,jend), +c & " ifrag",ifrag(2,i,jfrag) + jend=jend-1 + enddo +c write (iout,*) "jend",jend," icont",icont(2,jend), +c & " ifrag",ifrag(2,i,jfrag) + else if (idi.eq.-1) then + if (icont(2,ncont).gt.ifrag(2,i,jfrag) .or. + & icont(2,1).lt.ifrag(1,i,jfrag)) goto 12 + jstart=ncont + do while (jstart.gt.ncont .and. + & icont(2,jstart).lt.ifrag(1,i,jfrag)) +c write (iout,*) "jstart",jstart," icont",icont(2,jstart), +c & " ifrag",ifrag(1,i,jfrag) + jstart=jstart-1 + enddo +c write (iout,*) "jstart",jstart," icont",icont(2,jstart), +c & " ifrag",ifrag(1,i,jfrag) + if (icont(2,jstart).lt.ifrag(1,i,jfrag)) goto 12 + npiece_c=npiece_c+1 + ic1=icont(2,jstart) + ifrag_c(2,npiece_c)=icont(2,jstart)+1 + jend=1 + do while (jend.lt.ncont .and. + & icont(2,jend).gt.ifrag(2,i,jfrag)) +c write (iout,*) "jend",jend," icont",icont(2,jend), +c & " ifrag",ifrag(2,i,jfrag) + jend=jend+1 + enddo +c write (iout,*) "jend",jend," icont",icont(2,jend), +c & " ifrag",ifrag(2,i,jfrag) + endif + ic2=icont(2,jend) + if (ic2.lt.ic1) then + iic = ic1 + ic1 = ic2 + ic2 = iic + endif +c write (iout,*) "2: i",i," ic1",ic1," ic2",ic2, +c & " jstart:",jstart," jend",jend, +c & " ifrag",ifrag(1,i,jfrag),ifrag(2,i,jfrag) + ifrag_c(1,npiece_c)=ic1 + ifrag_c(2,npiece_c)=ic2+1 + ishift_c(npiece_c)=ishif2 + 12 continue + enddo + if (lprn) then + write (iout,*) "Before merge: npiece_c",npiece_c + do i=1,npiece_c + write (iout,*) ifrag_c(1,i),ifrag_c(2,i),ishift_c(i) + enddo + endif +c +c Merge overlapping segments (e.g., avoid splitting helices) +c + i=1 + do while (i .lt. npiece_c) + if (ishift_c(i).eq.ishift_c(i+1) .and. + & ifrag_c(2,i).gt.ifrag_c(1,i+1)) then + ifrag_c(2,i)=ifrag_c(2,i+1) + do j=i+1,npiece_c + ishift_c(j)=ishift_c(j+1) + ifrag_c(1,j)=ifrag_c(1,j+1) + ifrag_c(2,j)=ifrag_c(2,j+1) + enddo + npiece_c=npiece_c-1 + else + i=i+1 + endif + enddo + if (lprn) then + write (iout,*) "After merge: npiece_c",npiece_c + do i=1,npiece_c + write (iout,*) ifrag_c(1,i),ifrag_c(2,i),ishift_c(i) + enddo + endif +c +c Compare angles +c + angn=0.0d0 + anorm=0 + nn = 0 + fract = 1.0d0 + npart = npiece_c + do i=1,npart + ishifc=ishift_c(i) + nbeg = ifrag_c(1,i) + 3 - ishifc + if (nbeg.lt.nn4) nbeg=nn4 + nend = ifrag_c(2,i) - ishifc + 1 + if (nend.gt.nne) nend=nne + if (nend.ge.nbeg) then + nn = nn + nend - nbeg + 1 + if (lprn) write (iout,*) "i=",i," nbeg",nbeg," nend",nend, + & " nn",nn," ishifc",ishifc + if (lprn) write (iout,*) "angles" + longest=0 + ll = 0 + do j=nbeg,nend +c deltang = pinorm(phi(j)-phi_ref(j+ishifc)) + deltang=spherang(phi_ref(j+ishifc),theta_ref(j-1+ishifc), + & theta_ref(j+ishifc),phi(j),theta(j-1),theta(j)) + if (dabs(deltang).gt.diffang_max) then + if (ll.gt.longest) longest = ll + ll = 0 + else + ll=ll+1 + endif + if (ll.gt.longest) longest = ll + if (lprn) write (iout,'(i5,3f10.5)')j,rad2deg*phi(j), + & rad2deg*phi_ref(j+ishifc),rad2deg*deltang + angn=angn+dabs(deltang) + enddo + longest=longest+3 + ff = dfloat(longest)/dfloat(nend - nbeg + 4) + if (lprn) write (iout,*)"segment",i," longest fragment within", + & diffang_max*rad2deg,":",longest," fraction",ff + if (ff.lt.fract) fract = ff + endif + enddo + if (nn.gt.0) anorm = angn/nn + if (lprn) write (iout,*) "nn",nn," norm",anorm," fract:",fract + return + end +c------------------------------------------------------------------------- + double precision function angnorm1(nang_pair,iang_pair,lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + logical lprn + integer nang_pair,iang_pair(2,maxres) + double precision pinorm + angn=0.0d0 + if (lprn) write (iout,'(80(1h*))') + if (lprn) write (iout,*) "nang_pair",nang_pair + if (lprn) write (iout,*) "angles" + do j=1,nang_pair + ia1 = iang_pair(1,j) + ia2 = iang_pair(2,j) +c deltang = pinorm(phi(ia1)-phi_ref(ia2)) + deltang=spherang(phi_ref(ia2),theta_ref(ia2-1), + & theta_ref(ia2),phi(ia2),theta(ia2-1),theta(ia2)) + if (lprn) write (iout,'(3i5,3f10.5)')j,ia1,ia2,rad2deg*phi(ia1), + & rad2deg*phi_ref(ia2),rad2deg*deltang + angn=angn+dabs(deltang) + enddo + if (lprn) + &write (iout,*)"nang_pair",nang_pair," angn",rad2deg*angn/nang_pair + angnorm1 = angn/nang_pair + return + end +c------------------------------------------------------------------------------ + subroutine angnorm12(diff) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + double precision pinorm + diff=0.0d0 + nn4 = nstart_sup+3 + nne = min0(nend_sup,nres) +c do j=nn4-1,nne +c diff = diff+rad2deg*dabs(pinorm(theta(j)-theta_ref(j))) +c enddo + do j=nn4,nne +c diff = diff+rad2deg*dabs(pinorm(phi(j)-phi_ref(j))) + diff=diff+spherang(phi_ref(j),theta_ref(j-1), + & theta_ref(j),phi(j),theta(j-1),theta(j)) + enddo + return + end +c-------------------------------------------------------------------------------- + double precision function spherang(gam1,theta11,theta12, + & gam2,theta21,theta22) + implicit none + double precision gam1,theta11,theta12,gam2,theta21,theta22, + & x1,x2,xmed,f1,f2,fmed + double precision tolx /1.0d-4/, tolf /1.0d-4/ + double precision sumcos + double precision arcos,pinorm,sumangp + integer it,maxit /100/ +c Calculate the difference of the angles of two superposed 4-redidue fragments +c +c O P +c \ / +c O'--C--C +c \ +c P' +c +c The fragment O'-C-C-P' is rotated by angle fi about the C-C axis +c to achieve the minimum difference between the O'-C-O and P-C-P angles; +c the sum of these angles is the difference returned by the function. +c +c 4/28/04 AL +c If thetas match, take the difference of gamma and exit. + if (dabs(theta11-theta12).lt.tolx + & .and. dabs(theta21-theta22).lt.tolx) then + spherang=dabs(pinorm(gam2-gam1)) + return + endif +c If the gammas are the same, take the difference of thetas and exit. + x1=0.0d0 + x2=0.5d0*pinorm(gam2-gam1) + if (dabs(x2) .lt. tolx) then + spherang=dabs(theta11-theta21)+dabs(theta12-theta22) + return + else if (x2.lt.0.0d0) then + x1=x2 + x2=0.0d0 + endif +c Else apply regula falsi method to compute optimum overlap of the terminal Calphas + f1=sumangp(gam1,theta11,theta12,gam2,theta21,theta22,x1) + f2=sumangp(gam1,theta11,theta12,gam2,theta21,theta22,x2) + do it=1,maxit + xmed=x1-f1*(x2-x1)/(f2-f1) + fmed=sumangp(gam1,theta11,theta12,gam2,theta21,theta22,xmed) +c write (*,*) 'it',it,' xmed ',xmed,' fmed ',fmed + if ( (dabs(xmed-x1).lt.tolx .or. dabs(x2-xmed).lt.tolx) + & .and. dabs(fmed).lt.tolf ) then + x1=xmed + f1=fmed + goto 10 + else if ( fmed*f1.lt.0.0d0 ) then + x2=xmed + f2=fmed + else + x1=xmed + f1=fmed + endif + enddo + 10 continue + spherang=arcos(dcos(theta11)*dcos(theta12) + & +dsin(theta11)*dsin(theta12)*dcos(x1))+ + & arcos(dcos(theta21)*dcos(theta22)+ + & dsin(theta21)*dsin(theta22)*dcos(gam2-gam1+x1)) + return + end +c-------------------------------------------------------------------------------- + double precision function sumangp(gam1,theta11,theta12,gam2, + & theta21,theta22,fi) + implicit none + double precision gam1,theta11,theta12,gam2,theta21,theta22,fi, + & cost11,cost12,cost21,cost22,sint11,sint12,sint21,sint22,cosd1, + & cosd2 +c derivarive of the sum of the difference of the angles of a 4-residue fragment. + double precision arcos + cost11=dcos(theta11) + cost12=dcos(theta12) + cost21=dcos(theta21) + cost22=dcos(theta22) + sint11=dsin(theta11) + sint12=dsin(theta12) + sint21=dsin(theta21) + sint22=dsin(theta22) + cosd1=cost11*cost12+sint11*sint12*dcos(fi) + cosd2=cost21*cost22+sint21*sint22*dcos(gam2-gam1+fi) + sumangp=sint11*sint12*dsin(fi)/dsqrt(1.0d0-cosd1*cosd1) + & +sint21*sint22*dsin(gam2-gam1+fi)/dsqrt(1.0d0-cosd2*cosd2) + return + end diff --git a/source/wham/src-NEWSC/arcos.f b/source/wham/src-NEWSC/arcos.f new file mode 100755 index 0000000..69810ea --- /dev/null +++ b/source/wham/src-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=0.5D0*(PI+DSIGN(1.0D0,X)*PI) + RETURN + 1 ARCOS=DACOS(X) + RETURN + END diff --git a/source/wham/src-NEWSC/bxread.F b/source/wham/src-NEWSC/bxread.F new file mode 100755 index 0000000..c459499 --- /dev/null +++ b/source/wham/src-NEWSC/bxread.F @@ -0,0 +1,89 @@ + subroutine bxread(nazwa,islice,ii,jj,kk,ll,mm,iR,ib,iparm) + 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" + real*4 csingle(3,maxres2) + character*64 nazwa,bprotfile_temp + character*3 liczba + integer i,is,ie,j,ii,jj,k,kk,l,ll,mm,if + integer nrec,nlines,iscor,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(0:maxprocs-1) + integer iparm,ib,iib,ir,nprop,nthr,nrec_slice + double precision etot,time + logical lerr + nrec_slice=(rec_end(iR,ib,iparm)-rec_start(iR,ib,iparm)+1)/nslice + is=rec_start(iR,ib,iparm)+(islice-1)*nrec_slice + ie=rec_start(iR,ib,iparm)+islice*nrec_slice-1 + write (iout,*) "bxread: islice",islice," nslice",nslice, + & " nrec_slice",nrec_slice + write (iout,*) "is",is," ie",ie,"rec_start", + & rec_start(iR,ib,iparm)," rec_end",rec_end(iR,ib,iparm) + do i=is,ie + read(ientin,rec=i+1,err=101) + & ((csingle(l,k),l=1,3),k=1,nres), + & ((csingle(l,k+nres),l=1,3),k=nnt,nct), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & eini,efree,rmsdev,(prop(j),j=1,nQ),iscor + ii=ii+1 + kk=kk+1 + if (mod(kk,isampl(iparm)).eq.0) then + jj=jj+1 + write(ientout,rec=jj) + & ((csingle(l,k),l=1,3),k=1,nres), + & ((csingle(l,k+nres),l=1,3),k=nnt,nct), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & eini,efree,rmsdev,(prop(j),j=1,nQ),iR,ib,iparm +#ifdef DEBUG + do i=1,2*nres + do j=1,3 + c(j,i)=csingle(j,i) + enddo + enddo + call int_from_cart1(.false.) + write (iout,*) "Writing conformation, record",jj + 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) + write (iout,'(f10.5,i5)') rmsdev,iscor +#endif + endif + enddo + 101 continue + close(ientin) + write (iout,*) ii," conformations read from DA file ", + & nazwa(:ilen(nazwa)) + write (iout,*) kk," conformations read so far, slice",islice + write (iout,*) jj," conformations stored so far, slice",islice + + return + end diff --git a/source/wham/src-NEWSC/cartder.f b/source/wham/src-NEWSC/cartder.f new file mode 100755 index 0000000..ed14f18 --- /dev/null +++ b/source/wham/src-NEWSC/cartder.f @@ -0,0 +1,306 @@ + subroutine cartder + implicit real*8 (a-h,o-z) +*********************************************************************** +* 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. +* +*********************************************************************** + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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) +* 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)=vbl*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)=vbl*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)=vbl*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)=vbl*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 + dsci=dsc(itype(i)) + alphi=alph(i) + omegi=omeg(i) +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/wham/src-NEWSC/cartprint.f b/source/wham/src-NEWSC/cartprint.f new file mode 100755 index 0000000..fd8ffe3 --- /dev/null +++ b/source/wham/src-NEWSC/cartprint.f @@ -0,0 +1,20 @@ + subroutine cartprint + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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/wham/src-NEWSC/chainbuild.F b/source/wham/src-NEWSC/chainbuild.F new file mode 100755 index 0000000..4c9f32f --- /dev/null +++ b/source/wham/src-NEWSC/chainbuild.F @@ -0,0 +1,281 @@ + 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 'DIMENSIONS.ZSCOPT' + 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 'DIMENSIONS.ZSCOPT' + 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,1)=vbld(2) + dc(2,1)=0.0D0 + dc(3,1)=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 'DIMENSIONS.ZSCOPT' + 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) + icrc=0 + call proc_proc(theti,icrc) + if(icrc.eq.1)theti=100.0 + phii=phi(i) + icrc=0 + call proc_proc(phii,icrc) + if(icrc.eq.1)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 'DIMENSIONS.ZSCOPT' + 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) +c detecting NaNQ + icrc=0 + call proc_proc(alphi,icrc) + if(icrc.eq.1)alphi=100.0 + icrc=0 + call proc_proc(omegi,icrc) + if(icrc.eq.1)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/wham/src-NEWSC/chainbuild.f b/source/wham/src-NEWSC/chainbuild.f new file mode 100755 index 0000000..26afd44 --- /dev/null +++ b/source/wham/src-NEWSC/chainbuild.f @@ -0,0 +1,258 @@ + 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 'DIMENSIONS.ZSCOPT' + 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 'DIMENSIONS.ZSCOPT' + 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,1)=vbld(2) + dc(2,1)=0.0D0 + dc(3,1)=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 'DIMENSIONS.ZSCOPT' + 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 + theti=theta(i) + phii=phi(i) + 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 'DIMENSIONS.ZSCOPT' + 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) + alphi=alph(i) + omegi=omeg(i) + 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/wham/src-NEWSC/compinfo.c b/source/wham/src-NEWSC/compinfo.c new file mode 100755 index 0000000..e28f686 --- /dev/null +++ b/source/wham/src-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/wham/src-NEWSC/conf_compar.F b/source/wham/src-NEWSC/conf_compar.F new file mode 100755 index 0000000..4b49345 --- /dev/null +++ b/source/wham/src-NEWSC/conf_compar.F @@ -0,0 +1,374 @@ + subroutine conf_compar(jcon,lprn,print_class) + implicit real*8 (a-h,o-z) +#ifdef MPI + include "mpif.h" +#endif + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'DIMENSIONS.FREE' + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + include 'COMMON.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.PEPTCONT' + include 'COMMON.CONTACTS1' + include 'COMMON.HEADER' + include 'COMMON.FREE' + include 'COMMON.ENERGIES' +#ifdef MPI + include 'COMMON.MPI' +#endif + integer ilen + external ilen + logical lprn,print_class + integer ncont_frag(mmaxfrag), + & icont_frag(2,maxcont,mmaxfrag),ncontsc, + & icontsc(1,maxcont),nsccont_frag(mmaxfrag), + & isccont_frag(2,maxcont,mmaxfrag) + integer isecstr(maxres) + integer itemp(maxfrag) + character*4 liczba + double precision Epot +c print *,"Enter conf_compar",jcon + call angnorm12(rmsang) +c Level 1: check secondary and supersecondary structure + call elecont(lprn,ncont,icont,nnt,nct) + call secondary2(lprn,.false.,ncont,icont,isecstr) + call contact(lprn,ncontsc,icontsc,nnt,nct) + if (lprn) write(iout,*) "Assigning electrostatic contacts" + call contacts_between_fragments(lprn,3,ncont,icont,ncont_frag, + & icont_frag) + if (lprn) write(iout,*) "Assigning sidechain contacts" + call contacts_between_fragments(lprn,3,ncontsc,icontsc, + & nsccont_frag,isccont_frag) + do i=1,nlevel + do j=1,isnfrag(nlevel+1) + iclass(j,i)=0 + enddo + enddo + do j=1,nfrag(1) + ind = icant(j,j) + if (lprn) then + write (iout,'(80(1h=))') + write (iout,*) "Level",1," fragment",j + write (iout,'(80(1h=))') + endif + rmsfrag(j,1)=rmscalc(0,1,j,jcon,lprn) +c Compare electrostatic contacts in the current conf with that in the native +c structure. + if (lprn) write (iout,*) + & "Comparing electrostatic contact map and local structure" + ncnat=ncont_frag_ref(ind) +c write (iout,*) "before match_contact:",nc_fragm(j,1), +c & nc_req_setf(j,1) + call match_secondary(j,isecstr,nsec_match,lprn) + if (lprn) write (iout,*) "Fragment",j," nsec_match", + & nsec_match," length",len_frag(j,1)," min_len", + & frac_sec*len_frag(j,1) + if (nsec_match.lt.frac_sec*len_frag(j,1)) then + iclass(j,1)=0 + if (lprn) write (iout,*) "Fragment",j, + & " has incorrect secondary structure" + else + iclass(j,1)=1 + if (lprn) write (iout,*) "Fragment",j, + & " has correct secondary structure" + endif + if (ielecont(j,1).gt.0) then + call match_contact(ishif1,ishif2,nc_match,ncon_match, + & ncont_frag_ref(ind),icont_frag_ref(1,1,ind), + & ncont_frag(ind),icont_frag(1,1,ind), + & j,n_shift(1,j,1),n_shift(2,j,1),nc_fragm(j,1), + & nc_req_setf(j,1),istruct(j),.true.,lprn) + else if (isccont(j,1).gt.0) then + call match_contact(ishif1,ishif2,nc_match,ncon_match, + & nsccont_frag_ref(ind),isccont_frag_ref(1,1,ind), + & nsccont_frag(ind),isccont_frag(1,1,ind), + & j,n_shift(1,j,1),n_shift(2,j,1),nc_fragm(j,1), + & nc_req_setf(j,1),istruct(j),.true.,lprn) + else if (iloc(j).gt.0) then +c write (iout,*) "n_shif",n_shift(1,j,1),n_shift(2,j,1) + call match_contact(ishif1,ishif2,nc_match,ncon_match, + & 0,icont_frag_ref(1,1,ind), + & ncont_frag(ind),icont_frag(1,1,ind), + & j,n_shift(1,j,1),n_shift(2,j,1),nc_fragm(j,1), + & 0,istruct(j),.true.,lprn) +c write (iout,*) "n_shif",n_shift(1,j,1),n_shift(2,j,1) + else + ishif=0 + nc_match=1 + endif + if (lprn) write (iout,*) "ishif1",ishif1," ishif2",ishif2 + ishif=ishif1 + qfrag(j,1)=qwolynes(1,j) + if (iabs(ishif2).gt.iabs(ishif1)) ishif=ishif2 + if (lprn) write (iout,*) "ishift",ishif," nc_match",nc_match +c write (iout,*) "j",j," ishif",ishif," rms",rmsfrag(j,1) + if (irms(j,1).gt.0) then + if (rmsfrag(j,1).le.rmscutfrag(1,j,1)) then + iclass_rms=2 + ishifft_rms=0 + else + ishiff=0 + rms=1.0d2 + iclass_rms=0 + do while (rms.gt.rmscutfrag(1,j,1) .and. + & ishiff.lt.n_shift(1,j,1)) + ishiff=ishiff+1 + rms=rmscalc(-ishiff,1,j,jcon,lprn) +c write(iout,*)"jcon,i,j,ishiff",jcon,i,j,-ishiff, +c & " rms",rms," rmscut",rmscutfrag(1,j,1) + if (lprn) write (iout,*) "rms",rmsfrag(j,1) + if (rms.gt.rmscutfrag(1,j,1)) then + rms=rmscalc(ishiff,1,j,jcon,lprn) +c write (iout,*) "jcon,1,j,ishiff",jcon,1,j,ishiff, +c & " rms",rms + endif + if (lprn) write (iout,*) "rms",rmsfrag(j,1) + enddo +c write (iout,*) "After loop: rms",rms, +c & " rmscut",rmscutfrag(1,j,1) +c write (iout,*) "iclass_rms",iclass_rms + if (rms.le.rmscutfrag(1,j,1)) then + ishifft_rms=ishiff + rmsfrag(j,1)=rms + iclass_rms=1 + endif +c write (iout,*) "iclass_rms",iclass_rms + endif +c write (iout,*) "ishif",ishif + if (iabs(ishifft_rms).gt.iabs(ishif)) ishif=ishifft_rms + else + iclass_rms=1 + endif +c write (iout,*) "ishif",ishif," iclass",iclass(j,1), +c & " iclass_rms",iclass_rms + if (nc_match.gt.0 .and. iclass_rms.gt.0) then + if (ishif.eq.0) then + iclass(j,1)=iclass(j,1)+6 + else + iclass(j,1)=iclass(j,1)+2 + endif + endif + ncont_nat(1,j,1)=nc_match + ncont_nat(2,j,1)=ncon_match + ishifft(j,1)=ishif +c write (iout,*) "iclass",iclass(j,1) + enddo +c Next levels: Check arrangements of elementary fragments. + do i=2,nlevel + do j=1,nfrag(i) + if (i .eq. 2) ind = icant(ipiece(1,j,i),ipiece(2,j,i)) + if (lprn) then + write (iout,'(80(1h=))') + write (iout,*) "Level",i," fragment",j + write (iout,'(80(1h=))') + endif +c If an elementary fragment doesn't exist, don't check higher hierarchy levels. + do k=1,npiece(j,i) + ik=ipiece(k,j,i) + if (iclass(ik,1).eq.0) then + iclass(j,i)=0 + goto 12 + endif + enddo + if (i.eq.2 .and. ielecont(j,i).gt.0) then + iclass_con=0 + ishifft_con=0 + if (lprn) write (iout,*) + & "Comparing electrostatic contact map: fragments", + & ipiece(1,j,i),ipiece(2,j,i)," ind",ind + call match_contact(ishif1,ishif2,nc_match,ncon_match, + & ncont_frag_ref(ind),icont_frag_ref(1,1,ind), + & ncont_frag(ind),icont_frag(1,1,ind), + & j,n_shift(1,j,i),n_shift(2,j,i),nc_fragm(j,i), + & nc_req_setf(j,i),2,.false.,lprn) + ishif=ishif1 + if (iabs(ishif2).gt.iabs(ishif1)) ishif=ishif2 + if (nc_match.gt.0) then + if (ishif.eq.0) then + iclass_con=2 + else + iclass_con=1 + endif + endif + ncont_nat(1,j,i)=nc_match + ncont_nat(2,j,i)=ncon_match + ishifft_con=ishif + else if (i.eq.2 .and. isccont(j,i).gt.0) then + iclass_con=0 + ishifft_con=0 + if (lprn) write (iout,*) + & "Comparing sidechain contact map: fragments", + & ipiece(1,j,i),ipiece(2,j,i)," ind",ind + call match_contact(ishif1,ishif2,nc_match,ncon_match, + & nsccont_frag_ref(ind),isccont_frag_ref(1,1,ind), + & nsccont_frag(ind),isccont_frag(1,1,ind), + & j,n_shift(1,j,i),n_shift(2,j,i),nc_fragm(j,i), + & nc_req_setf(j,i),2,.false.,lprn) + ishif=ishif1 + if (iabs(ishif2).gt.iabs(ishif1)) ishif=ishif2 + if (nc_match.gt.0) then + if (ishif.eq.0) then + iclass_con=2 + else + iclass_con=1 + endif + endif + ncont_nat(1,j,i)=nc_match + ncont_nat(2,j,i)=ncon_match + ishifft_con=ishif + else if (i.eq.2) then + iclass_con=2 + ishifft_con=0 + endif + if (i.eq.2) qfrag(j,2)=qwolynes(2,j) + if (lprn) write (iout,*) + & "Comparing rms: fragments", + & (ipiece(k,j,i),k=1,npiece(j,i)) + rmsfrag(j,i)=rmscalc(0,i,j,jcon,lprn) + if (irms(j,i).gt.0) then + iclass_rms=0 + ishifft_rms=0 + if (lprn) write (iout,*) "rms",rmsfrag(j,i) +c write (iout,*) "i",i," j",j," rmsfrag",rmsfrag(j,i), +c & " rmscutfrag",rmscutfrag(1,j,i) + if (rmsfrag(j,i).le.rmscutfrag(1,j,i)) then + iclass_rms=2 + ishifft_rms=0 + else + ishif=0 + rms=1.0d2 + do while (rms.gt.rmscutfrag(1,j,i) .and. + & ishif.lt.n_shift(1,j,i)) + ishif=ishif+1 + rms=rmscalc(-ishif,i,j,jcon,lprn) +c print *,"jcon,i,j,ishif",jcon,i,j,-ishif," rms",rms + if (lprn) write (iout,*) "rms",rmsfrag(j,i) + if (rms.gt.rmscutfrag(1,j,i)) then + rms=rmscalc(ishif,i,j,jcon,lprn) +c print *,"jcon,i,j,ishif",jcon,i,j,ishif," rms",rms + endif + if (lprn) write (iout,*) "rms",rms + enddo + if (rms.le.rmscutfrag(1,j,i)) then + ishifft_rms=ishif + rmsfrag(j,i)=rms + iclass_rms=1 + endif + endif + endif + if (irms(j,i).eq.0 .and. ielecont(j,i).eq.0 .and. + & isccont(j,i).eq.0 ) then + write (iout,*) "Error: no measure of comparison specified:", + & " level",i," part",j + stop + endif + if (lprn) + & write (iout,*) "iclass_con",iclass_con," iclass_rms",iclass_rms + if (i.eq.2) then + iclass(j,i) = min0(iclass_con,iclass_rms) + if (iabs(ishifft_rms).gt.iabs(ishifft_con)) then + ishifft(j,i)=ishifft_rms + else + ishifft(j,i)=ishifft_con + endif + else if (i.gt.2) then + iclass(j,i) = iclass_rms + ishifft(j,i)= ishifft_rms + endif + 12 continue + enddo + enddo + rms_nat=rmsnat(jcon) + qnat=qwolynes(0,0) +C Compute the structural class + iscor=0 + IF (.NOT. BINARY) THEN + do i=1,nlevel + IF (I.EQ.1) THEN + do j=1,nfrag(i) + itemp(j)=iclass(j,i) + enddo + do kk=-1,1 + do j=1,nfrag(i) + idig = 2*isnfrag(nlevel+1)-2*isnfrag(i)-kk*nfrag(i)-j + iex = 2**idig + im=mod(itemp(j),2) + itemp(j)=itemp(j)/2 +c write (iout,*) "i",i," j",j," idig",idig," iex",iex, +c & " iclass",iclass(j,i)," im",im + iscor=iscor+im*iex + enddo + enddo + ELSE + do j=1,nfrag(i) + idig = 2*isnfrag(nlevel+1)-2*isnfrag(i)-j + iex = 2**idig + if (iclass(j,i).gt.0) then + im=1 + else + im=0 + endif +c write (iout,*) "i",i," j",j," idig",idig," iex",iex, +c & " iclass",iclass(j,i)," im",im + iscor=iscor+im*iex + enddo + do j=1,nfrag(i) + idig = 2*isnfrag(nlevel+1)-2*isnfrag(i)-nfrag(i)-j + iex = 2**idig + if (iclass(j,i).gt.1) then + im=1 + else + im=0 + endif +c write (iout,*) "i",i," j",j," idig",idig," iex",iex, +c & " iclass",iclass(j,i)," im",im + iscor=iscor+im*iex + enddo + ENDIF + enddo + iscore=iscor + ENDIF + if (print_class) then +#ifdef MPI + write(istat,'(i6,$)') jcon+indstart(me)-1 + write (istat,'(f10.2,$)') (potE(jcon,k),k=1,nParmSet), + & -entfac(jcon) +#else + write(istat,'(i6,$)') jcon + write (istat,'(f10.2,$)') (potE(jcon,k),k=1,nParmSet), + & -entfac(jcon) +#endif + write (istat,'(f8.3,2f6.3,$)') + & rms_nat,qnat,rmsang/(nres-3) + do j=1,nlevel + write(istat,'(1x,$,20(i3,$))') + & (ncont_nat(1,k,j),k=1,nfrag(j)) + if (j.lt.3) then + write(istat,'(1x,$,20(f5.1,f5.2$))') + & (rmsfrag(k,j),qfrag(k,j),k=1,nfrag(j)) + else + write(istat,'(1x,$,20(f5.1$))') + & (rmsfrag(k,j),k=1,nfrag(j)) + endif + write(istat,'(1x,$,20(i1,$))') + & (iclass(k,j),k=1,nfrag(j)) + enddo + if (binary) then + write (istat,'(" ",$)') + do j=1,nlevel + write (istat,'(100(i1,$))')(iclass(k,j), + & k=1,nfrag(j)) + if (j.lt.nlevel) write(iout,'(".",$)') + enddo + write (istat,*) + else + write (istat,'(i10)') iscore + endif + endif + RETURN + END diff --git a/source/wham/src-NEWSC/cont_frag.f b/source/wham/src-NEWSC/cont_frag.f new file mode 100755 index 0000000..63a7717 --- /dev/null +++ b/source/wham/src-NEWSC/cont_frag.f @@ -0,0 +1,99 @@ + subroutine contacts_between_fragments(lprint,is,ncont,icont, + & ncont_interfrag,icont_interfrag) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.INTERACT' + include 'COMMON.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + integer icont(2,maxcont),ncont_interfrag(mmaxfrag), + & icont_interfrag(2,maxcont,mmaxfrag) + logical OK1,OK2,lprint +c Determine the contacts that occur within a fragment and between fragments. + do i=1,nfrag(1) + do j=1,i + ind = icant(i,j) + nc=0 +c write (iout,*) "i",i,(ifrag(1,k,i),ifrag(2,k,i) +c & ,k=1,npiece(i,1)) +c write (iout,*) "j",j,(ifrag(1,k,j),ifrag(2,k,j) +c & ,k=1,npiece(j,1)) +c write (iout,*) "ncont",ncont + do k=1,ncont + ic1=icont(1,k) + ic2=icont(2,k) + OK1=.false. + l=0 + do while (.not.OK1 .and. l.lt.npiece(j,1)) + l=l+1 + OK1=ic1.ge.ifrag(1,l,j)-is .and. + & ic1.le.ifrag(2,l,j)+is + enddo + OK2=.false. + l=0 + do while (.not.OK2 .and. l.lt.npiece(i,1)) + l=l+1 + OK2=ic2.ge.ifrag(1,l,i)-is .and. + & ic2.le.ifrag(2,l,i)+is + enddo +c write(iout,*) "k",k," ic1",ic1," ic2",ic2," OK1",OK1, +c & " OK2",OK2 + if (OK1.and.OK2) then + nc=nc+1 + icont_interfrag(1,nc,ind)=ic1 + icont_interfrag(2,nc,ind)=ic2 +c write (iout,*) "nc",nc," ic1",ic1," ic2",ic2 + endif + enddo + ncont_interfrag(ind)=nc +c do k=1,ncont_interfrag(ind) +c i1=icont_interfrag(1,k,ind) +c i2=icont_interfrag(2,k,ind) +c it1=itype(i1) +c it2=itype(i2) +c write (iout,'(i3,2x,a,i4,2x,a,i4)') +c & i,restyp(it1),i1,restyp(it2),i2 +c enddo + enddo + enddo + if (lprint) then + write (iout,*) "Contacts within fragments:" + do i=1,nfrag(1) + write (iout,*) "Fragment",i," (",(ifrag(1,k,i), + & ifrag(2,k,i),k=1,npiece(i,1)),")" + ind=icant(i,i) + do k=1,ncont_interfrag(ind) + i1=icont_interfrag(1,k,ind) + i2=icont_interfrag(2,k,ind) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4)') + & i,restyp(it1),i1,restyp(it2),i2 + enddo + enddo + write (iout,*) + write (iout,*) "Contacts between fragments:" + do i=1,nfrag(1) + do j=1,i-1 + ind = icant(i,j) + write (iout,*) "Fragments",i," (",(ifrag(1,k,i), + & ifrag(2,k,i),k=1,npiece(i,1)),") and",j," (", + & (ifrag(1,k,j),ifrag(2,k,j),k=1,npiece(j,1)),")" + write (iout,*) "Number of contacts", + & ncont_interfrag(ind) + ind=icant(i,j) + do k=1,ncont_interfrag(ind) + i1=icont_interfrag(1,k,ind) + i2=icont_interfrag(2,k,ind) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4)') + & i,restyp(it1),i1,restyp(it2),i2 + enddo + enddo + enddo + endif + return + end diff --git a/source/wham/src-NEWSC/contact.f b/source/wham/src-NEWSC/contact.f new file mode 100755 index 0000000..5b05d57 --- /dev/null +++ b/source/wham/src-NEWSC/contact.f @@ -0,0 +1,171 @@ + subroutine contact(lprint,ncont,icont,ist,ien) + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + include 'COMMON.CALC' + include 'COMMON.CONTPAR' + include 'COMMON.LOCAL' + integer ist,ien,kkk,iti,itj,itypi,itypj,i1,i2,it1,it2 + real*8 csc,dist + real*8 cscore(maxcont),omt1(maxcont),omt2(maxcont),omt12(maxcont), + & ddsc(maxcont),ddla(maxcont),ddlb(maxcont) + integer ncont,icont(2,maxcont) + real*8 u,v,a(3),b(3),dla,dlb + logical lprint + ncont=0 + kkk=3 + if (lprint) then + do i=1,nres + write (iout,110) restyp(itype(i)),i,c(1,i),c(2,i), + & c(3,i),dc(1,nres+i),dc(2,nres+i),dc(3,nres+i), + & dc_norm(1,nres+i),dc_norm(2,nres+i),dc_norm(3,nres+i) + enddo + endif + 110 format (a,'(',i3,')',9f8.3) + do i=ist,ien-kkk + iti=itype(i) + do j=i+kkk,ien + itj=itype(j) + itypi=iti + itypj=itj + 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) + dxi = dc_norm(1,nres+i) + dyi = dc_norm(2,nres+i) + dzi = dc_norm(3,nres+i) + dxj = dc_norm(1,nres+j) + dyj = dc_norm(2,nres+j) + dzj = dc_norm(3,nres+j) + do k=1,3 + a(k)=dc(k,nres+i) + b(k)=dc(k,nres+j) + enddo +c write (iout,*) (a(k),k=1,3),(b(k),k=1,3) + if (icomparfunc.eq.1) then + call contfunc(csc,iti,itj) + else if (icomparfunc.eq.2) then + call scdist(csc,iti,itj) + else if (icomparfunc.eq.3 .or. icomparfunc.eq.5) then + csc = dist(nres+i,nres+j) + else if (icomparfunc.eq.4) then + call odlodc(c(1,i),c(1,j),a,b,u,v,dla,dlb,csc) + else + write (*,*) "Error - Unknown sidechain contact function" + write (iout,*) "Error - Unknown sidechain contact function" + endif + if (csc.lt.sc_cutoff(iti,itj)) then +c write(iout,*) "i",i," j",j," dla",dla,dsc(iti), +c & " dlb",dlb,dsc(itj)," csc",csc,sc_cutoff(iti,itj), +c & dxi,dyi,dzi,dxi**2+dyi**2+dzi**2, +c & dxj,dyj,dzj,dxj**2+dyj**2+dzj**2,om1,om2,om12, +c & xj,yj,zj +c write(iout,*)'egb',itypi,itypj,chi1,chi2,chip1,chip2, +c & sig0ij,rij,rrij,om1,om2,om12,chiom1,chiom2,chiom12, +c & chipom1,chipom2,chipom12,sig,eps2rt,rij_shift,e2,evdw, +c & csc + ncont=ncont+1 + cscore(ncont)=csc + icont(1,ncont)=i + icont(2,ncont)=j + omt1(ncont)=om1 + omt2(ncont)=om2 + omt12(ncont)=om12 + ddsc(ncont)=1.0d0/rij + ddla(ncont)=dla + ddlb(ncont)=dlb + 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,5f8.3,3f10.5)') + & i,restyp(it1),i1,restyp(it2),i2,cscore(i), + & sc_cutoff(it1,it2),ddsc(i),ddla(i),ddlb(i), + & omt1(i),omt2(i),omt12(i) + enddo + endif + return + end +c---------------------------------------------------------------------------- + double precision function contact_fract(ncont,ncont_ref, + & icont,icont_ref) + implicit none + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + integer i,j,nmatch + 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------------------------------------------------------------------------------ + subroutine pept_cont(lprint,ncont,icont) + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + integer ncont,icont(2,maxcont) + integer i,j,k,kkk,i1,i2,it1,it2 + logical lprint + real*8 dist + real*8 rcomp /5.5d0/ + ncont=0 + kkk=0 + print *,'Entering pept_cont: 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 + return + end diff --git a/source/wham/src-NEWSC/contfunc.f b/source/wham/src-NEWSC/contfunc.f new file mode 100755 index 0000000..7aed575 --- /dev/null +++ b/source/wham/src-NEWSC/contfunc.f @@ -0,0 +1,96 @@ + subroutine contfunc(cscore,itypi,itypj) +C +C This subroutine calculates the contact function based on +C the Gay-Berne potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTPAR' + include 'COMMON.CALC' + integer expon /6/ +C + sig0ij=sig_comp(itypi,itypj) + chi1=chi_comp(itypi,itypj) + chi2=chi_comp(itypj,itypi) + chi12=chi1*chi2 + chip1=chip_comp(itypi,itypj) + chip2=chip_comp(itypj,itypi) + chip12=chip1*chip2 + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) +C Calculate angle-dependent terms of the contact function + 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 print *,'egb',itypi,itypj,chi1,chi2,chip1,chip2, +c & sig0ij, +c & rij,rrij,om1,om2,om12 +C Calculate eps1(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) + om1om2=om1*om2 + chiom1=chi1*om1 + chiom2=chi2*om2 + facsig=om1*chiom1+om2*chiom2-2.0D0*om1om2*chiom12 + sigsq=1.0D0-facsig*faceps1_inv +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 + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+sig0ij + if (rij_shift.le.0.0D0) then + evdw=1.0D1 + cscore = -dlog(evdw+1.0d-6) + return + endif + rij_shift=1.0D0/rij_shift + e2=(rij_shift*sig0ij)**expon + evdw=dabs(eps1*eps2rt**2*e2) + if (evdw.gt.1.0d1) evdw = 1.0d1 + cscore = -dlog(evdw+1.0d-6) + return + end +c------------------------------------------------------------------------------ + subroutine scdist(cscore,itypi,itypj) +C +C This subroutine calculates the contact distance +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTPAR' + include 'COMMON.CALC' +C + chi1=chi_comp(itypi,itypj) + chi2=chi_comp(itypj,itypi) + chi12=chi1*chi2 + rrij=xj*xj+yj*yj+zj*zj + rij=dsqrt(rrij) +C Calculate angle-dependent terms of the contact function + 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 + om1om2=om1*om2 + chiom1=chi1*om1 + chiom2=chi2*om2 + cscore=dsqrt(rrij+chi1**2+chi2**2+2*rij*(chiom2-chiom1)-2*chiom12) + return + end diff --git a/source/wham/src-NEWSC/cxread.F b/source/wham/src-NEWSC/cxread.F new file mode 100755 index 0000000..0735f11 --- /dev/null +++ b/source/wham/src-NEWSC/cxread.F @@ -0,0 +1,336 @@ + 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' +#ifdef MPI + include "mpif.h" + include "COMMON.MPI" +#endif + 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 + character*4 lt_bath + character*256 pdbfilename + character*50 tytul + 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) +c write (iout,*) "nprop",nprop + 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 + call flush(iout) + 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 +#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 +c write (iout,*) "calling slice" +c call flush(iout) + islice=slice(nstep(itraj),time,is,ie,ts,te) +c write (iout,*) "islice",islice +c call flush(iout) + + 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 + + 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 + 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 + 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 PDBOUT +#ifdef MPI + if (me.eq.Master) then +#endif + write (iout,*) "PDBOUT" + write (iout,*) "temperature",1.0d0/(rt_bath*1.987D-3) + call flush(iout) + write (lt_bath,'(f4.0)') 1.0d0/(rt_bath*1.987D-3) + write (iout,*) "lt_bath ",lt_bath + pdbfilename=prefix(:ilen(prefix))//"_"//lt_bath//"pdb" + write (iout,*) "pdb ",pdbfilename + call flush(iout) + open(ipdb,file=pdbfilename,position="append") +c write (tytul,'("Conformation",i10," T=",f5.1)') +c & kk(islice),rt_bath + call pdbout(kk(islice),1.0d0/(rt_bath*1.987D-3), + & efree+0.0d0,rpotE+0.0d0,efree+0.0d0,rmsdev+0.0d0) + close(ipdb) +#ifdef MPI + endif +#endif +#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-NEWSC/cxread.F.org b/source/wham/src-NEWSC/cxread.F.org new file mode 100755 index 0000000..80bc1a0 --- /dev/null +++ b/source/wham/src-NEWSC/cxread.F.org @@ -0,0 +1,248 @@ + 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 + 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)) + call xdrffloat_(ixdrf, rtime, iret) +c print *,"rtime",rtime," iret",iret + call xdrffloat_(ixdrf, rpotE, iret) +c write (iout,*) "rpotE",rpotE," iret",iret + call flush(iout) + call xdrffloat_(ixdrf, ruconst, iret) + call xdrffloat_(ixdrf, rt_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, nprop, iret) + do i=1,nprop + call xdrffloat_(ixdrf, rprop(i), iret) + enddo +#else + call xdrffloat(ixdrf, rtime, iret) + call xdrffloat(ixdrf, rpotE, iret) +c write (iout,*) "rpotE",rpotE," iret",iret + call flush(iout) + call xdrffloat(ixdrf, ruconst, iret) + call xdrffloat(ixdrf, rt_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, nprop, iret) +c write (iout,*) "nprop",nprop + call flush(iout) + do i=1,nprop + call xdrffloat(ixdrf, rprop(i), iret) + enddo +#endif + if (iret.eq.0) exit + itraj=mod(it,totraj(iR,iparm)) +#ifdef DEBUG + write (iout,*) "ii",ii," itraj",itraj +#endif + call flush(iout) + it=it+1 + if (itraj.gt.ntraj) ntraj=itraj + nstep(itraj)=nstep(itraj)+1 +#ifdef DEBUG + write (iout,*) rtime,rpotE,rt_bath,nss, + & (ihpb(j),jhpb(j),j=1,nss),(rprop(j),j=1,nprop) + 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 +c write (iout,*) "calling slice" +c call flush(iout) + islice=slice(nstep(itraj),time,is,ie,ts,te) +c write (iout,*) "islice",islice +c call flush(iout) + + if (islice.gt.0 .and. islice.le.nslice) then + ii=ii+1 + kk(islice)=kk(islice)+1 + mm(islice)=mm(islice)+1 + if (mod(nstep(itraj),isampl(iparm)).eq.0) 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) + exit + call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE) + endif + else + iib = ib + endif + + efree=0.0d0 + jj(islice)=jj(islice)+1 + snk(iR,iib,iparm,islice)=snk(iR,iib,iparm,islice)+1 + 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 + 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 +#ifdef DEBUG + 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 + 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 + + enddo + 112 continue + 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-NEWSC/define_pairs.f b/source/wham/src-NEWSC/define_pairs.f new file mode 100755 index 0000000..00866a8 --- /dev/null +++ b/source/wham/src-NEWSC/define_pairs.f @@ -0,0 +1,120 @@ + subroutine define_pairs + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.COMPAR' + include 'COMMON.FRAG' + include 'COMMON.CHAIN' + include 'COMMON.HEADER' + include 'COMMON.GEO' + include 'COMMON.CONTACTS1' + include 'COMMON.PEPTCONT' + do j=1,nfrag(1) + length_frag = 0 + do k=1,npiece(j,1) + length_frag=length_frag+ifrag(2,k,j)-ifrag(1,k,j)+1 + enddo + len_frag(j,1)=length_frag + write (iout,*) "Fragment",j," length",len_frag(j,1) + enddo + nfrag(2)=0 + do i=1,nfrag(1) + do j=i+1,nfrag(1) + ind = icant(i,j) + if (istruct(i).le.1 .or. istruct(j).le.1) then + if (istruct(i).le.1) then + ll1=len_frag(i,1) + else + ll1=len_frag(i,1)/2 + endif + if (istruct(j).le.1) then + ll2=len_frag(j,1) + else + ll2=len_frag(j,1)/2 + endif + len_cut=max0(min0(ll1*2/3,ll2*4/5),3) + else + if (istruct(i).eq.2 .or. istruct(i).eq.4) then + ll1=len_frag(i,1)/2 + else + ll1=len_frag(i,1) + endif + if (istruct(j).eq.2 .or. istruct(j).eq.4) then + ll2=len_frag(j,1)/2 + else + ll2=len_frag(j,1) + endif + len_cut=max0(min0(ll1*4/5,ll2)*4/5,3) + endif + write (iout,*) "Fragments",i,j," structure",istruct(i), + & istruct(j)," # contacts", + & ncont_frag_ref(ind),nsccont_frag_ref(ind), + & " lengths",len_frag(i,1),len_frag(j,1), + & " ll1",ll1," ll2",ll2," len_cut",len_cut + if ((istruct(i).eq.1 .or. istruct(j).eq.1) .and. + & nsccont_frag_ref(ind).ge.len_cut ) then + if (istruct(i).eq.1 .and. istruct(j).eq.1) then + write (iout,*) "Adding pair of helices",i,j, + & " based on SC contacts" + else + write (iout,*) "Adding helix+strand/sheet pair",i,j, + & " based on SC contacts" + endif + nfrag(2)=nfrag(2)+1 + if (icont_pair.gt.0) then + write (iout,*) "# SC contacts will be used", + & " in comparison." + isccont(nfrag(2),2)=1 + endif + if (irms_pair.gt.0) then + write (iout,*) "Fragment RMSD will be used", + & " in comparison." + irms(nfrag(2),2)=1 + endif + npiece(nfrag(2),2)=2 + ipiece(1,nfrag(2),2)=i + ipiece(2,nfrag(2),2)=j + ielecont(nfrag(2),2)=0 + n_shift(1,nfrag(2),2)=nshift_pair + n_shift(2,nfrag(2),2)=nshift_pair + nc_fragm(nfrag(2),2)=ncfrac_pair + nc_req_setf(nfrag(2),2)=ncreq_pair + else if ((istruct(i).ge.2 .and. istruct(i).le.4) + & .and. (istruct(j).ge.2 .and. istruct(i).le.4) + & .and. ncont_frag_ref(ind).ge.len_cut ) then + nfrag(2)=nfrag(2)+1 + write (iout,*) "Adding pair strands/sheets",i,j, + & " based on pp contacts" + if (icont_pair.gt.0) then + write (iout,*) "# pp contacts will be used", + & " in comparison." + ielecont(nfrag(2),2)=1 + endif + if (irms_pair.gt.0) then + write (iout,*) "Fragment RMSD will be used", + & " in comparison." + irms(nfrag(2),2)=1 + endif + npiece(nfrag(2),2)=2 + ipiece(1,nfrag(2),2)=i + ipiece(2,nfrag(2),2)=j + ielecont(nfrag(2),2)=1 + isccont(nfrag(2),2)=0 + n_shift(1,nfrag(2),2)=nshift_pair + n_shift(2,nfrag(2),2)=nshift_pair + nc_fragm(nfrag(2),2)=ncfrac_bet + nc_req_setf(nfrag(2),2)=ncreq_bet + endif + enddo + enddo + write (iout,*) "Pairs found" + do i=1,nfrag(2) + write (iout,*) ipiece(1,i,2),ipiece(2,i,2) + enddo + return + end diff --git a/source/wham/src-NEWSC/elecont.f b/source/wham/src-NEWSC/elecont.f new file mode 100755 index 0000000..1eff2f1 --- /dev/null +++ b/source/wham/src-NEWSC/elecont.f @@ -0,0 +1,207 @@ + subroutine elecont(lprint,ncont,icont,ist,ien) + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + include 'COMMON.LOCAL' + logical lprint + integer i,j,k,ist,ien,iteli,itelj,ind,i1,i2,it1,it2,ic1,ic2 + double precision rri,xi,yi,zi,dxi,dyi,dzi,xmedi,ymedi,zmedi, + & xj,yj,zj,dxj,dyj,dzj,aaa,bbb,ael6i,ael3i,rrmij,rmij,r3ij,r6ij, + & vrmij,cosa,cosb,cosg,fac,ev1,ev2,fac3,fac4,evdwij,el1,el2, + & eesij,ees,evdw,ene + double precision elpp6c(2,2),elpp3c(2,2),ael6c(2,2),ael3c(2,2), + & appc(2,2),bppc(2,2) + double precision elcutoff,elecutoff_14 + 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/ +c data rpp / 4.5088d0, 4.5395d0, 4.5395d0, 4.4846d0/ + data elpp6c /-0.2379d0,-0.2056d0,-0.2056d0,-0.0610d0/ + data elpp3c / 0.0503d0, 0.0000d0, 0.0000d0, 0.0692d0/ + data elcutoff /-0.3d0/,elecutoff_14 /-0.5d0/ + ees=0.0d0 + evdw=0.0d0 + if (lprint) write (iout,'(a)') + & "Constants of electrostatic interaction energy expression." + do i=1,2 + do j=1,2 + rri=rpp(i,j)**6 + appc(i,j)=epp(i,j)*rri*rri + bppc(i,j)=-2.0*epp(i,j)*rri + ael6c(i,j)=elpp6c(i,j)*4.2**6 + ael3c(i,j)=elpp3c(i,j)*4.2**3 + if (lprint) + & write (iout,'(2i2,4e15.4)') i,j,appc(i,j),bppc(i,j),ael6c(i,j), + & ael3c(i,j) + enddo + enddo + ncont=0 + do 1 i=ist,ien-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,ien-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=appc(iteli,itelj) + bbb=bppc(iteli,itelj) + ael6i=ael6c(iteli,itelj) + ael3i=ael3c(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=ael6i*r6ij + fac4=ael3i*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 diff --git a/source/wham/src-NEWSC/enecalc1.F b/source/wham/src-NEWSC/enecalc1.F new file mode 100755 index 0000000..c9f4de8 --- /dev/null +++ b/source/wham/src-NEWSC/enecalc1.F @@ -0,0 +1,780 @@ + subroutine enecalc(islice,*) + 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.SBRIDGE" + include "COMMON.GEO" + include "COMMON.FFIELD" + include "COMMON.ENEPS" + include "COMMON.LOCAL" + include "COMMON.WEIGHTS" + include "COMMON.INTERACT" + include "COMMON.FREE" + include "COMMON.ENERGIES" + include "COMMON.CONTROL" + include "COMMON.TORCNSTR" + character*64 nazwa + character*80 bxname + character*3 liczba + double precision qwolynes + external qwolynes + integer errmsg_count,maxerrmsg_count /100/ + double precision rmsnat,gyrate + external rmsnat,gyrate + double precision tole /1.0d-1/ + integer i,itj,ii,iii,j,k,l,licz + integer ir,ib,ipar,iparm + integer iscor,islice + real*4 csingle(3,maxres2) + double precision energ + integer ilen,iroof + external ilen,iroof + double precision energia(0:max_ene),rmsdev,efree,eini + double precision fT(6),quot,quotl,kfacl,kfac /2.4d0/,T0 /3.0d2/ + double precision tt + integer snk_p(MaxR,MaxT_h,Max_parm) + logical lerr + character*64 bprotfile_temp + call opentmp(islice,ientout,bprotfile_temp) + iii=0 + ii=0 + errmsg_count=0 + write (iout,*) "enecalc: nparmset ",nparmset +#ifdef MPI + do iparm=1,nParmSet + do ib=1,nT_h(iparm) + do i=1,nR(ib,iparm) + snk_p(i,ib,iparm)=0 + enddo + enddo + enddo + do i=indstart(me1),indend(me1) +#else + do iparm=1,nParmSet + do ib=1,nT_h(iparm) + do i=1,nR(ib,iparm) + snk(i,ib,iparm)=0 + enddo + enddo + enddo + do i=1,ntot +#endif + read(ientout,rec=i,err=101) + & ((csingle(l,k),l=1,3),k=1,nres), + & ((csingle(l,k+nres),l=1,3),k=nnt,nct), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & eini,efree,rmsdev,(q(j,iii+1),j=1,nQ),iR,ib,ipar + if (indpdb.gt.0) then + do k=1,nres + do l=1,3 + c(l,k)=csingle(l,k) + enddo + enddo + do k=nnt,nct + do l=1,3 + c(l,k+nres)=csingle(l,k+nres) + enddo + enddo + q(nQ+1,iii+1)=rmsnat(iii+1) + endif + q(nQ+2,iii+1)=gyrate(iii+1) +c fT=T0*beta_h(ib,ipar)*1.987D-3 +c ft=2.0d0/(1.0d0+1.0d0/(T0*beta_h(ib,ipar)*1.987D-3)) + if (rescale_mode.eq.1) then + quot=1.0d0/(T0*beta_h(ib,ipar)*1.987D-3) +#if defined(FUNCTH) + tt = 1.0d0/(beta_h(ib,ipar)*1.987D-3) + ft(6)=(320.0+80.0*dtanh((tt-320.0)/80.0))/320.0 +#elif defined(FUNCT) + ft(6)=quot +#else + ft(6)=1.0d0 +#endif + quotl=1.0d0 + kfacl=1.0d0 + do l=1,5 + quotl=quotl*quot + kfacl=kfacl*kfac + fT(l)=kfacl/(kfacl-1.0d0+quotl) + enddo + else if (rescale_mode.eq.2) then + quot=1.0d0/(T0*beta_h(ib,ipar)*1.987D-3) +#if defined(FUNCTH) + tt = 1.0d0/(beta_h(ib,ipar)*1.987D-3) + ft(6)=(320.0+80.0*dtanh((tt-320.0)/80.0))/320.0 +#elif defined(FUNCT) + ft(6)=quot +#else + ft(6)=1.0d0 +#endif + quotl=1.0d0 + do l=1,5 + quotl=quotl*quot + fT(l)=1.12692801104297249644d0/ + & dlog(dexp(quotl)+dexp(-quotl)) + enddo + else if (rescale_mode.eq.0) then + do l=1,5 + fT(l)=1.0d0 + enddo + else + write (iout,*) "Error in ECECALC: wrong RESCALE_MODE", + & rescale_mode + call flush(iout) + return1 + endif + +c write (iout,*) "T",1.0d0/(beta_h(ib,ipar)*1.987D-3)," T0",T0, +c & " kfac",kfac,"quot",quot," fT",fT + do j=1,2*nres + do k=1,3 + c(k,j)=csingle(k,j) + enddo + enddo + call int_from_cart1(.false.) + ii=ii+1 + do iparm=1,nparmset + + call restore_parm(iparm) +#ifdef DEBUG + write (iout,*) wsc,wscp,welec,wvdwpp,wang,wtor,wscloc, + & wcorr,wcorr5,wcorr6,wturn4,wturn3,wturn6,wel_loc, + & wtor_d,wsccor,wbond +#endif +c write (iout,*) "Calling ETOTAL" + call etotal(energia(0),fT,beta_h(ib,iparm)) +#ifdef DEBUG + write (iout,*) "Conformation",i + call enerprint(energia(0),fT) +c write (iout,'(2i5,21f8.2)') i,iparm,(energia(k),k=1,21) +c write (iout,*) "ftors",ftors +c call intout +#endif + if (energia(0).ge.1.0d20) then + write (iout,*) "NaNs detected in some of the energy", + & " components for conformation",ii+1 + write (iout,*) "The Cartesian geometry is:" + write (iout,'(8f10.5)') ((c(l,k),l=1,3),k=1,nres) + write (iout,'(8f10.5)') ((c(l,k+nres),l=1,3),k=nnt,nct) + write (iout,*) "The internal geometry is:" +c call intout +c call pdbout(ii+1,beta_h(ib,ipar),efree,energia(0),0.0d0,rmsdev) + 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,*) "The components of the energy are:" + call enerprint(energia(0),fT) + write (iout,*) + & "This conformation WILL NOT be added to the database." + call flush(iout) + goto 121 + else +#ifdef DEBUG + if (ipar.eq.iparm) write (iout,*) i,iparm, + & 1.0d0/(beta_h(ib,ipar)*1.987D-3),eini,energia(0) +#endif + if (ipar.eq.iparm .and. einicheck.gt.0 .and. + & dabs(eini-energia(0)).gt.tole) then + if (errmsg_count.le.maxerrmsg_count) then + write (iout,'(2a,2e15.5,a,2i8,a,f8.1)') + & "Warning: energy differs remarkably from ", + & " the value read in: ",energia(0),eini," point", + & iii+1,indstart(me1)+iii," T", + & 1.0d0/(1.987D-3*beta_h(ib,ipar)) + errmsg_count=errmsg_count+1 + if (errmsg_count.gt.maxerrmsg_count) + & write (iout,*) "Too many warning messages" + if (einicheck.gt.1) then + write (iout,*) "Calculation stopped." + call flush(iout) +#ifdef MPI + call MPI_Abort(WHAM_COMM,IERROR,ERRCODE) +#endif + call flush(iout) + return1 + endif + endif + endif + potE(iii+1,iparm)=energia(0) + do k=1,21 + enetb(k,iii+1,iparm)=energia(k) + enddo +#ifdef DEBUG + write (iout,'(2i5,f10.1,3e15.5)') i,iii, + & 1.0d0/(beta_h(ib,ipar)*1.987D-3),energia(0),eini,efree + call enerprint(energia(0),fT) + write (iout,'(8f10.5)') ((c(l,k),l=1,3),k=1,nres) + write (iout,'(8f10.5)') ((c(l,k+nres),l=1,3),k=nnt,nct) + 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) + write (iout,'(8f10.5)') (q(k,iii+1),k=1,nQ) + write (iout,'(f10.5,i10)') rmsdev,iscor + call enerprint(energia(0),fT) + write(liczba,'(bz,i3.3)') me + nazwa="test"//liczba//".pdb" + write (iout,*) "pdb file",nazwa + open (ipdb,file=nazwa,position="append") + call pdbout(ii+1,beta_h(ib,ipar),efree,energia(0),0.0d0,rmsdev) + close(ipdb) +#endif + endif + + enddo ! iparm + + iii=iii+1 + if (q(1,iii).le.0.0d0 .and. indpdb.gt.0) q(1,iii)=qwolynes(0,0) + write (ientout,rec=iii) + & ((csingle(l,k),l=1,3),k=1,nres), + & ((csingle(l,k+nres),l=1,3),k=nnt,nct), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & potE(iii,ipar),efree,rmsdev,(q(k,iii),k=1,nQ),iR,ib,ipar +c write (iout,'(2i5,2e15.5)') ii,iii,potE(iii,ipar),efree +#ifdef MPI + if (separate_parset) then + snk_p(iR,ib,1)=snk_p(iR,ib,1)+1 + else + snk_p(iR,ib,ipar)=snk_p(iR,ib,ipar)+1 + endif +c write (iout,*) "iii",iii," iR",iR," ib",ib," ipar",ipar, +c & " snk",snk_p(iR,ib,ipar) +#else + snk(iR,ib,ipar,islice)=snk(iR,ib,ipar,islice)+1 +#endif + 121 continue + enddo +#ifdef MPI + scount(me)=iii + write (iout,*) "Me",me," scount",scount(me) + call flush(iout) +c Master gathers updated numbers of conformations written by all procs. + call MPI_AllGather( scount(me), 1, MPI_INTEGER, scount(0), 1, + & MPI_INTEGER, WHAM_COMM, IERROR) + indstart(0)=1 + indend(0)=scount(0) + do i=1, Nprocs-1 + indstart(i)=indend(i-1)+1 + indend(i)=indstart(i)+scount(i)-1 + enddo + write (iout,*) + write (iout,*) "Revised conformation counts" + do i=0,nprocs1-1 + write (iout,'(a,i5,a,i7,a,i7,a,i7)') + & "Processor",i," indstart",indstart(i), + & " indend",indend(i)," count",scount(i) + enddo + call flush(iout) + call MPI_AllReduce(snk_p(1,1,1),snk(1,1,1,islice), + & MaxR*MaxT_h*nParmSet, + & MPI_INTEGER,MPI_SUM,WHAM_COMM,IERROR) +#endif + stot(islice)=0 + do iparm=1,nParmSet + do ib=1,nT_h(iparm) + do i=1,nR(ib,iparm) + stot(islice)=stot(islice)+snk(i,ib,iparm,islice) + enddo + enddo + enddo + write (iout,*) "Revised SNK" + do iparm=1,nParmSet + do ib=1,nT_h(iparm) + write (iout,'("Param",i3," Temp",f6.1,3x,32i8)') + & iparm,1.0d0/(1.987D-3*beta_h(ib,iparm)), + & (snk(i,ib,iparm,islice),i=1,nR(ib,iparm)) + write (iout,*) "snk_p",(snk_p(i,ib,iparm),i=1,nR(ib,iparm)) + enddo + enddo + write (iout,'("Total",i10)') stot(islice) + call flush(iout) + return + 101 write (iout,*) "Error in scratchfile." + call flush(iout) + return1 + end +c------------------------------------------------------------------------------ + subroutine write_dbase(islice,*) + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" + include "DIMENSIONS.COMPAR" +#ifdef MPI + include "mpif.h" + integer IERROR,ERRCODE,STATUS(MPI_STATUS_SIZE) + include "COMMON.MPI" +#endif + include "COMMON.CONTROL" + include "COMMON.CHAIN" + include "COMMON.IOUNITS" + include "COMMON.PROTFILES" + include "COMMON.NAMES" + include "COMMON.VAR" + include "COMMON.SBRIDGE" + include "COMMON.GEO" + include "COMMON.FFIELD" + include "COMMON.ENEPS" + include "COMMON.LOCAL" + include "COMMON.WEIGHTS" + include "COMMON.INTERACT" + include "COMMON.FREE" + include "COMMON.ENERGIES" + include "COMMON.COMPAR" + include "COMMON.PROT" + character*64 nazwa + character*80 bxname,cxname + character*64 bprotfile_temp + character*3 liczba,licz + character*2 licz2 + integer i,itj,ii,iii,j,k,l + integer ixdrf,iret + integer iscor,islice + double precision rmsdev,efree,eini + real*4 csingle(3,maxres2) + double precision energ + integer ilen,iroof + external ilen,iroof + integer ir,ib,iparm + write (licz2,'(bz,i2.2)') islice + call opentmp(islice,ientout,bprotfile_temp) + write (iout,*) "bprotfile_temp ",bprotfile_temp + call flush(iout) + if (.not.bxfile .and. .not. cxfile .and. indpdb.eq.0 + & .and. ensembles.eq.0) then + close(ientout,status="delete") + return + endif +#ifdef MPI + write (liczba,'(bz,i3.3)') me + if (bxfile .or. cxfile .or. ensembles.gt.0) then + if (.not.separate_parset) then + bxname = prefix(:ilen(prefix))//liczba//".bx" + else + write (licz,'(bz,i3.3)') myparm + bxname = prefix(:ilen(prefix))//liczba//"_par"//licz//".bx" + endif + open (ientin,file=bxname,status="unknown", + & form="unformatted",access="direct",recl=lenrec1) + endif +#else + if (bxfile .or. cxfile .or. ensembles.gt.0) then + if (nslice.eq.1) then + bxname = prefix(:ilen(prefix))//".bx" + else + bxname = prefix(:ilen(prefix))// + & "_slice_"//licz2//".bx" + endif + open (ientin,file=bxname,status="unknown", + & form="unformatted",access="direct",recl=lenrec1) + write (iout,*) "Calculating energies; writing geometry", + & " and energy components to ",bxname(:ilen(bxname)) + endif +#if (defined(AIX) && !defined(JUBL)) + call xdrfopen_(ixdrf,cxname, "w", iret) +#else + call xdrfopen(ixdrf,cxname, "w", iret) +#endif + if (iret.eq.0) then + write (iout,*) "Error opening cxfile ",cxname(:ilen(cxname)) + cxfile=.fale. + endif + endif +#endif + if (indpdb.gt.0) then + if (nslice.eq.1) then +#ifdef MPI + if (.not.separate_parset) then + statname=prefix(:ilen(prefix))//'_'//pot(:ilen(pot)) + & //liczba//'.stat' + else + write (licz,'(bz,i3.3)') myparm + statname=prefix(:ilen(prefix))//'_par'//licz//'_'// + & pot(:ilen(pot))//liczba//'.stat' + endif + +#else + statname=prefix(:ilen(prefix))//'_'//pot(:ilen(pot))//'.stat' +#endif + else +#ifdef MPI + if (.not.separate_parset) then + statname=prefix(:ilen(prefix))//'_'//pot(:ilen(pot))// + & "_slice_"//licz2//liczba//'.stat' + else + write (licz,'(bz,i3.3)') myparm + statname=prefix(:ilen(prefix))//'_'//pot(:ilen(pot))// + & '_par'//licz//"_slice_"//licz2//liczba//'.stat' + endif +#else + statname=prefix(:ilen(prefix))//'_'//pot(:ilen(pot)) + & //"_slice_"//licz2//'.stat' +#endif + endif + open(istat,file=statname,status="unknown") + endif + +#ifdef MPI + do i=1,scount(me) +#else + do i=1,ntot(islice) +#endif + read(ientout,rec=i,err=101) + & ((csingle(l,k),l=1,3),k=1,nres), + & ((csingle(l,k+nres),l=1,3),k=nnt,nct), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & eini,efree,rmsdev,(q(k,i),k=1,nQ),iR,ib,iparm +c write (iout,*) iR,ib,iparm,eini,efree + do j=1,2*nres + do k=1,3 + c(k,j)=csingle(k,j) + enddo + enddo + call int_from_cart1(.false.) + iscore=0 + if (indpdb.gt.0) then + call conf_compar(i,.false.,.true.) + endif + if (bxfile .or.cxfile .or. ensembles.gt.0) write (ientin,rec=i) + & ((csingle(l,k),l=1,3),k=1,nres), + & ((csingle(l,k+nres),l=1,3),k=nnt,nct), + & nss,(ihpb(k),jhpb(k),k=1,nss), +c & potE(i,iparm),-entfac(i),rms_nat,iscore + & potE(i,nparmset),-entfac(i),rms_nat,iscore +c write (iout,'(2i5,3e15.5)') i,me,potE(i,iparm),-entfac(i) +#ifndef MPI + if (cxfile) call cxwrite(ixdrf,csingle,potE(i,nparmset), + & -entfac(i),rms_nat,iscore) +#endif + enddo + close(ientout,status="delete") + close(istat) + if (bxfile .or. cxfile .or. ensembles.gt.0) close(ientin) +#ifdef MPI + call MPI_Barrier(WHAM_COMM,IERROR) + if (me.ne.Master .or. .not.bxfile .and. .not. cxfile + & .and. ensembles.eq.0) return + write (iout,*) + if (bxfile .or. ensembles.gt.0) then + if (nslice.eq.1) then + if (.not.separate_parset) then + bxname = prefix(:ilen(prefix))//".bx" + else + write (licz,'(bz,i3.3)') myparm + bxname = prefix(:ilen(prefix))//"_par"//licz//".bx" + endif + else + if (.not.separate_parset) then + bxname = prefix(:ilen(prefix))//"_slice_"//licz2//".bx" + else + write (licz,'(bz,i3.3)') myparm + bxname = prefix(:ilen(prefix))//"par_"//licz// + & "_slice_"//licz2//".bx" + endif + endif + open (ientout,file=bxname,status="unknown", + & form="unformatted",access="direct",recl=lenrec1) + write (iout,*) "Master is creating binary database ", + & bxname(:ilen(bxname)) + endif + if (cxfile) then + if (nslice.eq.1) then + if (.not.separate_parset) then + cxname = prefix(:ilen(prefix))//".cx" + else + cxname = prefix(:ilen(prefix))//"_par"//licz//".cx" + endif + else + if (.not.separate_parset) then + cxname = prefix(:ilen(prefix))// + & "_slice_"//licz2//".cx" + else + cxname = prefix(:ilen(prefix))//"_par"//licz// + & "_slice_"//licz2//".cx" + endif + endif +#if (defined(AIX) && !defined(JUBL)) + call xdrfopen_(ixdrf,cxname, "w", iret) +#else + call xdrfopen(ixdrf,cxname, "w", iret) +#endif + if (iret.eq.0) then + write (iout,*) "Error opening cxfile ",cxname(:ilen(cxname)) + cxfile=.false. + endif + endif + do j=0,nprocs-1 + write (liczba,'(bz,i3.3)') j + if (separate_parset) then + write (licz,'(bz,i3.3)') myparm + bxname = prefix(:ilen(prefix))//liczba//"_par"//licz//".bx" + else + bxname = prefix(:ilen(prefix))//liczba//".bx" + endif + open (ientin,file=bxname,status="unknown", + & form="unformatted",access="direct",recl=lenrec1) + write (iout,*) "Master is reading conformations from ", + & bxname(:ilen(bxname)) + iii = 0 +c write (iout,*) "j",j," indstart",indstart(j)," indend",indend(j) +c call flush(iout) + do i=indstart(j),indend(j) + iii = iii+1 + read(ientin,rec=iii,err=101) + & ((csingle(l,k),l=1,3),k=1,nres), + & ((csingle(l,k+nres),l=1,3),k=nnt,nct), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & eini,efree,rmsdev,iscor + if (bxfile .or. ensembles.gt.0) then + write (ientout,rec=i) + & ((csingle(l,k),l=1,3),k=1,nres), + & ((csingle(l,k+nres),l=1,3),k=nnt,nct), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & eini,efree,rmsdev,iscor + endif + if(cxfile)call cxwrite(ixdrf,csingle,eini,efree,rmsdev,iscor) +#ifdef DEBUG + do k=1,2*nres + do l=1,3 + c(l,k)=csingle(l,k) + enddo + enddo + call int_from_cart1(.false.) + write (iout,'(2i5,3e15.5)') i,iii,eini,efree + write (iout,*) "The Cartesian geometry is:" + write (iout,'(8f10.5)') ((c(l,k),l=1,3),k=1,nres) + write (iout,'(8f10.5)') ((c(l,k+nres),l=1,3),k=nnt,nct) + write (iout,*) "The internal geometry is:" + 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) + write (iout,'(f10.5,i5)') rmsdev,iscor +#endif + enddo ! i + write (iout,*) iii," conformations (from",indstart(j)," to", + & indend(j),") read from ", + & bxname(:ilen(bxname)) + close (ientin,status="delete") + enddo ! j + if (bxfile .or. cxfile .or. ensembles.gt.0) close (ientout) +#if (defined(AIX) && !defined(JUBL)) + if (cxfile) call xdrfclose_(ixdrf,cxname,iret) +#else + if (cxfile) call xdrfclose(ixdrf,cxname,iret) +#endif +#endif + return + 101 write (iout,*) "Error in scratchfile." + call flush(iout) + return1 + end +c------------------------------------------------------------------------------- + subroutine cxwrite(ixdrf,csingle,eini,efree,rmsdev,iscor) + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" + include "DIMENSIONS.COMPAR" +#ifdef MPI + include "mpif.h" + integer IERROR,ERRCODE,STATUS(MPI_STATUS_SIZE) + include "COMMON.MPI" +#endif + include "COMMON.CONTROL" + include "COMMON.CHAIN" + include "COMMON.IOUNITS" + include "COMMON.PROTFILES" + include "COMMON.NAMES" + include "COMMON.VAR" + include "COMMON.SBRIDGE" + include "COMMON.GEO" + include "COMMON.FFIELD" + include "COMMON.ENEPS" + include "COMMON.LOCAL" + include "COMMON.WEIGHTS" + include "COMMON.INTERACT" + include "COMMON.FREE" + include "COMMON.ENERGIES" + include "COMMON.COMPAR" + include "COMMON.PROT" + integer i,j,itmp,iscor,iret,ixdrf + double precision rmsdev,efree,eini + real*4 csingle(3,maxres2),xoord(3,maxres2+2) + real*4 prec + +c write (iout,*) "cxwrite" +c call flush(iout) + prec=10000.0 + do i=1,nres + do j=1,3 + xoord(j,i)=csingle(j,i) + enddo + enddo + do i=nnt,nct + do j=1,3 + xoord(j,nres+i-nnt+1)=csingle(j,i+nres) + enddo + enddo + + itmp=nres+nct-nnt+1 + +c write (iout,*) "itmp",itmp +c call flush(iout) +#if (defined(AIX) && !defined(JUBL)) + call xdrf3dfcoord_(ixdrf, xoord, itmp, prec, iret) + +c write (iout,*) "xdrf3dfcoord" +c call flush(iout) + call xdrfint_(ixdrf, nss, iret) + do j=1,nss + call xdrfint_(ixdrf, ihpb(j), iret) + call xdrfint_(ixdrf, jhpb(j), iret) + enddo + call xdrffloat_(ixdrf,real(eini),iret) + call xdrffloat_(ixdrf,real(efree),iret) + call xdrffloat_(ixdrf,real(rmsdev),iret) + call xdrfint_(ixdrf,iscor,iret) +#else + call xdrf3dfcoord(ixdrf, xoord, itmp, prec, iret) + + call xdrfint(ixdrf, nss, iret) + do j=1,nss + call xdrfint(ixdrf, ihpb(j), iret) + call xdrfint(ixdrf, jhpb(j), iret) + enddo + call xdrffloat(ixdrf,real(eini),iret) + call xdrffloat(ixdrf,real(efree),iret) + call xdrffloat(ixdrf,real(rmsdev),iret) + call xdrfint(ixdrf,iscor,iret) +#endif + + return + end +c------------------------------------------------------------------------------ + logical function conf_check(ii,iprint) + 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.SBRIDGE" + include "COMMON.GEO" + include "COMMON.FFIELD" + include "COMMON.ENEPS" + include "COMMON.LOCAL" + include "COMMON.WEIGHTS" + include "COMMON.INTERACT" + include "COMMON.FREE" + include "COMMON.ENERGIES" + include "COMMON.CONTROL" + include "COMMON.TORCNSTR" + integer j,k,l,ii,itj,iprint + if (.not.check_conf) then + conf_check=.true. + return + endif + call int_from_cart1(.false.) + do j=nnt+1,nct + if (vbld(j).lt.2.0d0 .or. vbld(j).gt.5.0d0) then + if (iprint.gt.0) + & write (iout,*) "Bad CA-CA bond length",j," ",vbld(j), + & " for conformation",ii + if (iprint.gt.1) then + write (iout,*) "The Cartesian geometry is:" + write (iout,'(8f10.5)') ((c(l,k),l=1,3),k=1,nres) + write (iout,'(8f10.5)') ((c(l,k+nres),l=1,3),k=nnt,nct) + write (iout,*) "The internal geometry is:" + 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) + endif + if (iprint.gt.0) write (iout,*) + & "This conformation WILL NOT be added to the database." + conf_check=.false. + return + endif + enddo + do j=nnt,nct + itj=itype(j) + if (itype(j).ne.10 .and. (vbld(nres+j)-dsc(itj)).gt.2.0d0) then + if (iprint.gt.0) + & write (iout,*) "Bad CA-SC bond length",j," ",vbld(nres+j), + & " for conformation",ii + if (iprint.gt.1) then + write (iout,*) "The Cartesian geometry is:" + write (iout,'(8f10.5)') ((c(l,k),l=1,3),k=1,nres) + write (iout,'(8f10.5)') ((c(l,k+nres),l=1,3),k=nnt,nct) + write (iout,*) "The internal geometry is:" + 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) + endif + if (iprint.gt.0) write (iout,*) + & "This conformation WILL NOT be added to the database." + conf_check=.false. + return + endif + enddo + do j=3,nres + if (theta(j).le.0.0d0) then + if (iprint.gt.0) + & write (iout,*) "Zero theta angle(s) in conformation",ii + if (iprint.gt.1) then + write (iout,*) "The Cartesian geometry is:" + write (iout,'(8f10.5)') ((c(l,k),l=1,3),k=1,nres) + write (iout,'(8f10.5)') ((c(l,k+nres),l=1,3),k=nnt,nct) + write (iout,*) "The internal geometry is:" + 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) + endif + if (iprint.gt.0) write (iout,*) + & "This conformation WILL NOT be added to the database." + conf_check=.false. + return + endif + if (theta(j).gt.179.97*deg2rad) theta(j)=179.97*deg2rad + enddo + conf_check=.true. +c write (iout,*) "conf_check passed",ii + return + end diff --git a/source/wham/src-NEWSC/energy_p_new.F b/source/wham/src-NEWSC/energy_p_new.F new file mode 100755 index 0000000..113d499 --- /dev/null +++ b/source/wham/src-NEWSC/energy_p_new.F @@ -0,0 +1,9193 @@ + subroutine etotal(energia,fact) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + +#ifndef ISNAN + external proc_proc +#endif +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif + + include 'COMMON.IOUNITS' + double precision energia(0:max_ene),energia1(0:max_ene+1) +#ifdef MPL + include 'COMMON.INFO' + external d_vadd + integer ready +#endif + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + double precision fact(6) +cd write(iout, '(a,i2)')'Calling etotal ipot=',ipot +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(evdw,evdw_t) +cd print '(a)','Exit ELJ' + goto 107 +C Lennard-Jones-Kihara potential (shifted). + 102 call eljk(evdw,evdw_t) + goto 107 +C Berne-Pechukas potential (dilated LJ, angular dependence). + 103 call ebp(evdw,evdw_t) + goto 107 +C Gay-Berne potential (shifted LJ, angular dependence). + 104 call egb(evdw,evdw_t) + goto 107 +C Gay-Berne-Vorobjev potential (shifted LJ, angular dependence). + 105 call egbv(evdw,evdw_t) + goto 107 +C New SC-SC potential + 106 call emomo(evdw,evdw_p,evdw_m) +C +C Calculate electrostatic (H-bonding) energy of the main chain. +C + 107 call eelec(ees,evdw1,eel_loc,eello_turn3,eello_turn4) +C +C Calculate excluded-volume interaction energy between peptide groups +C and side chains. +C + call escp(evdw2,evdw2_14) +c +c Calculate the bond-stretching energy +c + call ebond(estr) +c write (iout,*) "estr",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 + call ebend(ebe) +cd print *,'Bend energy finished.' +C +C Calculate the SC local energy. +C + call esc(escloc) +cd print *,'SCLOC energy finished.' +C +C Calculate the virtual-bond torsional energy. +C +cd print *,'nterm=',nterm + call etor(etors,edihcnstr,fact(1)) +C +C 6/23/01 Calculate double-torsional energy +C + call etor_d(etors_d,fact(2)) +C +C 21/5/07 Calculate local sicdechain correlation energy +C + call eback_sc_corr(esccor) +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) then +c print *,"calling multibody_eello" + call multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr,n_corr1) +c write (*,*) 'n_corr=',n_corr,' n_corr1=',n_corr1 +c print *,ecorr,ecorr5,ecorr6,eturn6 + endif + if (wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) then + call multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) + endif +c write (iout,*) "ft(6)",fact(6)," evdw",evdw," evdw_t",evdw_t +#ifdef SPLITELE + etot=wsc*(evdw+fact(6)*evdw_t)+wscp*evdw2+welec*fact(1)*ees + & +wvdwpp*evdw1 + & +wang*ebe+wtor*fact(1)*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+wcorr*fact(3)*ecorr+wcorr5*fact(4)*ecorr5 + & +wcorr6*fact(5)*ecorr6+wturn4*fact(3)*eello_turn4 + & +wturn3*fact(2)*eello_turn3+wturn6*fact(5)*eturn6 + & +wel_loc*fact(2)*eel_loc+edihcnstr+wtor_d*fact(2)*etors_d + & +wbond*estr+wsccor*fact(1)*esccor +#else + etot=wsc*(evdw+fact(6)*evdw_t)+wscp*evdw2 + & +welec*fact(1)*(ees+evdw1) + & +wang*ebe+wtor*fact(1)*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+wcorr*fact(3)*ecorr+wcorr5*fact(4)*ecorr5 + & +wcorr6*fact(5)*ecorr6+wturn4*fact(3)*eello_turn4 + & +wturn3*fact(2)*eello_turn3+wturn6*fact(5)*eturn6 + & +wel_loc*fact(2)*eel_loc+edihcnstr+wtor_d*fact(2)*etors_d + & +wbond*estr+wsccor*fact(1)*esccor +#endif + energia(0)=etot + energia(1)=evdw +#ifdef SCP14 + energia(2)=evdw2-evdw2_14 + energia(17)=evdw2_14 +#else + energia(2)=evdw2 + energia(17)=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(18)=estr + energia(19)=esccor + energia(20)=edihcnstr + energia(21)=evdw_t +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 MPL +c endif +#endif + if (calc_grad) then +C +C Sum up the components of the Cartesian gradient. +C +#ifdef SPLITELE + do i=1,nct + do j=1,3 + gradc(j,i,icg)=wsc*gvdwc(j,i)+wscp*gvdwc_scp(j,i)+ + & welec*fact(1)*gelc(j,i)+wvdwpp*gvdwpp(j,i)+ + & wbond*gradb(j,i)+ + & wstrain*ghpbc(j,i)+ + & wcorr*fact(3)*gradcorr(j,i)+ + & wel_loc*fact(2)*gel_loc(j,i)+ + & wturn3*fact(2)*gcorr3_turn(j,i)+ + & wturn4*fact(3)*gcorr4_turn(j,i)+ + & wcorr5*fact(4)*gradcorr5(j,i)+ + & wcorr6*fact(5)*gradcorr6(j,i)+ + & wturn6*fact(5)*gcorr6_turn(j,i)+ + & wsccor*fact(2)*gsccorc(j,i) + 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*fact(2)*gsccorx(j,i) + enddo +#else + do i=1,nct + do j=1,3 + gradc(j,i,icg)=wsc*gvdwc(j,i)+wscp*gvdwc_scp(j,i)+ + & welec*fact(1)*gelc(j,i)+wstrain*ghpbc(j,i)+ + & wbond*gradb(j,i)+ + & wcorr*fact(3)*gradcorr(j,i)+ + & wel_loc*fact(2)*gel_loc(j,i)+ + & wturn3*fact(2)*gcorr3_turn(j,i)+ + & wturn4*fact(3)*gcorr4_turn(j,i)+ + & wcorr5*fact(4)*gradcorr5(j,i)+ + & wcorr6*fact(5)*gradcorr6(j,i)+ + & wturn6*fact(5)*gcorr6_turn(j,i)+ + & wsccor*fact(2)*gsccorc(j,i) + 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*fact(1)*gsccorx(j,i) + enddo +#endif + enddo + + + do i=1,nres-3 + gloc(i,icg)=gloc(i,icg)+wcorr*fact(3)*gcorr_loc(i) + & +wcorr5*fact(4)*g_corr5_loc(i) + & +wcorr6*fact(5)*g_corr6_loc(i) + & +wturn4*fact(3)*gel_loc_turn4(i) + & +wturn3*fact(2)*gel_loc_turn3(i) + & +wturn6*fact(5)*gel_loc_turn6(i) + & +wel_loc*fact(2)*gel_loc_loc(i) + & +wsccor*fact(1)*gsccor_loc(i) + enddo + endif + return + end +C------------------------------------------------------------------------ + subroutine enerprint(energia,fact) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + double precision energia(0:max_ene),fact(6) + etot=energia(0) + evdw=energia(1)+fact(6)*energia(21) +#ifdef SCP14 + evdw2=energia(2)+energia(17) +#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) + esccor=energia(19) + edihcnstr=energia(20) + estr=energia(18) +#ifdef SPLITELE + write (iout,10) evdw,wsc,evdw2,wscp,ees,welec*fact(1),evdw1, + & wvdwpp, + & estr,wbond,ebe,wang,escloc,wscloc,etors,wtor*fact(1), + & etors_d,wtor_d*fact(2),ehpb,wstrain, + & ecorr,wcorr*fact(3),ecorr5,wcorr5*fact(4),ecorr6,wcorr6*fact(5), + & eel_loc,wel_loc*fact(2),eello_turn3,wturn3*fact(2), + & eello_turn4,wturn4*fact(3),eello_turn6,wturn6*fact(5), + & esccor,wsccor*fact(1),edihcnstr,ebr*nss,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 elec)'/ + & '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)'/ + & 'ETOT= ',1pE16.6,' (total)') +#else + write (iout,10) evdw,wsc,evdw2,wscp,ees,welec*fact(1),estr,wbond, + & ebe,wang,escloc,wscloc,etors,wtor*fact(1),etors_d,wtor_d*fact2, + & ehpb,wstrain,ecorr,wcorr*fact(3),ecorr5,wcorr5*fact(4), + & ecorr6,wcorr6*fact(5),eel_loc,wel_loc*fact(2), + & eello_turn3,wturn3*fact(2),eello_turn4,wturn4*fact(3), + & eello_turn6,wturn6*fact(5),esccor*fact(1),wsccor, + & edihcnstr,ebr*nss,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)'/ + & 'ETOT= ',1pE16.6,' (total)') +#endif + return + end +C----------------------------------------------------------------------- + subroutine elj(evdw,evdw_t) +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' + include 'DIMENSIONS.ZSCOPT' + include "DIMENSIONS.COMPAR" + 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.ENEPS' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + dimension gg(3) + integer icant + external icant +cd print *,'Entering ELJ nnt=',nnt,' nct=',nct,' expon=',expon + do i=1,210 + do j=1,2 + eneps_temp(j,i)=0.0d0 + enddo + enddo + evdw=0.0D0 + evdw_t=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 + ij=icant(itypi,itypj) + eneps_temp(1,ij)=eneps_temp(1,ij)+e1/dabs(eps0ij) + eneps_temp(2,ij)=eneps_temp(2,ij)+e2/eps0ij +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) + if (bb(itypi,itypj).gt.0.0d0) then + evdw=evdw+evdwij + else + evdw_t=evdw_t+evdwij + endif + if (calc_grad) then +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) + enddo + do k=i,j-1 + do l=1,3 + gvdwc(l,k)=gvdwc(l,k)+gg(l) + enddo + enddo + endif +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 +c write (2,*) "Rtal",Rtail," sig",sig," sigsq",sigsq, +c & " sig0ij",sig0ij +c write (2,*) "rij_shift",rij_shift + 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) +#ifdef SCALREP +! Scale down the repulsive term for 1,4 interactions. + if (iabs(j-i).le.4) c1 = 0.01d0 * c1 +#endif +c! c1 = 0.0d0 + c2 = fac * bb(itypi,itypj) +c! c2 = 0.0d0 +c write (2,*) "eps1",eps1," eps2rt",eps2rt," eps3rt",eps3rt, +c & " c1",c1," c2",c2 + 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,10f16.7)') + & restyp(itype(i)),i,restyp(itype(j)),j, + & 1.0d0/rij,Rtail,Rhead,evdwij,Fcav,Ecl,Egb,Epol,Fisocav,Elj, + & Equad,evdwij+Fcav+eheadtail,evdw +c IF (energy_dec) write (*,'(2(1x,a3,i3),3f6.2,9f16.7)') +c & restyp(itype(i)),i,restyp(itype(j)),j, +c & 1.0d0/rij,Rtail,Rhead,evdwij,Fcav,Ecl,Egb,Epol,Fisocav,Elj, +c & Equad,evdwij+Fcav+eheadtail,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 + if (energy_dec) write (iout,*) "evdw before exiting emomo:",evdw +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 'DIMENSIONS.ZSCOPT' + 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 'DIMENSIONS.ZSCOPT' + 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 'DIMENSIONS.ZSCOPT' + 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 'DIMENSIONS.ZSCOPT' + 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 'DIMENSIONS.ZSCOPT' + 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 'DIMENSIONS.ZSCOPT' + 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 'DIMENSIONS.ZSCOPT' + 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! 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!!! + BetaT = 1.0d0 / (298 * 1.987d-3) +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! write (2,*) "elgrad types",itypi,itypj, +c! & " chi1",chi1," chi2",chi2," chi12",chi12, +c! & " chip1",chip1," chip2",chip2," chip12",chip12 +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 write (2,*) "chi1",chi1," chi2",chi2," chi12",chi12 +c write (2,*) "fsceps1",faceps1," faceps1_inv",faceps1_inv, +c & " eps1",eps1 +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 +c write (2,*) "om1",om1," om2",om2," om1om2",om1om2, +c & " chiom1",chiom1, +c & " chiom2",chiom2," facsig",facsig," sigsq",sigsq + 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 + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.CALC' + 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 + 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 + 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 +C +C Calculate the components of the gradient in DC and X +C + do k=i,j-1 + do l=1,3 + gvdwc(l,k)=gvdwc(l,k)+gg(l) + enddo + enddo + return + end +c------------------------------------------------------------------------------ + subroutine vec_and_deriv + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.VECTORS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + 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. + do i=1,nres-1 +c if (i.eq.nres-1 .or. itel(i+1).eq.0) then + 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 + if (calc_grad) then +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 + endif +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 + if (calc_grad) then +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 + 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 + if (calc_grad) then +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 + endif +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 + if (calc_grad) then +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 + endif + enddo + if (calc_grad) then + 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 + endif + return + end +C----------------------------------------------------------------------------- + subroutine vec_and_deriv_test + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.VECTORS' + dimension uyder(3,3,2),uzder(3,3,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. + do i=1,nres-1 + 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) +c write (iout,*) 'fac',fac, +c & 1.0d0/dsqrt(scalar(uz(1,i),uz(1,i))) + fac=1.0d0/dsqrt(scalar(uz(1,i),uz(1,i))) + 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 + do k=1,3 + uy(k,i)=fac*(dc_norm(k,i-1)-costh*dc_norm(k,i)) + enddo + facy=fac + facy=1.0d0/dsqrt(scalar(dc_norm(1,i),dc_norm(1,i))* + & (scalar(dc_norm(1,i-1),dc_norm(1,i-1))**2- + & scalar(dc_norm(1,i),dc_norm(1,i-1))**2)) + do k=1,3 +c uy(k,i)=facy*(dc_norm(k,i+1)-costh*dc_norm(k,i)) + uy(k,i)= +c & facy*( + & dc_norm(k,i-1)*scalar(dc_norm(1,i),dc_norm(1,i)) + & -scalar(dc_norm(1,i),dc_norm(1,i-1))*dc_norm(k,i) +c & ) + enddo +c write (iout,*) 'facy',facy, +c & 1.0d0/dsqrt(scalar(uy(1,i),uy(1,i))) + facy=1.0d0/dsqrt(scalar(uy(1,i),uy(1,i))) + do k=1,3 + uy(k,i)=facy*uy(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 +c uyder(j,j,1)=uyder(j,j,1)-costh +c uyder(j,j,2)=1.0d0+uyder(j,j,2) + uyder(j,j,1)=uyder(j,j,1) + & -scalar(dc_norm(1,i),dc_norm(1,i-1)) + uyder(j,j,2)=scalar(dc_norm(1,i),dc_norm(1,i)) + & +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) + fac=1.0d0/dsqrt(scalar(uz(1,i),uz(1,i))) + 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 + facy=1.0d0/dsqrt(scalar(dc_norm(1,i),dc_norm(1,i))* + & (scalar(dc_norm(1,i+1),dc_norm(1,i+1))**2- + & scalar(dc_norm(1,i),dc_norm(1,i+1))**2)) + do k=1,3 +c uy(k,i)=facy*(dc_norm(k,i+1)-costh*dc_norm(k,i)) + uy(k,i)= +c & facy*( + & dc_norm(k,i+1)*scalar(dc_norm(1,i),dc_norm(1,i)) + & -scalar(dc_norm(1,i),dc_norm(1,i+1))*dc_norm(k,i) +c & ) + enddo +c write (iout,*) 'facy',facy, +c & 1.0d0/dsqrt(scalar(uy(1,i),uy(1,i))) + facy=1.0d0/dsqrt(scalar(uy(1,i),uy(1,i))) + do k=1,3 + uy(k,i)=facy*uy(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 +c uyder(j,j,1)=uyder(j,j,1)-costh +c uyder(j,j,2)=1.0d0+uyder(j,j,2) + uyder(j,j,1)=uyder(j,j,1) + & -scalar(dc_norm(1,i),dc_norm(1,i+1)) + uyder(j,j,2)=scalar(dc_norm(1,i),dc_norm(1,i)) + & +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 + do j=1,2 + do k=1,3 + do l=1,3 + uygrad(l,k,j,i)=vblinv*uygrad(l,k,j,i) + uzgrad(l,k,j,i)=vblinv*uzgrad(l,k,j,i) + enddo + enddo + enddo + enddo + return + end +C----------------------------------------------------------------------------- + subroutine check_vecgrad + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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' + include 'DIMENSIONS.ZSCOPT' + 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 + do i=3,nres+1 + 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 + if (i.gt. iatel_s+2 .and. i.lt.iatel_e+5) then + iti = itortyp(itype(i-2)) + else + iti=ntortyp+1 + endif + if (i.gt. iatel_s+1 .and. i.lt.iatel_e+4) 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) + if (i .gt. iatel_s+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)) + 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)) + 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)) + 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)) + do k=1,2 + muder(k,i-2)=Ub2der(k,i-2) + enddo + if (i.gt. iatel_s+1 .and. i.lt.iatel_e+4) 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 +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)) +cd write (iout,*) 'i',i,' mu ',(mu(k,i-2),k=1,2), +cd & ' mu1',(b1(k,i-2),k=1,2),' mu2',(Ub2(k,i-2),k=1,2) + enddo +C Matrices dependent on two consecutive virtual-bond dihedrals. +C The order of matrices is from left to right. + 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 +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) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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),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,j1 +c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions + double precision scal_el /0.5d0/ +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 +cd if (wel_loc.gt.0.0d0) then + if (icheckgrad.eq.1) then + call vec_and_deriv_test + else + call vec_and_deriv + endif + call set_matrices + 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 + num_conti_hb=0 + 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 + do i=iatel_s,iatel_e + if (itel(i).eq.0) goto 1215 + 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(i),' ielend',ielend(i) + do j=ielstart(i),ielend(i) + if (itel(j).eq.0) goto 1216 + 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) +C Diagnostics only!!! +c aaa=0.0D0 +c bbb=0.0D0 +c ael6i=0.0D0 +c ael3i=0.0D0 +C End diagnostics + 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 write (iout,*) "i",i,iteli," j",j,itelj," eesij",eesij +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 +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 + if (calc_grad) then +* +* Radial derivatives. First process both termini of the fragment (i,j) +* + ggg(1)=facel*xj + ggg(2)=facel*yj + ggg(3)=facel*zj + do k=1,3 + ghalf=0.5D0*ggg(k) + gelc(k,i)=gelc(k,i)+ghalf + gelc(k,j)=gelc(k,j)+ghalf + enddo +* +* Loop over residues i+1 thru j-1. +* + do k=i+1,j-1 + do l=1,3 + gelc(l,k)=gelc(l,k)+ggg(l) + enddo + enddo + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj + do k=1,3 + ghalf=0.5D0*ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)+ghalf + gvdwpp(k,j)=gvdwpp(k,j)+ghalf + enddo +* +* Loop over residues i+1 thru j-1. +* + do k=i+1,j-1 + do l=1,3 + gvdwpp(l,k)=gvdwpp(l,k)+ggg(l) + enddo + 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 + if (calc_grad) then +* +* Radial derivatives. First process both termini of the fragment (i,j) +* + ggg(1)=fac*xj + ggg(2)=fac*yj + ggg(3)=fac*zj + do k=1,3 + ghalf=0.5D0*ggg(k) + gelc(k,i)=gelc(k,i)+ghalf + gelc(k,j)=gelc(k,j)+ghalf + enddo +* +* Loop over residues i+1 thru j-1. +* + do k=i+1,j-1 + do l=1,3 + gelc(l,k)=gelc(l,k)+ggg(l) + enddo + 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 + do k=1,3 + ghalf=0.5D0*ggg(k) + gelc(k,i)=gelc(k,i)+ghalf + & +(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)+ghalf + & +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + enddo + do k=i+1,j-1 + do l=1,3 + gelc(l,k)=gelc(l,k)+ggg(l) + enddo + 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 +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 +C For diagnostics only +cd a22=1.0d0 +cd a23=1.0d0 +cd a32=1.0d0 +cd a33=1.0d0 + fac=dsqrt(-ael6i)*r3ij +cd write (2,*) 'fac=',fac +C For diagnostics only +cd fac=1.0d0 + 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(k,i),k=1,3), +cd & (uz(k,i),k=1,3),(uy(k,j),k=1,3),(uz(k,j),k=1,3) +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,'(2i3,9f10.5/)') i,j, +cd & fac22,a22,fac23,a23,fac32,a32,fac33,a33,eel_loc_ij + if (calc_grad) then +C Derivatives of the elements of A in virtual-bond vectors + call unormderiv(erij(1),unmat(1,1),rmij,erder(1,1)) +cd do k=1,3 +cd do l=1,3 +cd erder(k,l)=0.0d0 +cd enddo +cd enddo + 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 +cd do k=1,3 +cd do l=1,3 +cd uryg(k,l)=0.0d0 +cd urzg(k,l)=0.0d0 +cd vryg(k,l)=0.0d0 +cd vrzg(k,l)=0.0d0 +cd enddo +cd enddo +C Compute radial contributions to the gradient + facr=-3.0d0*rrmij + a22der=a22*facr + a23der=a23*facr + a32der=a32*facr + a33der=a33*facr +cd a22der=0.0d0 +cd a23der=0.0d0 +cd a32der=0.0d0 +cd a33der=0.0d0 + 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) + ghalf1=0.5d0*agg(k,1) + ghalf2=0.5d0*agg(k,2) + ghalf3=0.5d0*agg(k,3) + 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) +cd aggi(k,1)=ghalf1 +cd aggi(k,2)=ghalf2 +cd aggi(k,3)=ghalf3 +cd aggi(k,4)=ghalf4 +C Derivatives in DC(i+1) +cd aggi1(k,1)=agg(k,1) +cd aggi1(k,2)=agg(k,2) +cd aggi1(k,3)=agg(k,3) +cd aggi1(k,4)=agg(k,4) +C Derivatives in DC(j) +cd aggj(k,1)=ghalf1 +cd aggj(k,2)=ghalf2 +cd aggj(k,3)=ghalf3 +cd aggj(k,4)=ghalf4 +C Derivatives in DC(j+1) +cd aggj1(k,1)=0.0d0 +cd aggj1(k,2)=0.0d0 +cd aggj1(k,3)=0.0d0 +cd aggj1(k,4)=0.0d0 + if (j.eq.nres-1 .and. i.lt.j-2) then + do l=1,4 + aggj1(k,l)=aggj1(k,l)+agg(k,l) +cd aggj1(k,l)=agg(k,l) + enddo + endif + enddo + endif +c goto 11111 +C Check the loc-el terms by numerical integration + 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 +11111 continue + 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 +cd write (iout,*) a22,muij(1),a23,muij(2),a32,muij(3) + eel_loc=eel_loc+eel_loc_ij +C Partial derivatives in virtual-bond dihedral angles gamma + if (calc_grad) then + 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) +cd call checkint3(i,j,mu1,mu2,a22,a23,a32,a33,acipa,eel_loc_ij) +cd write(iout,*) 'agg ',agg +cd write(iout,*) 'aggi ',aggi +cd write(iout,*) 'aggi1',aggi1 +cd write(iout,*) 'aggj ',aggj +cd write(iout,*) 'aggj1',aggj1 + +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) + enddo + do k=i+2,j2 + do l=1,3 + gel_loc(l,k)=gel_loc(l,k)+ggg(l) + enddo + 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 + ENDIF + if (wturn3.gt.0.0d0 .or. wturn4.gt.0.0d0) then +C Contributions from turns + a_temp(1,1)=a22 + a_temp(1,2)=a23 + a_temp(2,1)=a32 + a_temp(2,2)=a33 + call eturn34(i,j,eello_turn3,eello_turn4) + endif +C Change 12/26/95 to calculate four-body contributions to H-bonding energy + if (j.gt.i+1 .and. num_conti.le.maxconts) then +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 + 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 +c if (i.eq.1) then +c a_chuj(1,1,num_conti,i)=-0.61d0 +c a_chuj(1,2,num_conti,i)= 0.4d0 +c a_chuj(2,1,num_conti,i)= 0.65d0 +c a_chuj(2,2,num_conti,i)= 0.50d0 +c else if (i.eq.2) then +c a_chuj(1,1,num_conti,i)= 0.0d0 +c a_chuj(1,2,num_conti,i)= 0.0d0 +c a_chuj(2,1,num_conti,i)= 0.0d0 +c a_chuj(2,2,num_conti,i)= 0.0d0 +c endif +C --- and its gradients +cd write (iout,*) 'i',i,' j',j +cd do kkk=1,3 +cd write (iout,*) 'iii 1 kkk',kkk +cd write (iout,*) agg(kkk,:) +cd enddo +cd do kkk=1,3 +cd write (iout,*) 'iii 2 kkk',kkk +cd write (iout,*) aggi(kkk,:) +cd enddo +cd do kkk=1,3 +cd write (iout,*) 'iii 3 kkk',kkk +cd write (iout,*) aggi1(kkk,:) +cd enddo +cd do kkk=1,3 +cd write (iout,*) 'iii 4 kkk',kkk +cd write (iout,*) aggj(kkk,:) +cd enddo +cd do kkk=1,3 +cd write (iout,*) 'iii 5 kkk',kkk +cd write (iout,*) aggj1(kkk,:) +cd 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) +c do mm=1,5 +c a_chuj_der(k,l,m,mm,num_conti,i)=0.0d0 +c enddo + 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 + ees0pij=dsqrt(4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1) + ees0mij=dsqrt(4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2) +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 + facont_hb(num_conti,i)=fcont + if (calc_grad) then +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 + 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 + ghalfp=0.5D0*gggp(k) + 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 +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 + 1216 continue + enddo ! j + num_cont_hb(i)=num_conti + 1215 continue + enddo ! i +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 + return + end +C----------------------------------------------------------------------------- + subroutine eturn34(i,j,eello_turn3,eello_turn4) +C Third- and fourth-order contributions from turns + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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) + 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) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,j1,j2 + if (j.eq.i+2) then +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)) +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 + if (calc_grad) then +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),pizda(1,1)) + call matmat2(a_temp(1,1),pizda(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),pizda(1,1)) + call matmat2(a_temp(1,1),pizda(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 + 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(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) + a_temp(1,2)=aggi1(l,2) + a_temp(2,1)=aggi1(l,3) + a_temp(2,2)=aggi1(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) + a_temp(1,2)=aggj(l,2) + a_temp(2,1)=aggj(l,3) + a_temp(2,2)=aggj(l,4) + 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 + endif + else if (j.eq.i+3) then +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) + iti1=itortyp(itype(i+1)) + iti2=itortyp(itype(i+2)) + iti3=itortyp(itype(i+3)) + 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) +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) + if (calc_grad) then + 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),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+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)) + gcorr4_turn(l,j1)=gcorr4_turn(l,j1)-(s1+s2+s3) + enddo + endif + endif + 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(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 'DIMENSIONS.ZSCOPT' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + dimension ggg(3) + evdw2=0.0D0 + evdw2_14=0.0d0 +cd print '(a)','Enter ESCP' +c write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e, +c & ' scal14',scal14 + do i=iatscp_s,iatscp_e + iteli=itel(i) +c write (iout,*) "i",i," iteli",iteli," nscp_gr",nscp_gr(i), +c & " iscp",(iscpstart(i,j),iscpend(i,j),j=1,nscp_gr(i)) + if (iteli.eq.0) goto 1225 + 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 +c write (iout,*) i,j,evdwij + evdw2=evdw2+evdwij + if (calc_grad) then +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 + if (j.lt.i) then +cd write (iout,*) 'ji' + do k=1,3 + ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) + enddo + endif + do k=1,3 + gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) + enddo + kstart=min0(i+1,j) + 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) + do k=kstart,kend + do l=1,3 + gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) + enddo + enddo + endif + enddo + enddo ! iint + 1225 continue + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(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. + 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 + 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 'DIMENSIONS.ZSCOPT' + 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) + dsci_inv=dsc_inv(itypi) + itypj=itype(j) + dscj_inv=dsc_inv(itypj) + 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 + gg(k)=ed*erij(k)+eom1*dcosom1(k)+eom2*dcosom2(k) + enddo + do k=1,3 + ghpbx(k,i)=ghpbx(k,i)-gg(k) + & +(eom12*dc_norm(k,nres+j)+eom1*erij(k))*dsci_inv + ghpbx(k,j)=ghpbx(k,j)+gg(k) + & +(eom12*dc_norm(k,nres+i)+eom2*erij(k))*dscj_inv + enddo +C +C Calculate the components of the gradient in DC and X +C + do k=i,j-1 + do l=1,3 + ghpbc(l,k)=ghpbc(l,k)+gg(l) + enddo + 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 'DIMENSIONS.ZSCOPT' + 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 u(3),ud(3) + estr=0.0d0 + do i=nnt+1,nct + 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 + 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=nnt,nct + 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 +c write (iout,*) i,iti,vbld(i+nres),(vbldsc0(j,iti), +c & AKSC(j,iti),abond0(j,iti),u(j),j=1,nbi) + 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 'DIMENSIONS.ZSCOPT' + 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' + 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 + time11=dexp(-2*time) + time12=1.0d0 + etheta=0.0D0 +c write (iout,*) "nres",nres +c write (*,'(a,i2)') 'EBEND ICG=',icg +c write (iout,*) ithet_start,ithet_end + 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) +c if (i.gt.ithet_start .and. +c & (itel(i-1).eq.0 .or. itel(i-2).eq.0)) goto 1215 +c if (i.gt.3 .and. (i.le.4 .or. itel(i-3).ne.0)) then +c phii=phi(i) +c y(1)=dcos(phii) +c y(2)=dsin(phii) +c else +c y(1)=0.0D0 +c y(2)=0.0D0 +c endif +c if (i.lt.nres .and. itel(i).ne.0) then +c phii1=phi(i+1) +c z(1)=dcos(phii1) +c z(2)=dsin(phii1) +c else +c z(1)=0.0D0 +c z(2)=0.0D0 +c endif + if (i.gt.3) then +#ifdef OSF + phii=phi(i) + icrc=0 + call proc_proc(phii,icrc) + if (icrc.eq.1) 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) + icrc=0 + call proc_proc(phii1,icrc) + if (icrc.eq.1) 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 +c write (iout,*) "thet_pred_mean",thet_pred_mean + dthett=thet_pred_mean*ssd + thet_pred_mean=thet_pred_mean*ss+a0thet(it) +c write (iout,*) "thet_pred_mean",thet_pred_mean +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 +c write (iout,'(2i3,3f8.3,f10.5)') i,it,rad2deg*theta(i), +c & rad2deg*phii,rad2deg*phii1,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) + 1215 continue + 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 'DIMENSIONS.ZSCOPT' + 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 +c write (iout,*) "ithetyp",(ithetyp(i),i=1,ntyp1) + 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 +c write (iout,*) "i",i," ityp1",itype(i-2),ityp1, +c & " ityp2",itype(i-1),ityp2," ityp3",itype(i),ityp3 +c call flush(iout) + 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 'DIMENSIONS.ZSCOPT' + 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' + 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) +c write (iout,*) "i",i," x",x(1),x(2),x(3) + + 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 +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 + expfac=dexp(bsc(j,it)-0.5D0*contr(j,iii)+emin) +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 'DIMENSIONS.ZSCOPT' + 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,*) "escloc",escloc + if (.not. calc_grad) goto 1 +#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 +#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 'DIMENSIONS.ZSCOPT' + 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,fact) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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=0.0D0 + do i=iphi_start,iphi_end + 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) + 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) + 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) + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + endif + 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*fact*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------------------------------------------------------------------------------ +#else + subroutine etor(etors,edihcnstr,fact) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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=0.0D0 + do i=iphi_start,iphi_end + if (itel(i-2).eq.0 .or. itel(i-1).eq.0) goto 1215 + 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 + 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 + pom=-pom*pom1*pom1 + gloci=gloci+vl1ij*(vl3ij*cosphi-vl2ij*sinphi)*pom + enddo +C Subtract the constant term + etors=etors-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*fact*gloci +c write (iout,*) 'i=',i,' gloc=',gloc(i-3,icg) + 1215 continue + enddo +! 6/20/98 - dihedral angle constraints + edihcnstr=0.0d0 + do i=1,ndih_constr + itori=idih_constr(i) + phii=phi(itori) + difi=pinorm(phii-phi0(i)) + edihi=0.0d0 + 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 + edihi=0.25d0*ftors*difi**4 + 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 + edihi=0.25d0*ftors*difi**4 + else + difi=0.0d0 + endif +c write (iout,'(2i5,4f10.5,e15.5)') i,itori,phii,phi0(i),difi, +c & drange(i),edihi +! 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,fact2) +C 6/23/01 Compute double torsional energy + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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=iphi_start,iphi_end-1 + if (itel(i-2).eq.0 .or. itel(i-1).eq.0 .or. itel(i).eq.0) + & goto 1215 + 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*fact2*gloci1 + gloc(i-2,icg)=gloc(i-2,icg)+wtor_d*fact2*gloci2 + 1215 continue + 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 'DIMENSIONS.ZSCOPT' + 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",itau_start,itau_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------------------------------------------------------------------------------ +#ifdef MPL + subroutine pack_buffer(dimen1,dimen2,atom,indx,buffer) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer dimen1,dimen2,atom,indx + double precision buffer(dimen1,dimen2) + double precision zapas + common /contacts_hb/ zapas(3,20,maxres,7), + & facont_hb(20,maxres),ees0p(20,maxres),ees0m(20,maxres), + & num_cont_hb(maxres),jcont_hb(20,maxres) + num_kont=num_cont_hb(atom) + do i=1,num_kont + do k=1,7 + do j=1,3 + buffer(i,indx+(k-1)*3+j)=zapas(j,i,atom,k) + enddo ! j + enddo ! k + buffer(i,indx+22)=facont_hb(i,atom) + buffer(i,indx+23)=ees0p(i,atom) + buffer(i,indx+24)=ees0m(i,atom) + buffer(i,indx+25)=dfloat(jcont_hb(i,atom)) + enddo ! i + buffer(1,indx+26)=dfloat(num_kont) + return + end +c------------------------------------------------------------------------------ + subroutine unpack_buffer(dimen1,dimen2,atom,indx,buffer) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer dimen1,dimen2,atom,indx + double precision buffer(dimen1,dimen2) + double precision zapas + common /contacts_hb/ zapas(3,20,maxres,7), + & facont_hb(20,maxres),ees0p(20,maxres),ees0m(20,maxres), + & num_cont_hb(maxres),jcont_hb(20,maxres) + num_kont=buffer(1,indx+26) + num_kont_old=num_cont_hb(atom) + num_cont_hb(atom)=num_kont+num_kont_old + do i=1,num_kont + ii=i+num_kont_old + do k=1,7 + do j=1,3 + zapas(j,ii,atom,k)=buffer(i,indx+(k-1)*3+j) + enddo ! j + enddo ! k + facont_hb(ii,atom)=buffer(i,indx+22) + ees0p(ii,atom)=buffer(i,indx+23) + ees0m(ii,atom)=buffer(i,indx+24) + jcont_hb(ii,atom)=buffer(i,indx+25) + enddo ! i + return + end +c------------------------------------------------------------------------------ +#endif + 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 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' +#ifdef MPL + parameter (max_cont=maxconts) + parameter (max_dim=2*(8*3+2)) + parameter (msglen1=max_cont*max_dim*4) + parameter (msglen2=2*msglen1) + integer source,CorrelType,CorrelID,Error + double precision buffer(max_cont,max_dim) +#endif + double precision gx(3),gx1(3) + logical lprn,ldone + +C Set lprn=.true. for debugging + lprn=.false. +#ifdef MPL + n_corr=0 + n_corr1=0 + if (fgProcs.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values:' + 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 +C Caution! Following code assumes that electrostatic interactions concerning +C a given atom are split among at most two processors! + CorrelType=477 + CorrelID=MyID+1 + ldone=.false. + do i=1,max_cont + do j=1,max_dim + buffer(i,j)=0.0D0 + enddo + enddo + mm=mod(MyRank,2) +cd write (iout,*) 'MyRank',MyRank,' mm',mm + if (mm) 20,20,10 + 10 continue +cd write (iout,*) 'Sending: MyRank',MyRank,' mm',mm,' ldone',ldone + if (MyRank.gt.0) then +C Send correlation contributions to the preceding processor + msglen=msglen1 + nn=num_cont_hb(iatel_s) + call pack_buffer(max_cont,max_dim,iatel_s,0,buffer) +cd write (iout,*) 'The BUFFER array:' +cd do i=1,nn +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,26) +cd enddo + if (ielstart(iatel_s).gt.iatel_s+ispp) then + msglen=msglen2 + call pack_buffer(max_cont,max_dim,iatel_s+1,26,buffer) +C Clear the contacts of the atom passed to the neighboring processor + nn=num_cont_hb(iatel_s+1) +cd do i=1,nn +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j+26),j=1,26) +cd enddo + num_cont_hb(iatel_s)=0 + endif +cd write (iout,*) 'Processor ',MyID,MyRank, +cd & ' is sending correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen +cd write (*,*) 'Processor ',MyID,MyRank, +cd & ' is sending correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType + call mp_bsend(buffer,msglen,MyID-1,CorrelType,CorrelID) +cd write (iout,*) 'Processor ',MyID, +cd & ' has sent correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelID=',CorrelID +cd write (*,*) 'Processor ',MyID, +cd & ' has sent correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelID=',CorrelID + msglen=msglen1 + endif ! (MyRank.gt.0) + if (ldone) goto 30 + ldone=.true. + 20 continue +cd write (iout,*) 'Receiving: MyRank',MyRank,' mm',mm,' ldone',ldone + if (MyRank.lt.fgProcs-1) then +C Receive correlation contributions from the next processor + msglen=msglen1 + if (ielend(iatel_e).lt.nct-1) msglen=msglen2 +cd write (iout,*) 'Processor',MyID, +cd & ' is receiving correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType +cd write (*,*) 'Processor',MyID, +cd & ' is receiving correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType + nbytes=-1 + do while (nbytes.le.0) + call mp_probe(MyID+1,CorrelType,nbytes) + enddo +cd print *,'Processor',MyID,' msglen',msglen,' nbytes',nbytes + call mp_brecv(buffer,msglen,MyID+1,CorrelType,nbytes) +cd write (iout,*) 'Processor',MyID, +cd & ' has received correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' nbytes=',nbytes +cd write (iout,*) 'The received BUFFER array:' +cd do i=1,max_cont +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,52) +cd enddo + if (msglen.eq.msglen1) then + call unpack_buffer(max_cont,max_dim,iatel_e+1,0,buffer) + else if (msglen.eq.msglen2) then + call unpack_buffer(max_cont,max_dim,iatel_e,0,buffer) + call unpack_buffer(max_cont,max_dim,iatel_e+1,26,buffer) + else + write (iout,*) + & 'ERROR!!!! message length changed while processing correlations.' + write (*,*) + & 'ERROR!!!! message length changed while processing correlations.' + call mp_stopall(Error) + endif ! msglen.eq.msglen1 + endif ! MyRank.lt.fgProcs-1 + if (ldone) goto 30 + ldone=.true. + goto 10 + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + 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 + 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=iatel_s,iatel_e+1 + 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) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if (j1.eq.j+1 .or. j1.eq.j-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,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 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 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' +#ifdef MPL + parameter (max_cont=maxconts) + parameter (max_dim=2*(8*3+2)) + parameter (msglen1=max_cont*max_dim*4) + parameter (msglen2=2*msglen1) + integer source,CorrelType,CorrelID,Error + double precision buffer(max_cont,max_dim) +#endif + double precision gx(3),gx1(3) + logical lprn,ldone + +C Set lprn=.true. for debugging + lprn=.false. + eturn6=0.0d0 +#ifdef MPL + n_corr=0 + n_corr1=0 + if (fgProcs.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values:' + 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 +C Caution! Following code assumes that electrostatic interactions concerning +C a given atom are split among at most two processors! + CorrelType=477 + CorrelID=MyID+1 + ldone=.false. + do i=1,max_cont + do j=1,max_dim + buffer(i,j)=0.0D0 + enddo + enddo + mm=mod(MyRank,2) +cd write (iout,*) 'MyRank',MyRank,' mm',mm + if (mm) 20,20,10 + 10 continue +cd write (iout,*) 'Sending: MyRank',MyRank,' mm',mm,' ldone',ldone + if (MyRank.gt.0) then +C Send correlation contributions to the preceding processor + msglen=msglen1 + nn=num_cont_hb(iatel_s) + call pack_buffer(max_cont,max_dim,iatel_s,0,buffer) +cd write (iout,*) 'The BUFFER array:' +cd do i=1,nn +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,26) +cd enddo + if (ielstart(iatel_s).gt.iatel_s+ispp) then + msglen=msglen2 + call pack_buffer(max_cont,max_dim,iatel_s+1,26,buffer) +C Clear the contacts of the atom passed to the neighboring processor + nn=num_cont_hb(iatel_s+1) +cd do i=1,nn +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j+26),j=1,26) +cd enddo + num_cont_hb(iatel_s)=0 + endif +cd write (iout,*) 'Processor ',MyID,MyRank, +cd & ' is sending correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen +cd write (*,*) 'Processor ',MyID,MyRank, +cd & ' is sending correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType + call mp_bsend(buffer,msglen,MyID-1,CorrelType,CorrelID) +cd write (iout,*) 'Processor ',MyID, +cd & ' has sent correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelID=',CorrelID +cd write (*,*) 'Processor ',MyID, +cd & ' has sent correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelID=',CorrelID + msglen=msglen1 + endif ! (MyRank.gt.0) + if (ldone) goto 30 + ldone=.true. + 20 continue +cd write (iout,*) 'Receiving: MyRank',MyRank,' mm',mm,' ldone',ldone + if (MyRank.lt.fgProcs-1) then +C Receive correlation contributions from the next processor + msglen=msglen1 + if (ielend(iatel_e).lt.nct-1) msglen=msglen2 +cd write (iout,*) 'Processor',MyID, +cd & ' is receiving correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType +cd write (*,*) 'Processor',MyID, +cd & ' is receiving correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType + nbytes=-1 + do while (nbytes.le.0) + call mp_probe(MyID+1,CorrelType,nbytes) + enddo +cd print *,'Processor',MyID,' msglen',msglen,' nbytes',nbytes + call mp_brecv(buffer,msglen,MyID+1,CorrelType,nbytes) +cd write (iout,*) 'Processor',MyID, +cd & ' has received correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' nbytes=',nbytes +cd write (iout,*) 'The received BUFFER array:' +cd do i=1,max_cont +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,52) +cd enddo + if (msglen.eq.msglen1) then + call unpack_buffer(max_cont,max_dim,iatel_e+1,0,buffer) + else if (msglen.eq.msglen2) then + call unpack_buffer(max_cont,max_dim,iatel_e,0,buffer) + call unpack_buffer(max_cont,max_dim,iatel_e+1,26,buffer) + else + write (iout,*) + & 'ERROR!!!! message length changed while processing correlations.' + write (*,*) + & 'ERROR!!!! message length changed while processing correlations.' + call mp_stopall(Error) + endif ! msglen.eq.msglen1 + endif ! MyRank.lt.fgProcs-1 + if (ldone) goto 30 + ldone=.true. + goto 10 + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + 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 + 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) + call dipole(i,j,jj) + enddo + enddo + endif +C Calculate the local-electrostatic correlation terms + do i=iatel_s,iatel_e+1 + 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) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) +c write (*,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if (j1.eq.j+1 .or. j1.eq.j-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) +c write (*,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' 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 + call calc_eello(i,j,i+1,j1,jj,kk) + if (wcorr4.gt.0.0d0) + & ecorr=ecorr+eello4(i,j,i+1,j1,jj,kk) + if (wcorr5.gt.0.0d0) + & ecorr5=ecorr5+eello5(i,j,i+1,j1,jj,kk) +c print *,"wcorr5",ecorr5 +cd write(2,*)'wcorr6',wcorr6,' wturn6',wturn6 +cd write(2,*)'ijkl',i,j,i+1,j1 + if (wcorr6.gt.0.0d0 .and. (j.ne.i+4 .or. j1.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,j,i+1,j1,jj,kk) +cd write (iout,*) 'ecorr',ecorr,' ecorr5=',ecorr5, +cd & 'ecorr6=',ecorr6 +cd write (iout,'(4e15.5)') sred_geom, +cd & dabs(eello4(i,j,i+1,j1,jj,kk)), +cd & dabs(eello5(i,j,i+1,j1,jj,kk)), +cd & dabs(eello6(i,j,i+1,j1,jj,kk)) + else if (wturn6.gt.0.0d0 + & .and. (j.eq.i+4 .and. j1.eq.i+3)) then +cd write (iout,*) '******eturn6: i,j,i+1,j1',i,j,i+1,j1 + eturn6=eturn6+eello_turn6(i,jj,kk) +cd write (2,*) 'multibody_eello:eturn6',eturn6 + endif + ENDIF +1111 continue + 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------------------------------------------------------------------------------ + 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,*)'Contacts have occurred for peptide groups',i,j, +c & ' and',k,l +c write (iout,*)'Contacts have occurred for peptide groups', +c & i,j,' fcont:',eij,' eij',' eesij',ees0pij,ees0mij,' and ',k,l +c & ,' fcont ',ekl,' eeskl',ees0pkl,ees0mkl,' ees=',ees +C Calculate the multi-body contribution to energy. + ecorr=ecorr+ekont*ees + if (calc_grad) then +C Calculate multi-body contributions to the gradient. + do ll=1,3 + ghalf=0.5D0*ees*ekl*gacont_hbr(ll,jj,i) + gradcorr(ll,i)=gradcorr(ll,i)+ghalf + & -ekont*(coeffp*ees0pkl*gacontp_hb1(ll,jj,i)+ + & coeffm*ees0mkl*gacontm_hb1(ll,jj,i)) + gradcorr(ll,j)=gradcorr(ll,j)+ghalf + & -ekont*(coeffp*ees0pkl*gacontp_hb2(ll,jj,i)+ + & coeffm*ees0mkl*gacontm_hb2(ll,jj,i)) + ghalf=0.5D0*ees*eij*gacont_hbr(ll,kk,k) + gradcorr(ll,k)=gradcorr(ll,k)+ghalf + & -ekont*(coeffp*ees0pij*gacontp_hb1(ll,kk,k)+ + & coeffm*ees0mij*gacontm_hb1(ll,kk,k)) + gradcorr(ll,l)=gradcorr(ll,l)+ghalf + & -ekont*(coeffp*ees0pij*gacontp_hb2(ll,kk,k)+ + & coeffm*ees0mij*gacontm_hb2(ll,kk,k)) + enddo + do m=i+1,j-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ + & ees*ekl*gacont_hbr(ll,jj,i)- + & ekont*(coeffp*ees0pkl*gacontp_hb3(ll,jj,i)+ + & coeffm*ees0mkl*gacontm_hb3(ll,jj,i)) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ + & ees*eij*gacont_hbr(ll,kk,k)- + & ekont*(coeffp*ees0pij*gacontp_hb3(ll,kk,k)+ + & coeffm*ees0mij*gacontm_hb3(ll,kk,k)) + enddo + enddo + endif + ehbcorr=ekont*ees + return + end +C--------------------------------------------------------------------------- + subroutine dipole(i,j,jj) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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 + if (.not.calc_grad) return + 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 +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 'DIMENSIONS.ZSCOPT' + 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 + 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 'DIMENSIONS.ZSCOPT' + 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) + if (calc_grad) then +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 +cold ghalf=0.5d0*eel4*ekl*gacont_hbr(ll,jj,i) + ggg1(ll)=eel4*g_contij(ll,1) + ggg2(ll)=eel4*g_contij(ll,2) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr(ll,i)=gradcorr(ll,i)+ghalf+ekont*derx(ll,2,1) + gradcorr(ll,i+1)=gradcorr(ll,i+1)+ekont*derx(ll,3,1) + gradcorr(ll,j)=gradcorr(ll,j)+ghalf+ekont*derx(ll,4,1) + gradcorr(ll,j1)=gradcorr(ll,j1)+ekont*derx(ll,5,1) +cold ghalf=0.5d0*eel4*eij*gacont_hbr(ll,kk,k) + ghalf=0.5d0*ggg2(ll) +cd ghalf=0.0d0 + gradcorr(ll,k)=gradcorr(ll,k)+ghalf+ekont*derx(ll,2,2) + gradcorr(ll,k+1)=gradcorr(ll,k+1)+ekont*derx(ll,3,2) + gradcorr(ll,l)=gradcorr(ll,l)+ghalf+ekont*derx(ll,4,2) + gradcorr(ll,l1)=gradcorr(ll,l1)+ekont*derx(ll,5,2) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 +cold gradcorr(ll,m)=gradcorr(ll,m)+eel4*ekl*gacont_hbr(ll,jj,i) + gradcorr(ll,m)=gradcorr(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 +cold gradcorr(ll,m)=gradcorr(ll,m)+eel4*eij*gacont_hbr(ll,kk,k) + gradcorr(ll,m)=gradcorr(ll,m)+ggg2(ll) + enddo + enddo +1112 continue + do m=i+2,j2 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,2) + enddo + enddo +cd do iii=1,nres-3 +cd write (2,*) iii,gcorr_loc(iii) +cd enddo + endif + 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 'DIMENSIONS.ZSCOPT' + 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)) + if (calc_grad) then +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 + endif +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)) + if (calc_grad) then +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 + endif +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)) + if (calc_grad) then +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 + endif +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)) + if (calc_grad) then +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 + endif + 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)) + if (calc_grad) then +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 + endif +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)) + if (calc_grad) then +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 + 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 (calc_grad) then + 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 + do ll=1,3 + ggg1(ll)=eel5*g_contij(ll,1) + ggg2(ll)=eel5*g_contij(ll,2) +cold ghalf=0.5d0*eel5*ekl*gacont_hbr(ll,jj,i) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr5(ll,i)=gradcorr5(ll,i)+ghalf+ekont*derx(ll,2,1) + gradcorr5(ll,i+1)=gradcorr5(ll,i+1)+ekont*derx(ll,3,1) + gradcorr5(ll,j)=gradcorr5(ll,j)+ghalf+ekont*derx(ll,4,1) + gradcorr5(ll,j1)=gradcorr5(ll,j1)+ekont*derx(ll,5,1) +cold ghalf=0.5d0*eel5*eij*gacont_hbr(ll,kk,k) + 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) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*ekl*gacont_hbr(ll,jj,i) + gradcorr5(ll,m)=gradcorr5(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*eij*gacont_hbr(ll,kk,k) + gradcorr5(ll,m)=gradcorr5(ll,m)+ggg2(ll) + enddo + enddo +c1112 continue + do m=i+2,j2 + do ll=1,3 + gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,2) + enddo + enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr5_loc(iii) +cd enddo + endif + 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 'DIMENSIONS.ZSCOPT' + 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 (calc_grad) then + 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 + ggg1(ll)=eel6*g_contij(ll,1) + ggg2(ll)=eel6*g_contij(ll,2) +cold ghalf=0.5d0*eel6*ekl*gacont_hbr(ll,jj,i) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr6(ll,i)=gradcorr6(ll,i)+ghalf+ekont*derx(ll,2,1) + gradcorr6(ll,i+1)=gradcorr6(ll,i+1)+ekont*derx(ll,3,1) + gradcorr6(ll,j)=gradcorr6(ll,j)+ghalf+ekont*derx(ll,4,1) + gradcorr6(ll,j1)=gradcorr6(ll,j1)+ekont*derx(ll,5,1) + 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)+ghalf+ekont*derx(ll,2,2) + gradcorr6(ll,k+1)=gradcorr6(ll,k+1)+ekont*derx(ll,3,2) + gradcorr6(ll,l)=gradcorr6(ll,l)+ghalf+ekont*derx(ll,4,2) + gradcorr6(ll,l1)=gradcorr6(ll,l1)+ekont*derx(ll,5,2) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*ekl*gacont_hbr(ll,jj,i) + gradcorr6(ll,m)=gradcorr6(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*eij*gacont_hbr(ll,kk,k) + gradcorr6(ll,m)=gradcorr6(ll,m)+ggg2(ll) + enddo + enddo +1112 continue + do m=i+2,j2 + do ll=1,3 + gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,2) + enddo + enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + endif + 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 'DIMENSIONS.ZSCOPT' + 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 (.not. calc_grad) return + 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 'DIMENSIONS.ZSCOPT' + 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 + if (.not. calc_grad) return +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 'DIMENSIONS.ZSCOPT' + 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 +#ifdef MOMENT + eello6_graph3=-(s1+s2+s3+s4) +#else + eello6_graph3=-(s2+s3+s4) +#endif +c eello6_graph3=-s4 + if (.not. calc_grad) return +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 'DIMENSIONS.ZSCOPT' + 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 + if (.not. calc_grad) return +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 'DIMENSIONS.ZSCOPT' + 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. + 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 +#else + s1 = 0.0d0 +#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)) +#else + s8=0.0d0 +#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 +#else + s13=0.0d0 +#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) + if (calc_grad) then +C Derivatives in gamma(i+2) +#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)) +#else + s8d=0.0d0 +#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 +#else + s1d=0.0d0 +#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 +#else + s13d=0.0d0 +#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 +#else + s13d = 0.0d0 +#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 +#else + s1d = 0.0d0 +#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)) +#else + s8d = 0.0d0 +#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 +#else + s13d = 0.0d0 +#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 +#else + s1d = 0.0d0 +#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)) +#else + s8d = 0.0d0 +#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 + ggg1(ll)=eel_turn6*g_contij(ll,1) + ggg2(ll)=eel_turn6*g_contij(ll,2) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + 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) + 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) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg2(ll) + enddo + enddo +1112 continue + do m=i+2,j2 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,2) + enddo + enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + endif + eello_turn6=ekont*eel_turn6 +cd write (2,*) 'ekont',ekont +cd write (2,*) 'eel_turn6',ekont*eel_turn6 + return + end +crc------------------------------------------------- + SUBROUTINE MATVEC2(A1,V1,V2) + 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) + 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) + 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) + 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) + 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 +C----------------------------------------------------------------------------- + double precision function scalar(u,v) + implicit none + double precision u(3),v(3) + double precision sc + integer i + sc=0.0d0 + do i=1,3 + sc=sc+u(i)*v(i) + enddo + scalar=sc + return + end + diff --git a/source/wham/src-NEWSC/energy_p_new.F.org b/source/wham/src-NEWSC/energy_p_new.F.org new file mode 100755 index 0000000..8f99a16 --- /dev/null +++ b/source/wham/src-NEWSC/energy_p_new.F.org @@ -0,0 +1,6452 @@ + subroutine etotal(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif + + include 'COMMON.IOUNITS' + double precision energia(0:max_ene),energia1(0:max_ene+1) +#ifdef MPL + include 'COMMON.INFO' + external d_vadd + integer ready +#endif + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' +cd write(iout, '(a,i2)')'Calling etotal ipot=',ipot +cd print *,'nnt=',nnt,' nct=',nct +C +C Compute the side-chain and electrostatic interaction energy +C + goto (101,102,103,104,105) ipot +C Lennard-Jones potential. + 101 call elj(evdw) +cd print '(a)','Exit ELJ' + goto 106 +C Lennard-Jones-Kihara potential (shifted). + 102 call eljk(evdw) + goto 106 +C Berne-Pechukas potential (dilated LJ, angular dependence). + 103 call ebp(evdw) + goto 106 +C Gay-Berne potential (shifted LJ, angular dependence). + 104 call egb(evdw) + goto 106 +C Gay-Berne-Vorobjev potential (shifted LJ, angular dependence). + 105 call egbv(evdw) +C +C Calculate electrostatic (H-bonding) energy of the main chain. +C + 106 call eelec(ees,evdw1,eel_loc,eello_turn3,eello_turn4) +C +C Calculate excluded-volume interaction energy between peptide groups +C and side chains. +C + call escp(evdw2,evdw2_14) +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 + call ebend(ebe) +cd print *,'Bend energy finished.' +C +C Calculate the SC local energy. +C + call esc(escloc) +cd print *,'SCLOC energy finished.' +C +C Calculate the virtual-bond torsional energy. +C +cd print *,'nterm=',nterm + call etor(etors,edihcnstr) +C +C 6/23/01 Calculate double-torsional energy +C + call etor_d(etors_d) +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) then +c print *,"calling multibody_eello" + call multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr,n_corr1) +c write (*,*) 'n_corr=',n_corr,' n_corr1=',n_corr1 +c print *,ecorr,ecorr5,ecorr6,eturn6 + endif + if (wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) then + call multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) + endif +C call multibody(ecorr) +C +C Sum the energies +C +C scale large componenets +#ifdef SCALE + ecorr5_scal=1000.0 + eel_loc_scal=100.0 + eello_turn3_scal=100.0 + eello_turn4_scal=100.0 + eturn6_scal=1000.0 + ecorr6_scal=1000.0 +#else + ecorr5_scal=1.0 + eel_loc_scal=1.0 + eello_turn3_scal=1.0 + eello_turn4_scal=1.0 + eturn6_scal=1.0 + ecorr6_scal=1.0 +#endif + + ecorr5=ecorr5/ecorr5_scal + eel_loc=eel_loc/eel_loc_scal + eello_turn3=eello_turn3/eello_turn3_scal + eello_turn4=eello_turn4/eello_turn4_scal + eturn6=eturn6/eturn6_scal + ecorr6=ecorr6/ecorr6_scal +#ifdef MPL + if (fgprocs.gt.1) then +cd call enerprint(evdw,evdw1,evdw2,ees,ebe,escloc,etors,ehpb, +cd & edihcnstr,ecorr,eel_loc,eello_turn4,etot) + energia(1)=evdw + energia(2)=evdw2 + energia(3)=ees + energia(4)=evdw1 + energia(5)=ecorr + energia(6)=etors + energia(7)=ebe + energia(8)=escloc + energia(9)=ehpb + energia(10)=edihcnstr + energia(11)=eel_loc + energia(12)=ecorr5 + energia(13)=ecorr6 + energia(14)=eello_turn3 + energia(15)=eello_turn4 + energia(16)=eturn6 + energia(17)=etors_d + msglen=80 + do i=1,15 + energia1(i)=energia(i) + enddo +cd write (iout,*) 'BossID=',BossID,' MyGroup=',MyGroup +cd write (*,*) 'BossID=',BossID,' MyGroup=',MyGroup +cd write (*,*) 'Processor',MyID,' calls MP_REDUCE in ENERGY', +cd & ' BossID=',BossID,' MyGroup=',MyGroup + call mp_reduce(energia1(1),energia(1),msglen,BossID,d_vadd, + & fgGroupID) +cd write (iout,*) 'Processor',MyID,' Reduce finished' + evdw=energia(1) + evdw2=energia(2) + ees=energia(3) + evdw1=energia(4) + ecorr=energia(5) + etors=energia(6) + ebe=energia(7) + escloc=energia(8) + ehpb=energia(9) + edihcnstr=energia(10) + eel_loc=energia(11) + ecorr5=energia(12) + ecorr6=energia(13) + eello_turn3=energia(14) + eello_turn4=energia(15) + eturn6=energia(16) + etors_d=energia(17) + endif +c if (MyID.eq.BossID) then +#endif + 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 + energia(0)=etot + energia(1)=evdw + energia(2)=evdw2 + energia(3)=ees+evdw1 + 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(16)=edihcnstr + energia(17)=evdw2_14 +c detecting NaNQ + 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 +#ifdef MPL +c endif +#endif + if (calc_grad) then +C +C Sum up the components of the Cartesian gradient. +C + do i=1,nct + do j=1,3 + gradc(j,i,icg)=wsc*gvdwc(j,i)+wscp*gvdwc_scp(j,i)+ + & welec*gelc(j,i)+wstrain*ghpbc(j,i)+ + & wcorr*gradcorr(j,i)+ + & wel_loc*gel_loc(j,i)/eel_loc_scal+ + & wturn3*gcorr3_turn(j,i)/eello_turn3_scal+ + & wturn4*gcorr4_turn(j,i)/eello_turn4_scal+ + & wcorr5*gradcorr5(j,i)/ecorr5_scal+ + & wcorr6*gradcorr6(j,i)/ecorr6_scal+ + & wturn6*gcorr6_turn(j,i)/eturn6_scal + gradx(j,i,icg)=wsc*gvdwx(j,i)+wscp*gradx_scp(j,i)+ + & wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i) + enddo +cd print '(i3,9(1pe12.4))',i,(gvdwc(k,i),k=1,3),(gelc(k,i),k=1,3), +cd & (gradc(k,i),k=1,3) + enddo + + + do i=1,nres-3 +cd write (iout,*) i,g_corr5_loc(i) + gloc(i,icg)=gloc(i,icg)+wcorr*gcorr_loc(i) + & +wcorr5*g_corr5_loc(i)/ecorr5_scal + & +wcorr6*g_corr6_loc(i)/ecorr6_scal + & +wturn4*gel_loc_turn4(i)/eello_turn4_scal + & +wturn3*gel_loc_turn3(i)/eello_turn3_scal + & +wturn6*gel_loc_turn6(i)/eturn6_scal + & +wel_loc*gel_loc_loc(i)/eel_loc_scal + enddo + endif +cd print*,evdw,wsc,evdw2,wscp,ees+evdw1,welec,ebe,wang, +cd & escloc,wscloc,etors,wtor,ehpb,wstrain,nss,ebr,etot +cd call enerprint(energia(0)) +cd call intout +cd stop + return + end +C------------------------------------------------------------------------ + subroutine enerprint(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + double precision energia(0:max_ene) + etot=energia(0) + evdw=energia(1) + evdw2=energia(2) + ees=energia(3) + 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(16) + write (iout,10) evdw,wsc,evdw2,wscp,ees,welec,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,edihcnstr,ebr*nss,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)'/ + & '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)'/ + & 'EDIHC= ',1pE16.6,' (dihedral angle constraints)'/ + & 'ESS= ',1pE16.6,' (disulfide-bridge intrinsic energy)'/ + & 'ETOT= ',1pE16.6,' (total)') + 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' + include 'DIMENSIONS.ZSCOPT' + 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.ENEPS' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + dimension gg(3) + integer icant + external icant +cd print *,'Entering ELJ nnt=',nnt,' nct=',nct,' expon=',expon + do i=1,210 + do j=1,2 + eneps_temp(j,i)=0.0d0 + enddo + enddo + 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 + ij=icant(itypi,itypj) + eneps_temp(1,ij)=eneps_temp(1,ij)+e1/dabs(eps0ij) + eneps_temp(2,ij)=eneps_temp(2,ij)+e2/eps0ij +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 + if (calc_grad) then +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) + enddo + do k=i,j-1 + do l=1,3 + gvdwc(l,k)=gvdwc(l,k)+gg(l) + enddo + enddo + endif +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' + do k=1,3 + ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) + enddo + endif + do k=1,3 + gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) + enddo + kstart=min0(i+1,j) + 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) + do k=kstart,kend + do l=1,3 + gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) + enddo + enddo + endif + enddo + enddo ! iint + 1225 continue + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(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' + dimension ggg(3) + ehpb=0.0D0 +cd print *,'edis: nhpb=',nhpb,' fbr=',fbr +cd print *,'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 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 distace, 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 + do j=iii,jjj-1 + do k=1,3 + ghpbc(k,j)=ghpbc(k,j)+ggg(k) + enddo + enddo + enddo + ehpb=0.5D0*ehpb + return + end +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 'DIMENSIONS.ZSCOPT' + 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' + 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 + time11=dexp(-2*time) + time12=1.0d0 + etheta=0.0D0 +c write (iout,*) "nres",nres +c write (*,'(a,i2)') 'EBEND ICG=',icg +c write (iout,*) ithet_start,ithet_end + 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.ithet_start .and. + & (itel(i-1).eq.0 .or. itel(i-2).eq.0)) goto 1215 + if (i.gt.3 .and. (i.le.4 .or. itel(i-3).ne.0)) then + phii=phi(i) + y(1)=dcos(phii) + y(2)=dsin(phii) + else + y(1)=0.0D0 + y(2)=0.0D0 + endif + if (i.lt.nres .and. itel(i).ne.0) then + phii1=phi(i+1) + z(1)=dcos(phii1) + 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 +c write (iout,*) "thet_pred_mean",thet_pred_mean + dthett=thet_pred_mean*ssd + thet_pred_mean=thet_pred_mean*ss+a0thet(it) +c write (iout,*) "thet_pred_mean",thet_pred_mean +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 +c write (iout,'(2i3,3f8.3,f10.5)') i,it,rad2deg*theta(i), +c & rad2deg*phii,rad2deg*phii1,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) + 1215 continue + 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 +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 'DIMENSIONS.ZSCOPT' + 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' + 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 +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 + expfac=dexp(bsc(j,it)-0.5D0*contr(j,iii)+emin) +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 +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 'DIMENSIONS.ZSCOPT' + 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=0.0D0 + do i=iphi_start,iphi_end + 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) + 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) + 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) + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + endif + 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------------------------------------------------------------------------------ +#else + subroutine etor(etors,edihcnstr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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=0.0D0 + do i=iphi_start,iphi_end + if (itel(i-2).eq.0 .or. itel(i-1).eq.0) goto 1215 + 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 + 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 + pom=-pom*pom1*pom1 + gloci=gloci+vl1ij*(vl3ij*cosphi-vl2ij*sinphi)*pom + enddo +C Subtract the constant term + etors=etors-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) + 1215 continue + enddo +! 6/20/98 - dihedral angle constraints + edihcnstr=0.0d0 + do i=1,ndih_constr + print *,"i",i + 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) +C 6/23/01 Compute double torsional energy + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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=iphi_start,iphi_end-1 + if (itel(i-2).eq.0 .or. itel(i-1).eq.0 .or. itel(i).eq.0) + & goto 1215 + 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 + 1215 continue + enddo + return + end +#endif +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------------------------------------------------------------------------------ +#ifdef MPL + subroutine pack_buffer(dimen1,dimen2,atom,indx,buffer) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer dimen1,dimen2,atom,indx + double precision buffer(dimen1,dimen2) + double precision zapas + common /contacts_hb/ zapas(3,20,maxres,7), + & facont_hb(20,maxres),ees0p(20,maxres),ees0m(20,maxres), + & num_cont_hb(maxres),jcont_hb(20,maxres) + num_kont=num_cont_hb(atom) + do i=1,num_kont + do k=1,7 + do j=1,3 + buffer(i,indx+(k-1)*3+j)=zapas(j,i,atom,k) + enddo ! j + enddo ! k + buffer(i,indx+22)=facont_hb(i,atom) + buffer(i,indx+23)=ees0p(i,atom) + buffer(i,indx+24)=ees0m(i,atom) + buffer(i,indx+25)=dfloat(jcont_hb(i,atom)) + enddo ! i + buffer(1,indx+26)=dfloat(num_kont) + return + end +c------------------------------------------------------------------------------ + subroutine unpack_buffer(dimen1,dimen2,atom,indx,buffer) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer dimen1,dimen2,atom,indx + double precision buffer(dimen1,dimen2) + double precision zapas + common /contacts_hb/ zapas(3,20,maxres,7), + & facont_hb(20,maxres),ees0p(20,maxres),ees0m(20,maxres), + & num_cont_hb(maxres),jcont_hb(20,maxres) + num_kont=buffer(1,indx+26) + num_kont_old=num_cont_hb(atom) + num_cont_hb(atom)=num_kont+num_kont_old + do i=1,num_kont + ii=i+num_kont_old + do k=1,7 + do j=1,3 + zapas(j,ii,atom,k)=buffer(i,indx+(k-1)*3+j) + enddo ! j + enddo ! k + facont_hb(ii,atom)=buffer(i,indx+22) + ees0p(ii,atom)=buffer(i,indx+23) + ees0m(ii,atom)=buffer(i,indx+24) + jcont_hb(ii,atom)=buffer(i,indx+25) + enddo ! i + return + end +c------------------------------------------------------------------------------ +#endif + 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 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' +#ifdef MPL + parameter (max_cont=maxconts) + parameter (max_dim=2*(8*3+2)) + parameter (msglen1=max_cont*max_dim*4) + parameter (msglen2=2*msglen1) + integer source,CorrelType,CorrelID,Error + double precision buffer(max_cont,max_dim) +#endif + double precision gx(3),gx1(3) + logical lprn,ldone + +C Set lprn=.true. for debugging + lprn=.false. +#ifdef MPL + n_corr=0 + n_corr1=0 + if (fgProcs.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values:' + 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 +C Caution! Following code assumes that electrostatic interactions concerning +C a given atom are split among at most two processors! + CorrelType=477 + CorrelID=MyID+1 + ldone=.false. + do i=1,max_cont + do j=1,max_dim + buffer(i,j)=0.0D0 + enddo + enddo + mm=mod(MyRank,2) +cd write (iout,*) 'MyRank',MyRank,' mm',mm + if (mm) 20,20,10 + 10 continue +cd write (iout,*) 'Sending: MyRank',MyRank,' mm',mm,' ldone',ldone + if (MyRank.gt.0) then +C Send correlation contributions to the preceding processor + msglen=msglen1 + nn=num_cont_hb(iatel_s) + call pack_buffer(max_cont,max_dim,iatel_s,0,buffer) +cd write (iout,*) 'The BUFFER array:' +cd do i=1,nn +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,26) +cd enddo + if (ielstart(iatel_s).gt.iatel_s+ispp) then + msglen=msglen2 + call pack_buffer(max_cont,max_dim,iatel_s+1,26,buffer) +C Clear the contacts of the atom passed to the neighboring processor + nn=num_cont_hb(iatel_s+1) +cd do i=1,nn +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j+26),j=1,26) +cd enddo + num_cont_hb(iatel_s)=0 + endif +cd write (iout,*) 'Processor ',MyID,MyRank, +cd & ' is sending correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen +cd write (*,*) 'Processor ',MyID,MyRank, +cd & ' is sending correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType + call mp_bsend(buffer,msglen,MyID-1,CorrelType,CorrelID) +cd write (iout,*) 'Processor ',MyID, +cd & ' has sent correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelID=',CorrelID +cd write (*,*) 'Processor ',MyID, +cd & ' has sent correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelID=',CorrelID + msglen=msglen1 + endif ! (MyRank.gt.0) + if (ldone) goto 30 + ldone=.true. + 20 continue +cd write (iout,*) 'Receiving: MyRank',MyRank,' mm',mm,' ldone',ldone + if (MyRank.lt.fgProcs-1) then +C Receive correlation contributions from the next processor + msglen=msglen1 + if (ielend(iatel_e).lt.nct-1) msglen=msglen2 +cd write (iout,*) 'Processor',MyID, +cd & ' is receiving correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType +cd write (*,*) 'Processor',MyID, +cd & ' is receiving correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType + nbytes=-1 + do while (nbytes.le.0) + call mp_probe(MyID+1,CorrelType,nbytes) + enddo +cd print *,'Processor',MyID,' msglen',msglen,' nbytes',nbytes + call mp_brecv(buffer,msglen,MyID+1,CorrelType,nbytes) +cd write (iout,*) 'Processor',MyID, +cd & ' has received correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' nbytes=',nbytes +cd write (iout,*) 'The received BUFFER array:' +cd do i=1,max_cont +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,52) +cd enddo + if (msglen.eq.msglen1) then + call unpack_buffer(max_cont,max_dim,iatel_e+1,0,buffer) + else if (msglen.eq.msglen2) then + call unpack_buffer(max_cont,max_dim,iatel_e,0,buffer) + call unpack_buffer(max_cont,max_dim,iatel_e+1,26,buffer) + else + write (iout,*) + & 'ERROR!!!! message length changed while processing correlations.' + write (*,*) + & 'ERROR!!!! message length changed while processing correlations.' + call mp_stopall(Error) + endif ! msglen.eq.msglen1 + endif ! MyRank.lt.fgProcs-1 + if (ldone) goto 30 + ldone=.true. + goto 10 + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + 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 + 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=iatel_s,iatel_e+1 + 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) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if (j1.eq.j+1 .or. j1.eq.j-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,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 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 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' +#ifdef MPL + parameter (max_cont=maxconts) + parameter (max_dim=2*(8*3+2)) + parameter (msglen1=max_cont*max_dim*4) + parameter (msglen2=2*msglen1) + integer source,CorrelType,CorrelID,Error + double precision buffer(max_cont,max_dim) +#endif + double precision gx(3),gx1(3) + logical lprn,ldone + +C Set lprn=.true. for debugging + lprn=.false. + eturn6=0.0d0 +#ifdef MPL + n_corr=0 + n_corr1=0 + if (fgProcs.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values:' + 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 +C Caution! Following code assumes that electrostatic interactions concerning +C a given atom are split among at most two processors! + CorrelType=477 + CorrelID=MyID+1 + ldone=.false. + do i=1,max_cont + do j=1,max_dim + buffer(i,j)=0.0D0 + enddo + enddo + mm=mod(MyRank,2) +cd write (iout,*) 'MyRank',MyRank,' mm',mm + if (mm) 20,20,10 + 10 continue +cd write (iout,*) 'Sending: MyRank',MyRank,' mm',mm,' ldone',ldone + if (MyRank.gt.0) then +C Send correlation contributions to the preceding processor + msglen=msglen1 + nn=num_cont_hb(iatel_s) + call pack_buffer(max_cont,max_dim,iatel_s,0,buffer) +cd write (iout,*) 'The BUFFER array:' +cd do i=1,nn +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,26) +cd enddo + if (ielstart(iatel_s).gt.iatel_s+ispp) then + msglen=msglen2 + call pack_buffer(max_cont,max_dim,iatel_s+1,26,buffer) +C Clear the contacts of the atom passed to the neighboring processor + nn=num_cont_hb(iatel_s+1) +cd do i=1,nn +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j+26),j=1,26) +cd enddo + num_cont_hb(iatel_s)=0 + endif +cd write (iout,*) 'Processor ',MyID,MyRank, +cd & ' is sending correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen +cd write (*,*) 'Processor ',MyID,MyRank, +cd & ' is sending correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType + call mp_bsend(buffer,msglen,MyID-1,CorrelType,CorrelID) +cd write (iout,*) 'Processor ',MyID, +cd & ' has sent correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelID=',CorrelID +cd write (*,*) 'Processor ',MyID, +cd & ' has sent correlation contribution to processor',MyID-1, +cd & ' msglen=',msglen,' CorrelID=',CorrelID + msglen=msglen1 + endif ! (MyRank.gt.0) + if (ldone) goto 30 + ldone=.true. + 20 continue +cd write (iout,*) 'Receiving: MyRank',MyRank,' mm',mm,' ldone',ldone + if (MyRank.lt.fgProcs-1) then +C Receive correlation contributions from the next processor + msglen=msglen1 + if (ielend(iatel_e).lt.nct-1) msglen=msglen2 +cd write (iout,*) 'Processor',MyID, +cd & ' is receiving correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType +cd write (*,*) 'Processor',MyID, +cd & ' is receiving correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' CorrelType=',CorrelType + nbytes=-1 + do while (nbytes.le.0) + call mp_probe(MyID+1,CorrelType,nbytes) + enddo +cd print *,'Processor',MyID,' msglen',msglen,' nbytes',nbytes + call mp_brecv(buffer,msglen,MyID+1,CorrelType,nbytes) +cd write (iout,*) 'Processor',MyID, +cd & ' has received correlation contribution from processor',MyID+1, +cd & ' msglen=',msglen,' nbytes=',nbytes +cd write (iout,*) 'The received BUFFER array:' +cd do i=1,max_cont +cd write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,52) +cd enddo + if (msglen.eq.msglen1) then + call unpack_buffer(max_cont,max_dim,iatel_e+1,0,buffer) + else if (msglen.eq.msglen2) then + call unpack_buffer(max_cont,max_dim,iatel_e,0,buffer) + call unpack_buffer(max_cont,max_dim,iatel_e+1,26,buffer) + else + write (iout,*) + & 'ERROR!!!! message length changed while processing correlations.' + write (*,*) + & 'ERROR!!!! message length changed while processing correlations.' + call mp_stopall(Error) + endif ! msglen.eq.msglen1 + endif ! MyRank.lt.fgProcs-1 + if (ldone) goto 30 + ldone=.true. + goto 10 + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + 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 + 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) + call dipole(i,j,jj) + enddo + enddo + endif +C Calculate the local-electrostatic correlation terms + do i=iatel_s,iatel_e+1 + 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) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) +c write (*,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if (j1.eq.j+1 .or. j1.eq.j-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) +c write (*,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' 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 + call calc_eello(i,j,i+1,j1,jj,kk) + if (wcorr4.gt.0.0d0) + & ecorr=ecorr+eello4(i,j,i+1,j1,jj,kk) + if (wcorr5.gt.0.0d0) + & ecorr5=ecorr5+eello5(i,j,i+1,j1,jj,kk) +c print *,"wcorr5",ecorr5 +cd write(2,*)'wcorr6',wcorr6,' wturn6',wturn6 +cd write(2,*)'ijkl',i,j,i+1,j1 + if (wcorr6.gt.0.0d0 .and. (j.ne.i+4 .or. j1.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,j,i+1,j1,jj,kk) +cd write (iout,*) 'ecorr',ecorr,' ecorr5=',ecorr5, +cd & 'ecorr6=',ecorr6 +cd write (iout,'(4e15.5)') sred_geom, +cd & dabs(eello4(i,j,i+1,j1,jj,kk)), +cd & dabs(eello5(i,j,i+1,j1,jj,kk)), +cd & dabs(eello6(i,j,i+1,j1,jj,kk)) + else if (wturn6.gt.0.0d0 + & .and. (j.eq.i+4 .and. j1.eq.i+3)) then +cd write (iout,*) '******eturn6: i,j,i+1,j1',i,j,i+1,j1 + eturn6=eturn6+eello_turn6(i,jj,kk) +cd write (2,*) 'multibody_eello:eturn6',eturn6 + endif + ENDIF +1111 continue + 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------------------------------------------------------------------------------ + 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,*)'Contacts have occurred for peptide groups',i,j, +c & ' and',k,l +c write (iout,*)'Contacts have occurred for peptide groups', +c & i,j,' fcont:',eij,' eij',' eesij',ees0pij,ees0mij,' and ',k,l +c & ,' fcont ',ekl,' eeskl',ees0pkl,ees0mkl,' ees=',ees +C Calculate the multi-body contribution to energy. + ecorr=ecorr+ekont*ees + if (calc_grad) then +C Calculate multi-body contributions to the gradient. + do ll=1,3 + ghalf=0.5D0*ees*ekl*gacont_hbr(ll,jj,i) + gradcorr(ll,i)=gradcorr(ll,i)+ghalf + & -ekont*(coeffp*ees0pkl*gacontp_hb1(ll,jj,i)+ + & coeffm*ees0mkl*gacontm_hb1(ll,jj,i)) + gradcorr(ll,j)=gradcorr(ll,j)+ghalf + & -ekont*(coeffp*ees0pkl*gacontp_hb2(ll,jj,i)+ + & coeffm*ees0mkl*gacontm_hb2(ll,jj,i)) + ghalf=0.5D0*ees*eij*gacont_hbr(ll,kk,k) + gradcorr(ll,k)=gradcorr(ll,k)+ghalf + & -ekont*(coeffp*ees0pij*gacontp_hb1(ll,kk,k)+ + & coeffm*ees0mij*gacontm_hb1(ll,kk,k)) + gradcorr(ll,l)=gradcorr(ll,l)+ghalf + & -ekont*(coeffp*ees0pij*gacontp_hb2(ll,kk,k)+ + & coeffm*ees0mij*gacontm_hb2(ll,kk,k)) + enddo + do m=i+1,j-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ + & ees*ekl*gacont_hbr(ll,jj,i)- + & ekont*(coeffp*ees0pkl*gacontp_hb3(ll,jj,i)+ + & coeffm*ees0mkl*gacontm_hb3(ll,jj,i)) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ + & ees*eij*gacont_hbr(ll,kk,k)- + & ekont*(coeffp*ees0pij*gacontp_hb3(ll,kk,k)+ + & coeffm*ees0mij*gacontm_hb3(ll,kk,k)) + enddo + enddo + endif + ehbcorr=ekont*ees + return + end +C--------------------------------------------------------------------------- + subroutine dipole(i,j,jj) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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 + if (.not.calc_grad) return + 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 +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 'DIMENSIONS.ZSCOPT' + 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 + 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) + if (calc_grad) then +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 +cold ghalf=0.5d0*eel4*ekl*gacont_hbr(ll,jj,i) + ggg1(ll)=eel4*g_contij(ll,1) + ggg2(ll)=eel4*g_contij(ll,2) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr(ll,i)=gradcorr(ll,i)+ghalf+ekont*derx(ll,2,1) + gradcorr(ll,i+1)=gradcorr(ll,i+1)+ekont*derx(ll,3,1) + gradcorr(ll,j)=gradcorr(ll,j)+ghalf+ekont*derx(ll,4,1) + gradcorr(ll,j1)=gradcorr(ll,j1)+ekont*derx(ll,5,1) +cold ghalf=0.5d0*eel4*eij*gacont_hbr(ll,kk,k) + ghalf=0.5d0*ggg2(ll) +cd ghalf=0.0d0 + gradcorr(ll,k)=gradcorr(ll,k)+ghalf+ekont*derx(ll,2,2) + gradcorr(ll,k+1)=gradcorr(ll,k+1)+ekont*derx(ll,3,2) + gradcorr(ll,l)=gradcorr(ll,l)+ghalf+ekont*derx(ll,4,2) + gradcorr(ll,l1)=gradcorr(ll,l1)+ekont*derx(ll,5,2) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 +cold gradcorr(ll,m)=gradcorr(ll,m)+eel4*ekl*gacont_hbr(ll,jj,i) + gradcorr(ll,m)=gradcorr(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 +cold gradcorr(ll,m)=gradcorr(ll,m)+eel4*eij*gacont_hbr(ll,kk,k) + gradcorr(ll,m)=gradcorr(ll,m)+ggg2(ll) + enddo + enddo +1112 continue + do m=i+2,j2 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,2) + enddo + enddo +cd do iii=1,nres-3 +cd write (2,*) iii,gcorr_loc(iii) +cd enddo + endif + 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)) + if (calc_grad) then +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 + endif +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)) + if (calc_grad) then +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 + endif +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)) + if (calc_grad) then +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 + endif +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)) + if (calc_grad) then +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 + endif + 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)) + if (calc_grad) then +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 + endif +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)) + if (calc_grad) then +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 + 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 (calc_grad) then + 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 + do ll=1,3 + ggg1(ll)=eel5*g_contij(ll,1) + ggg2(ll)=eel5*g_contij(ll,2) +cold ghalf=0.5d0*eel5*ekl*gacont_hbr(ll,jj,i) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr5(ll,i)=gradcorr5(ll,i)+ghalf+ekont*derx(ll,2,1) + gradcorr5(ll,i+1)=gradcorr5(ll,i+1)+ekont*derx(ll,3,1) + gradcorr5(ll,j)=gradcorr5(ll,j)+ghalf+ekont*derx(ll,4,1) + gradcorr5(ll,j1)=gradcorr5(ll,j1)+ekont*derx(ll,5,1) +cold ghalf=0.5d0*eel5*eij*gacont_hbr(ll,kk,k) + 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) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*ekl*gacont_hbr(ll,jj,i) + gradcorr5(ll,m)=gradcorr5(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*eij*gacont_hbr(ll,kk,k) + gradcorr5(ll,m)=gradcorr5(ll,m)+ggg2(ll) + enddo + enddo +c1112 continue + do m=i+2,j2 + do ll=1,3 + gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,2) + enddo + enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr5_loc(iii) +cd enddo + endif + 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 'DIMENSIONS.ZSCOPT' + 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 (calc_grad) then + 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 + ggg1(ll)=eel6*g_contij(ll,1) + ggg2(ll)=eel6*g_contij(ll,2) +cold ghalf=0.5d0*eel6*ekl*gacont_hbr(ll,jj,i) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr6(ll,i)=gradcorr6(ll,i)+ghalf+ekont*derx(ll,2,1) + gradcorr6(ll,i+1)=gradcorr6(ll,i+1)+ekont*derx(ll,3,1) + gradcorr6(ll,j)=gradcorr6(ll,j)+ghalf+ekont*derx(ll,4,1) + gradcorr6(ll,j1)=gradcorr6(ll,j1)+ekont*derx(ll,5,1) + 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)+ghalf+ekont*derx(ll,2,2) + gradcorr6(ll,k+1)=gradcorr6(ll,k+1)+ekont*derx(ll,3,2) + gradcorr6(ll,l)=gradcorr6(ll,l)+ghalf+ekont*derx(ll,4,2) + gradcorr6(ll,l1)=gradcorr6(ll,l1)+ekont*derx(ll,5,2) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*ekl*gacont_hbr(ll,jj,i) + gradcorr6(ll,m)=gradcorr6(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*eij*gacont_hbr(ll,kk,k) + gradcorr6(ll,m)=gradcorr6(ll,m)+ggg2(ll) + enddo + enddo +1112 continue + do m=i+2,j2 + do ll=1,3 + gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,2) + enddo + enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + endif + 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 (.not. calc_grad) return + 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 + if (.not. calc_grad) return +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 +#ifdef MOMENT + eello6_graph3=-(s1+s2+s3+s4) +#else + eello6_graph3=-(s2+s3+s4) +#endif +c eello6_graph3=-s4 + if (.not. calc_grad) return +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 'DIMENSIONS.ZSCOPT' + 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 + if (.not. calc_grad) return +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. + 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) + if (calc_grad) then +C Derivatives in gamma(i+2) +#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 + ggg1(ll)=eel_turn6*g_contij(ll,1) + ggg2(ll)=eel_turn6*g_contij(ll,2) + ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + 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) + 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) + enddo +cd goto 1112 + do m=i+1,j-1 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg1(ll) + enddo + enddo + do m=k+1,l-1 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg2(ll) + enddo + enddo +1112 continue + do m=i+2,j2 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,1) + enddo + enddo + do m=k+2,l2 + do ll=1,3 + gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,2) + enddo + enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + endif + eello_turn6=ekont*eel_turn6 +cd write (2,*) 'ekont',ekont +cd write (2,*) 'eel_turn6',ekont*eel_turn6 + return + end +crc------------------------------------------------- + SUBROUTINE MATVEC2(A1,V1,V2) + 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) + 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) + 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) + 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) + 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 +C----------------------------------------------------------------------------- + double precision function scalar(u,v) + implicit none + double precision u(3),v(3) + double precision sc + integer i + sc=0.0d0 + do i=1,3 + sc=sc+u(i)*v(i) + enddo + scalar=sc + return + end + diff --git a/source/wham/src-NEWSC/fitsq.f b/source/wham/src-NEWSC/fitsq.f new file mode 100755 index 0000000..17d92ee --- /dev/null +++ b/source/wham/src-NEWSC/fitsq.f @@ -0,0 +1,352 @@ + 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 + 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 +crc 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 + 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 + eta = z00100000 + nit = 0 + small=25.0*10.e-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 + 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 + if (np.gt.npq) go to 230 + n0=0 + do 220 n=np,npq + nn=n+np-1 + 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 + 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 + 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 + 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 + 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 + 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)) +* write (1,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/wham/src-NEWSC/geomout.F b/source/wham/src-NEWSC/geomout.F new file mode 100755 index 0000000..d52e23e --- /dev/null +++ b/source/wham/src-NEWSC/geomout.F @@ -0,0 +1,167 @@ + subroutine pdbout(ii,temp,efree,etot,entropy,rmsdev) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + character*50 tytul + dimension ica(maxres) + write(ipdb,'("REMARK CONF",i8," TEMPERATURE",f7.1," RMS",0pf7.2)') + & ii,temp,rmsdev + write (ipdb,'("REMARK DIMENSIONLESS FREE ENERGY",1pe15.5)') + & efree + write (ipdb,'("REMARK ENERGY",1pe15.5," ENTROPY",1pe15.5)') + & etot,entropy + iatom=0 + do i=nnt,nct + ires=i-nnt+1 + iatom=iatom+1 + ica(i)=iatom + iti=itype(i) + write (ipdb,10) iatom,restyp(iti),ires,(c(j,i),j=1,3) + if (iti.ne.10) then + iatom=iatom+1 + write (ipdb,20) iatom,restyp(iti),ires,(c(j,nres+i),j=1,3) + endif + enddo + write (ipdb,'(a)') 'TER' + do i=nnt,nct-1 + if (itype(i).eq.10) then + write (ipdb,30) ica(i),ica(i+1) + else + write (ipdb,30) ica(i),ica(i+1),ica(i)+1 + endif + enddo + if (itype(nct).ne.10) then + write (ipdb,30) ica(nct),ica(nct)+1 + endif + do i=1,nss + write (ipdb,30) ica(ihpb(i))+1,ica(jhpb(i))+1 + enddo + write (ipdb,'(a)') "END" + 10 FORMAT ('ATOM',I7,' CA ',A3,I6,4X,3F8.3) + 20 FORMAT ('ATOM',I7,' CB ',A3,I6,4X,3F8.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 'DIMENSIONS.ZSCOPT' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + character*32 tytul,fd + character*3 liczba + character*6 res_num,pom,ucase +#ifdef AIX + call fdate_(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 (liczba,*) i + pom=ucase(restyp(itype(i))) + res_num = pom(:3)//liczba(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 (liczba,*) i + pom = ucase(restyp(itype(i))) + res_num = pom(:3)//liczba(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 'DIMENSIONS.ZSCOPT' + 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 ',' Dpep',' Theta', + & ' Phi',' Dsc',' Alpha',' Omega' + do i=1,nres + iti=itype(i) + write (iout,'(a3,i4,6f10.3)') restyp(iti),i,vbld(i+1), + & 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 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.SBRIDGE' + 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 diff --git a/source/wham/src-NEWSC/gnmr1.f b/source/wham/src-NEWSC/gnmr1.f new file mode 100755 index 0000000..905e746 --- /dev/null +++ b/source/wham/src-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/wham/src-NEWSC/icant.f b/source/wham/src-NEWSC/icant.f new file mode 100755 index 0000000..8dc1ec1 --- /dev/null +++ b/source/wham/src-NEWSC/icant.f @@ -0,0 +1,9 @@ + INTEGER FUNCTION ICANT(I,J) + IF (I.GE.J) THEN + ICANT=(I*(I-1))/2+J + ELSE + ICANT=(J*(J-1))/2+I + ENDIF + RETURN + END + diff --git a/source/wham/src-NEWSC/include_unres/COMMON.CALC b/source/wham/src-NEWSC/include_unres/COMMON.CALC new file mode 100755 index 0000000..67b4bb9 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/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/wham/src-NEWSC/include_unres/COMMON.CONTACTS b/source/wham/src-NEWSC/include_unres/COMMON.CONTACTS new file mode 100755 index 0000000..d07a0f0 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.CONTACTS @@ -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/wham/src-NEWSC/include_unres/COMMON.CONTPAR b/source/wham/src-NEWSC/include_unres/COMMON.CONTPAR new file mode 100755 index 0000000..97a73eb --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.CONTPAR @@ -0,0 +1,3 @@ + double precision sig_comp,chi_comp,chip_comp,sc_cutoff + common /contpar/ sig_comp(ntyp,ntyp),chi_comp(ntyp,ntyp), + & chip_comp(ntyp,ntyp),sc_cutoff(ntyp,ntyp) diff --git a/source/wham/src-NEWSC/include_unres/COMMON.DERIV b/source/wham/src-NEWSC/include_unres/COMMON.DERIV new file mode 100755 index 0000000..79f8630 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.DERIV @@ -0,0 +1,30 @@ + double precision dcdv,dxdv,dxds,gradx,gradc,gvdwc,gelc,gvdwpp, + & gradx_scp,gvdwc_scp,ghpbx,ghpbc,gloc,gvdwx,gradcorr,gradxorr, + & gradcorr5,gradcorr6,gel_loc,gcorr3_turn,gcorr4_turn,gcorr6_turn, + & gel_loc_loc,gel_loc_turn3,gel_loc_turn4,gel_loc_turn6,gcorr_loc, + & g_corr5_loc,g_corr6_loc,gradb,gradbx,gsccorc,gsccorx,gsccor_loc, + & gscloc,gsclocx + integer nfl,icg + logical calc_grad + 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),gvdwpp(3,maxres), + & gradx_scp(3,maxres), + & gvdwc_scp(3,maxres),ghpbx(3,maxres),ghpbc(3,maxres), + & gloc(maxvar,2),gradcorr(3,maxres),gradxorr(3,maxres), + & gradcorr5(3,maxres),gradcorr6(3,maxres), + & gel_loc(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), + & gscloc(3,maxres),gsclocx(3,maxres),nfl,icg,calc_grad + 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 diff --git a/source/wham/src-NEWSC/include_unres/COMMON.FFIELD b/source/wham/src-NEWSC/include_unres/COMMON.FFIELD new file mode 100755 index 0000000..8292679 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.FFIELD @@ -0,0 +1,29 @@ +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----------------------------------------------------------------------- + double precision wsc,wscp,welec,wstrain,wtor,wtor_d,wang,wscloc, + & wcorr,wcorr4,wcorr5,wcorr6,wsccor,wel_loc,wturn3,wturn4, + & wturn6,wvdwpp,wbond,weights,scal14,cutoff_corr,delt_corr, + & r0_corr + integer ipot,n_ene_comp + common /ffield/ wsc,wscp,welec,wstrain,wtor,wtor_d,wang,wscloc, + & wcorr,wcorr4,wcorr5,wcorr6,wsccor,wel_loc,wturn3,wturn4, + & wturn6,wvdwpp,wbond,weights(max_ene), + & scal14,cutoff_corr,delt_corr,r0_corr,ipot,n_ene_comp + 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/wham/src-NEWSC/include_unres/COMMON.FRAG b/source/wham/src-NEWSC/include_unres/COMMON.FRAG new file mode 100755 index 0000000..ee151f5 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.FRAG @@ -0,0 +1,5 @@ + integer nbfrag,bfrag,nhfrag,hfrag,bvar_frag,hvar_frag,nhpb0, + & nh310frag,h310frag + COMMON /c_frag/ nbfrag,bfrag(4,maxres/3),nhfrag,hfrag(2,maxres/3), + & nh310frag,h310frag(2,maxres/2) + COMMON /frag/ bvar_frag(mxio,6),hvar_frag(mxio,3) diff --git a/source/wham/src-NEWSC/include_unres/COMMON.GEO b/source/wham/src-NEWSC/include_unres/COMMON.GEO new file mode 100755 index 0000000..8cfbbde --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/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/wham/src-NEWSC/include_unres/COMMON.HEADER b/source/wham/src-NEWSC/include_unres/COMMON.HEADER new file mode 100755 index 0000000..7154812 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.HEADER @@ -0,0 +1,2 @@ + character*80 titel + common /header/ titel diff --git a/source/wham/src-NEWSC/include_unres/COMMON.INTERACT b/source/wham/src-NEWSC/include_unres/COMMON.INTERACT new file mode 100755 index 0000000..9adbda4 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.INTERACT @@ -0,0 +1,38 @@ + double precision aa,bb,augm,aad,bad,app,bpp,ael6,ael3, + & chis,alphasur,sigmap1,sigmap2,alphiso,rborn,sigiso1,sigiso2, + & sig0head,epshead,wquad,dhead,dtail,wqdip,alphapol,wstate, + & epsintab,eps_out + + integer nnt,nct,nint_gr,istart,iend,itype,itel,itypro,ielstart, + & ielend,nscp_gr,iscpstart,iscpend,iatsc_s,iatsc_e,iatel_s, + & iatel_e,iatscp_s,iatscp_e,ispp,iscp,nstate,icharge,expon,expon2 + 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),nscp_gr(maxres), + & iscpstart(maxres,maxint_gr),iscpend(maxres,maxint_gr), + & iatsc_s,iatsc_e,iatel_s,iatel_e,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,chip0,alp,sigma0, + & sigii,rr0,r0,r0e,r0d,rpp,epp,elpp6,elpp3,eps_scp,rscp, + & chipp,eps_orig + common /body/eps(ntyp,ntyp),sigma(0:ntyp,0:ntyp), + & sigmaii(ntyp,ntyp), + & rs0(ntyp,ntyp),chi(ntyp,ntyp),chipp(ntyp,ntyp),chip(ntyp), + & chip0(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),eps_orig(ntyp,ntyp),icharge(ntyp) +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) diff --git a/source/wham/src-NEWSC/include_unres/COMMON.LOCAL b/source/wham/src-NEWSC/include_unres/COMMON.LOCAL new file mode 100755 index 0000000..a248d99 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.LOCAL @@ -0,0 +1,36 @@ + double precision a0thet,athet,bthet,polthet,gthet,theta0,sig0, + & sigc0,dsc,dsc_inv,bsc,censc,gaussc,dsc0,vbl,vblinv,vblinv2, + & vbl_cis,vbl0,vbld_inv + integer nlob,loc_start,loc_end,ithet_start,ithet_end, + & iphi_start,iphi_end,itau_start,itau_end +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 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 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 Virtual-bond lenghts + common /peptbond/ vbl,vblinv,vblinv2,vbl_cis,vbl0 + common /indices/ loc_start,loc_end,ithet_start,ithet_end, + & iphi_start,iphi_end,itau_start,itau_end +C Inverses of the actual virtual bond lengths + common /invlen/ vbld_inv(maxres2) diff --git a/source/wham/src-NEWSC/include_unres/COMMON.MINIM b/source/wham/src-NEWSC/include_unres/COMMON.MINIM new file mode 100755 index 0000000..b231b47 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.MINIM @@ -0,0 +1,3 @@ + double precision tolf,rtolf + integer maxfun,maxmin + common /minimm/ tolf,rtolf,maxfun,maxmin diff --git a/source/wham/src-NEWSC/include_unres/COMMON.NAMES b/source/wham/src-NEWSC/include_unres/COMMON.NAMES new file mode 100755 index 0000000..a266339 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/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(max_ene),wname(max_ene),nprint_ene, + & print_order(max_ene) diff --git a/source/wham/src-NEWSC/include_unres/COMMON.SBRIDGE b/source/wham/src-NEWSC/include_unres/COMMON.SBRIDGE new file mode 100755 index 0000000..7bba010 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.SBRIDGE @@ -0,0 +1,10 @@ + double precision ebr,d0cm,akcm,akth,akct,v1ss,v2ss,v3ss,dhpb, + & dhpb1,forcon,weidis + integer ns,nss,nfree,iss,ihpb,jhpb,nhpb,link_start,link_end, + & ibecarb + common /sbridge/ ebr,d0cm,akcm,akth,akct,v1ss,v2ss,v3ss,ns,nss, + & nfree,iss(maxss) + common /links/ dhpb(maxdim),dhpb1(maxdim),forcon(maxdim), + & ihpb(maxdim),jhpb(maxdim),ibecarb(maxdim),nhpb + common /restraints/ weidis + common /links_split/ link_start,link_end diff --git a/source/wham/src-NEWSC/include_unres/COMMON.SCCOR b/source/wham/src-NEWSC/include_unres/COMMON.SCCOR new file mode 100755 index 0000000..28d748a --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.SCCOR @@ -0,0 +1,18 @@ +cc Parameters of the SCCOR term + double precision v1sccor,v2sccor,vlor1sccor, + & vlor2sccor,vlor3sccor,gloc_sc, + & dcostau,dsintau,dtauangle,dcosomicron, + & domicron,v0sccor + integer nterm_sccor,isccortyp,nsccortyp,nlor_sccor + common /sccor/ v1sccor(maxterm_sccor,3,20,20), + & v2sccor(maxterm_sccor,3,20,20), + & v0sccor(ntyp,ntyp), + & vlor1sccor(maxterm_sccor,20,20), + & vlor2sccor(maxterm_sccor,20,20), + & vlor3sccor(maxterm_sccor,20,20),gloc_sc(3,0:maxres2,10), + & 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/wham/src-NEWSC/include_unres/COMMON.SCROT b/source/wham/src-NEWSC/include_unres/COMMON.SCROT new file mode 100755 index 0000000..2da7b8f --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/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/wham/src-NEWSC/include_unres/COMMON.TIME1 b/source/wham/src-NEWSC/include_unres/COMMON.TIME1 new file mode 100755 index 0000000..f7f4849 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.TIME1 @@ -0,0 +1,13 @@ + DOUBLE PRECISION BATIME,TIMLIM,STIME,PREVTIM,SAFETY,RSTIME + INTEGER WhatsUp,ndelta + logical cutoffviol,cutoffeval,llocal + COMMON/TIME1/STIME,TIMLIM,BATIME,PREVTIM,SAFETY,RSTIME + COMMON/STOPTIM/WhatsUp,ndelta,cutoffviol,cutoffeval,llocal + double precision t_func,t_grad,t_fhel,t_fbet,t_ghel,t_gbet,t_viol, + & t_gviol,t_map,t_alamap,t_betamap + integer n_func,n_grad,n_fhel,n_fbet,n_ghel,n_gbet,n_viol,n_gviol, + & n_map,n_alamap,n_betamap + common /timing/ t_func,t_grad,t_fhel,t_fbet,t_ghel,t_gbet,t_viol, + & t_gviol,t_map,t_alamap,t_betamap, + & n_func,n_grad,n_fhel,n_fbet,n_ghel,n_gbet,n_viol,n_gviol, + & n_map,n_alamap,n_betamap diff --git a/source/wham/src-NEWSC/include_unres/COMMON.TORCNSTR b/source/wham/src-NEWSC/include_unres/COMMON.TORCNSTR new file mode 100755 index 0000000..f8fc3a1 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.TORCNSTR @@ -0,0 +1,5 @@ + integer ndih_constr,idih_constr(maxdih_constr) + integer ndih_nconstr,idih_nconstr(maxdih_constr) + double precision phi0(maxdih_constr),drange(maxdih_constr),ftors + common /torcnstr/ phi0,drange,ftors,ndih_constr,idih_constr, + & ndih_nconstr,idih_nconstr diff --git a/source/wham/src-NEWSC/include_unres/COMMON.TORSION b/source/wham/src-NEWSC/include_unres/COMMON.TORSION new file mode 100755 index 0000000..8a12451 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.TORSION @@ -0,0 +1,25 @@ +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,b1tilde + 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 + double precision b + common /fourier1/ b(13,maxtor) diff --git a/source/wham/src-NEWSC/include_unres/COMMON.VAR b/source/wham/src-NEWSC/include_unres/COMMON.VAR new file mode 100755 index 0000000..d560c87 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/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 + 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/wham/src-NEWSC/include_unres/COMMON.VECTORS b/source/wham/src-NEWSC/include_unres/COMMON.VECTORS new file mode 100755 index 0000000..d880c24 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/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/wham/src-NEWSC/include_unres/COMMON.WEIGHTS b/source/wham/src-NEWSC/include_unres/COMMON.WEIGHTS new file mode 100755 index 0000000..d7e6e23 --- /dev/null +++ b/source/wham/src-NEWSC/include_unres/COMMON.WEIGHTS @@ -0,0 +1,22 @@ + double precision ww,ww0,ww_low,ww_up,ww_orig,x_orig, + & epp_low,epp_up,rpp_low,rpp_up,elpp6_low,elpp6_up,elpp3_low, + & elpp3_up,b_low,b_up,epscp_low,epscp_up,rscp_low,rscp_up, + & x_up,x_low,xm,xm1,xm2,epss_low,epss_up,epsp_low,epsp_up + integer imask,mask_elec,mask_fourier,mod_fourier,mask_scp,indz,iw, + & nsingle_sc,npair_sc,ityp_ssc,ityp_psc + logical mod_other_params,mod_elec,mod_scp,mod_side + common /chujec/ ww(max_ene),ww0(max_ene),ww_low(max_ene), + & ww_up(max_ene),ww_orig(max_ene),x_orig(max_paropt), + & epp_low(2,2),epp_up(2,2),rpp_low(2,2),rpp_up(2,2), + & elpp6_low(2,2),elpp6_up(2,2),elpp3_low(2,2),elpp3_up(2,2), + & b_low(13,3),b_up(13,3),x_up(max_paropt),x_low(max_paropt), + & epscp_low(0:20,2),epscp_up(0:20,2),rscp_low(0:20,2), + & rscp_up(0:20,2),epss_low(ntyp),epss_up(ntyp),epsp_low(nntyp), + & epsp_up(nntyp), + & xm(max_paropt,0:maxprot),xm1(max_paropt,0:maxprot), + & xm2(max_paropt,0:maxprot), + & imask(max_ene),nsingle_sc,npair_sc,ityp_ssc(ntyp), + & ityp_psc(2,nntyp),mask_elec(2,2,4), + & mask_fourier(13,3), + & mask_scp(0:20,2,2),mod_other_params,mod_fourier(0:3), + & mod_elec,mod_scp,mod_side,indz(maxbatch+1,maxprot),iw(max_ene) diff --git a/source/wham/src-NEWSC/initialize_p.F b/source/wham/src-NEWSC/initialize_p.F new file mode 100755 index 0000000..7ac8109 --- /dev/null +++ b/source/wham/src-NEWSC/initialize_p.F @@ -0,0 +1,577 @@ + subroutine initialize +C +C Define constants and zero out tables. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' +#ifdef MPI + include 'mpif.h' +#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.MINIM' + include 'COMMON.DERIV' + include "COMMON.WEIGHTS" + include "COMMON.NAMES" + include "COMMON.TIME1" +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 + imol2= 4 + igeom= 8 + intin= 9 + ithep= 11 + irotam=12 + itorp= 13 + itordp= 23 + ielep= 14 + isidep=15 + isidep1=22 + iscpp=25 + icbase=16 + ifourier=20 + istat= 17 + ientin=18 + ientout=19 + ibond=28 + isccor=29 +C +C WHAM files +C + ihist=30 + iweight=31 + izsc=32 +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 + ndih_constr=0 + 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 + do i=1,14 + do j=1,14 + if (print_order(i).eq.j) then + iw(print_order(i))=j + goto 1121 + endif + enddo +1121 continue + enddo + calc_grad=.false. +C Set timers and counters for the respective routines + t_func = 0.0d0 + t_grad = 0.0d0 + t_fhel = 0.0d0 + t_fbet = 0.0d0 + t_ghel = 0.0d0 + t_gbet = 0.0d0 + t_viol = 0.0d0 + t_gviol = 0.0d0 + n_func = 0 + n_grad = 0 + n_fhel = 0 + n_fbet = 0 + n_ghel = 0 + n_gbet = 0 + n_viol = 0 + n_gviol = 0 + n_map = 0 +#ifndef SPLITELE + nprint_ene=nprint_ene-1 +#endif + return + end +c------------------------------------------------------------------------- + block data nazwy + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.NAMES' + include 'COMMON.WEIGHTS' + include 'COMMON.FFIELD' + include 'COMMON.INTERACT' + 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','MM'/ + 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", + & "EVDW2_14","ESTR","ESCCOR","EDIHC","EVDW_T"/ + data wname / + & "WSC","WSCP","WELEC","WCORR","WCORR5","WCORR6","WEL_LOC", + & "WTURN3","WTURN4","WTURN6","WANG","WSCLOC","WTOR","WTORD", + & "WHPB","WVDWPP","WSCP14","WBOND","WSCCOR","WDIHC","WSC"/ + data ww0 /1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0, + & 1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,0.4d0,1.0d0,1.0d0, + & 0.0d0,0.0/ + data nprint_ene /21/ + data print_order /1,2,3,18,11,12,13,14,4,5,6,7,8,9,10,19, + & 16,15,17,20,21/ +c Dielectric constant of water + data eps_out /80.0d0/ + end +c--------------------------------------------------------------------------- + subroutine init_int_table + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' +#ifdef MPI + include 'mpif.h' +#endif +#ifdef MP + include 'COMMON.INFO' +#endif + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.SBRIDGE' + include 'COMMON.IOUNITS' + logical scheck,lprint +#ifdef MPL + 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. + 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 + MyRank=MyID-(MyGroup-1)*fgProcs + call int_bounds(n_sc_int_tot,my_sc_inds,my_sc_inde) + if (lprint) + & write (iout,*) 'Processor',MyID,' MyRank',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 + 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 MPL + 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 MPL + 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 MPL + 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 MPL + 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=int_scint+nct-i +#endif + endif +#ifdef MPL + ind_scint_old=ind_scint +#endif + enddo + 12 continue +#ifndef MPL + iatsc_s=nnt + iatsc_e=nct-1 +#endif +#ifdef MPL + if (lprint) then + write (iout,*) 'Processor',MyID,' Group',MyGroup + write (iout,*) 'iatsc_s=',iatsc_s,' iatsc_e=',iatsc_e + endif +#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=2 +#ifdef MPL +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 (iout,*) 'Processor',MyID,' MyRank',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 +#else + iatel_s=nnt + iatel_e=nct-3 + do i=iatel_s,iatel_e + ielstart(i)=i+2 + ielend(i)=nct-1 + enddo +#endif + if (lprint) then + write (iout,'(a)') '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 MPL + 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',MyID,' MyRank',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 MPL + 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,iphi_start,iphi_end) + iphi_start=iphi_start+nnt+2 + iphi_end=iphi_end+nnt+2 + call int_bounds(nres-3,itau_start,itau_end) + itau_start=itau_start+3 + itau_end=itau_end+3 + if (lprint) then + write (iout,*) 'Processor:',MyID, + & ' loc_start',loc_start,' loc_end',loc_end, + & ' ithet_start',ithet_start,' ithet_end',ithet_end, + & ' iphi_start',iphi_start,' iphi_end',iphi_end + write (*,*) 'Processor:',MyID, + & ' loc_start',loc_start,' loc_end',loc_end, + & ' ithet_start',ithet_start,' ithet_end',ithet_end, + & ' iphi_start',iphi_start,' iphi_end',iphi_end + endif + if (fgprocs.gt.1 .and. MyID.eq.BossID) then + 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',fgprocs, + & ' fine-grain processors.' + endif +#else + loc_start=2 + loc_end=nres-1 + ithet_start=3 + ithet_end=nres + iphi_start=nnt+3 + iphi_end=nct + itau_start=4 + itau_end=nres +#endif + 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 +c------------------------------------------------------------------------------ + subroutine hpb_partition + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.IOUNITS' +#ifdef MPL + include 'COMMON.INFO' + call int_bounds(nhpb,link_start,link_end) +#else + link_start=1 + link_end=nhpb +#endif +cd write (iout,*) 'Processor',MyID,' MyRank',MyRank, +cd & ' nhpb',nhpb,' link_start=',link_start, +cd & ' link_end',link_end + return + end diff --git a/source/wham/src-NEWSC/initialize_p.F.org b/source/wham/src-NEWSC/initialize_p.F.org new file mode 100755 index 0000000..3e7d056 --- /dev/null +++ b/source/wham/src-NEWSC/initialize_p.F.org @@ -0,0 +1,571 @@ + subroutine initialize +C +C Define constants and zero out tables. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' +#ifdef MPI + include 'mpif.h' +#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.MINIM' + include 'COMMON.DERIV' + include "COMMON.WEIGHTS" + include "COMMON.NAMES" + include "COMMON.TIME1" +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 + imol2= 4 + igeom= 8 + intin= 9 + ithep= 11 + irotam=12 + itorp= 13 + itordp= 23 + ielep= 14 + isidep=15 + iscpp=25 + icbase=16 + ifourier=20 + istat= 17 + ientin=18 + ientout=19 +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 +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 + ndih_constr=0 + 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 + do i=1,14 + do j=1,14 + if (print_order(i).eq.j) then + iw(print_order(i))=j + goto 1121 + endif + enddo +1121 continue + enddo + calc_grad=.false. +C Set timers and counters for the respective routines + t_func = 0.0d0 + t_grad = 0.0d0 + t_fhel = 0.0d0 + t_fbet = 0.0d0 + t_ghel = 0.0d0 + t_gbet = 0.0d0 + t_viol = 0.0d0 + t_gviol = 0.0d0 + n_func = 0 + n_grad = 0 + n_fhel = 0 + n_fbet = 0 + n_ghel = 0 + n_gbet = 0 + n_viol = 0 + n_gviol = 0 + n_map = 0 + return + end +c------------------------------------------------------------------------- + block data nazwy + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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 ","EVDW2_14",2*" "/ + data wname / + & "WSC","WSCP","WELEC","WCORR","WCORR5","WCORR6","WEL_LOC", + & "WTURN3","WTURN4","WTURN6","WANG","WSCLOC","WTOR","WTORD", + & "SCAL14",2*" "/ +#ifdef SCP14 + data nprint_ene /15/ + data print_order /1,2,3,11,12,13,14,4,5,6,7,8,9,10,16,0/ +#else + data nprint_ene /14/ + data print_order /1,2,3,11,12,13,14,4,5,6,7,8,9,10,3*0/ +#endif + end +c--------------------------------------------------------------------------- + subroutine init_int_table + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' +#ifdef MPI + include 'mpif.h' +#endif +#ifdef MP + include 'COMMON.INFO' +#endif + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.SBRIDGE' + include 'COMMON.IOUNITS' + logical scheck,lprint +#ifdef MPL + 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. + 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 + MyRank=MyID-(MyGroup-1)*fgProcs + call int_bounds(n_sc_int_tot,my_sc_inds,my_sc_inde) + if (lprint) + & write (iout,*) 'Processor',MyID,' MyRank',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 + 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 MPL + 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 MPL + 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 MPL + 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 MPL + 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=int_scint+nct-i +#endif + endif +#ifdef MPL + ind_scint_old=ind_scint +#endif + enddo + 12 continue +#ifndef MPL + iatsc_s=nnt + iatsc_e=nct-1 +#endif +#ifdef MPL + if (lprint) then + write (iout,*) 'Processor',MyID,' Group',MyGroup + write (iout,*) 'iatsc_s=',iatsc_s,' iatsc_e=',iatsc_e + endif +#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=2 +#ifdef MPL +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 (iout,*) 'Processor',MyID,' MyRank',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 +#else + iatel_s=nnt + iatel_e=nct-3 + do i=iatel_s,iatel_e + ielstart(i)=i+2 + ielend(i)=nct-1 + enddo +#endif + if (lprint) then + write (iout,'(a)') '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 MPL + 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',MyID,' MyRank',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 MPL + 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,iphi_start,iphi_end) + iphi_start=iphi_start+nnt+2 + iphi_end=iphi_end+nnt+2 + if (lprint) then + write (iout,*) 'Processor:',MyID, + & ' loc_start',loc_start,' loc_end',loc_end, + & ' ithet_start',ithet_start,' ithet_end',ithet_end, + & ' iphi_start',iphi_start,' iphi_end',iphi_end + write (*,*) 'Processor:',MyID, + & ' loc_start',loc_start,' loc_end',loc_end, + & ' ithet_start',ithet_start,' ithet_end',ithet_end, + & ' iphi_start',iphi_start,' iphi_end',iphi_end + endif + if (fgprocs.gt.1 .and. MyID.eq.BossID) then + 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',fgprocs, + & ' fine-grain processors.' + endif +#else + loc_start=2 + loc_end=nres-1 + ithet_start=3 + ithet_end=nres + iphi_start=nnt+3 + iphi_end=nct +#endif + 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 +c------------------------------------------------------------------------------ + subroutine hpb_partition + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.IOUNITS' +#ifdef MPL + include 'COMMON.INFO' + call int_bounds(nhpb,link_start,link_end) +#else + link_start=1 + link_end=nhpb +#endif +cd write (iout,*) 'Processor',MyID,' MyRank',MyRank, +cd & ' nhpb',nhpb,' link_start=',link_start, +cd & ' link_end',link_end + return + end diff --git a/source/wham/src-NEWSC/int_from_cart.f b/source/wham/src-NEWSC/int_from_cart.f new file mode 100755 index 0000000..c0cd6e7 --- /dev/null +++ b/source/wham/src-NEWSC/int_from_cart.f @@ -0,0 +1,66 @@ + subroutine int_from_cart1(lprn) + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + integer i,j + double precision dist,alpha,beta,dnorm1,dnorm2,be + logical lprn + if (lprn) write (iout,'(/a)') 'Recalculated internal coordinates' + vbld(nres+1)=0.0d0 + vbld(2*nres)=0.0d0 + vbld_inv(nres+1)=0.0d0 + vbld_inv(2*nres)=0.0d0 + do i=2,nres + 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) phi(i+1)=beta(i-2,i-1,i,i+1) + if (i.gt.2) tauangle(3,i+1)=beta(i+nres-1,i-1,i,i+nres) + if (i.gt.2) tauangle(1,i+1)=beta(i-1+nres,i-1,i,i+1) + if (i.gt.2) tauangle(2,i+1)=beta(i-2,i-1,i,i+nres) + + omeg(i)=beta(nres+i,i,maxres2,i+1) + theta(i+1)=alpha(i-1,i,i+1) + alph(i)=alpha(nres+i,i,maxres2) + 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 + 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=1,nres + 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 + 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)) + return + end diff --git a/source/wham/src-NEWSC/intcor.f b/source/wham/src-NEWSC/intcor.f new file mode 100755 index 0000000..04cbbbc --- /dev/null +++ b/source/wham/src-NEWSC/intcor.f @@ -0,0 +1,94 @@ +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 'DIMENSIONS.ZSCOPT' + 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 'DIMENSIONS.ZSCOPT' + 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 + double precision 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 'DIMENSIONS.ZSCOPT' + 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/wham/src-NEWSC/make_ensemble1.F b/source/wham/src-NEWSC/make_ensemble1.F new file mode 100755 index 0000000..5d7b750 --- /dev/null +++ b/source/wham/src-NEWSC/make_ensemble1.F @@ -0,0 +1,375 @@ + subroutine make_ensembles(islice,*) +! construct the conformational ensembles at REMD temperatures + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" +#ifdef MPI + include "mpif.h" + include "COMMON.MPI" + integer ierror,errcode,status(MPI_STATUS_SIZE) +#endif + include "COMMON.IOUNITS" + include "COMMON.CONTROL" + include "COMMON.FREE" + include "COMMON.ENERGIES" + include "COMMON.FFIELD" + include "COMMON.INTERACT" + include "COMMON.SBRIDGE" + include "COMMON.CHAIN" + include "COMMON.PROTFILES" + include "COMMON.PROT" + real*4 csingle(3,maxres2) + double precision fT(6),fTprim(6),fTbis(6),quot,quotl1,quotl,kfacl, + & eprim,ebis,temper,kfac/2.4d0/,T0/300.0d0/ + double precision etot,evdw,evdw_t,evdw2,ees,evdw1,ebe,etors, + & escloc, + & ehpb,ecorr,ecorr5,ecorr6,eello_turn4,eello_turn3, + & eturn6,eel_loc,edihcnstr,etors_d,estr,evdw2_14,esccor,tt + integer i,ii,ik,iproc,iscor,j,k,l,ib,iparm,iprot,nlist + double precision qfree,sumprob,eini,efree,rmsdev + character*80 bxname + character*2 licz1,licz2 + character*3 licz3,licz4 + character*5 ctemper + integer ilen + external ilen + real*4 Fdimless(MaxStr) + double precision enepot(MaxStr) + integer iperm(MaxStr) + integer islice + +#ifdef MPI + if (me.eq.Master) then +#endif + write (licz2,'(bz,i2.2)') islice + if (nslice.eq.1) then + if (.not.separate_parset) then + bxname = prefix(:ilen(prefix))//".bx" + else + write (licz3,'(bz,i3.3)') myparm + bxname = prefix(:ilen(prefix))//"_par"//licz3//".bx" + endif + else + if (.not.separate_parset) then + bxname = prefix(:ilen(prefix))//"_slice_"//licz2//".bx" + else + write (licz3,'(bz,i3.3)') myparm + bxname = prefix(:ilen(prefix))//"par_"//licz3// + & "_slice_"//licz2//".bx" + endif + endif + open (ientout,file=bxname,status="unknown", + & form="unformatted",access="direct",recl=lenrec1) +#ifdef MPI + endif +#endif + do iparm=1,nParmSet + if (iparm.ne.iparmprint) exit + call restore_parm(iparm) + do ib=1,nT_h(iparm) +#ifdef DEBUG + write (iout,*) "iparm",iparm," ib",ib +#endif + temper=1.0d0/(beta_h(ib,iparm)*1.987D-3) +c quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3) +c quotl=1.0d0 +c kfacl=1.0d0 +c do l=1,5 +c quotl1=quotl +c quotl=quotl*quot +c kfacl=kfacl*kfac +c fT(l)=kfacl/(kfacl-1.0d0+quotl) +c enddo + if (rescale_mode.eq.1) then + quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3) +#if defined(FUNCTH) + tt=1.0d0/(beta_h(ib,iparm)*1.987D-3) + ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0 +#elif defined(FUNCT) + ft(6)=quot +#else + ft(6)=1.0d0 +#endif + quotl=1.0d0 + kfacl=1.0d0 + do l=1,5 + quotl1=quotl + quotl=quotl*quot + kfacl=kfacl*kfac + fT(l)=kfacl/(kfacl-1.0d0+quotl) + enddo + else if (rescale_mode.eq.2) then + quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3) +#if defined(FUNCTH) + tt=1.0d0/(beta_h(ib,iparm)*1.987D-3) + ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/3200.d0 +#elif defined(FUNCT) + ft(6)=quot +#else + ft(6)=1.0d0 +#endif + quotl=1.0d0 + do l=1,5 + quotl=quotl*quot + fT(l)=1.12692801104297249644d0/ + & dlog(dexp(quotl)+dexp(-quotl)) + enddo +c write (iout,*) 1.0d0/(beta_h(ib,iparm)*1.987D-3),ft + else if (rescale_mode.eq.0) then + do l=1,5 + fT(l)=0.0d0 + enddo + else + write (iout,*) + & "Error in MAKE_ENSEMBLE: Wrong RESCALE_MODE:",rescale_mode + call flush(iout) + return1 + endif +#ifdef MPI + do i=1,scount(me1) +#else + do i=1,ntot(islice) +#endif + evdw=enetb(1,i,iparm) + evdw_t=enetb(21,i,iparm) +#ifdef SCP14 + evdw2_14=enetb(17,i,iparm) + evdw2=enetb(2,i,iparm)+evdw2_14 +#else + evdw2=enetb(2,i,iparm) + evdw2_14=0.0d0 +#endif +#ifdef SPLITELE + ees=enetb(3,i,iparm) + evdw1=enetb(16,i,iparm) +#else + ees=enetb(3,i,iparm) + evdw1=0.0d0 +#endif + ecorr=enetb(4,i,iparm) + ecorr5=enetb(5,i,iparm) + ecorr6=enetb(6,i,iparm) + eel_loc=enetb(7,i,iparm) + eello_turn3=enetb(8,i,iparm) + eello_turn4=enetb(9,i,iparm) + eturn6=enetb(10,i,iparm) + ebe=enetb(11,i,iparm) + escloc=enetb(12,i,iparm) + etors=enetb(13,i,iparm) + etors_d=enetb(14,i,iparm) + ehpb=enetb(15,i,iparm) + estr=enetb(18,i,iparm) + esccor=enetb(19,i,iparm) + edihcnstr=enetb(20,i,iparm) +#ifdef SPLITELE + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees + & +wvdwpp*evdw1 + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc + & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr +#else + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2 + & +ft(1)*welec*(ees+evdw1) + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr + & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr +#endif +#ifdef MPI + Fdimless(i)= + & beta_h(ib,iparm)*etot-entfac(i) + potE(i,iparm)=etot +#ifdef DEBUG + write (iout,*) i,indstart(me)+i-1,ib, + & 1.0d0/(1.987d-3*beta_h(ib,iparm)),potE(i,iparm), + & -entfac(i),Fdimless(i) +#endif +#else + Fdimless(i)=beta_h(ib,iparm)*etot-entfac(i) + potE(i,iparm)=etot +#endif + enddo ! i +#ifdef MPI + call MPI_Gatherv(Fdimless(1),scount(me), + & MPI_REAL,Fdimless(1), + & scount(0),idispl(0),MPI_REAL,Master, + & WHAM_COMM, IERROR) +#ifdef DEBUG + call MPI_Gatherv(potE(1,iparm),scount(me), + & MPI_DOUBLE_PRECISION,potE(1,iparm), + & scount(0),idispl(0),MPI_DOUBLE_PRECISION,Master, + & WHAM_COMM, IERROR) + call MPI_Gatherv(entfac(1),scount(me), + & MPI_DOUBLE_PRECISION,entfac(1), + & scount(0),idispl(0),MPI_DOUBLE_PRECISION,Master, + & WHAM_COMM, IERROR) +#endif + if (me.eq.Master) then +#ifdef DEBUG + write (iout,*) "The FDIMLESS array before sorting" + do i=1,ntot(islice) + write (iout,*) i,fdimless(i) + enddo +#endif +#endif + do i=1,ntot(islice) + iperm(i)=i + enddo + call mysort1(ntot(islice),Fdimless,iperm) +#ifdef DEBUG + write (iout,*) "The FDIMLESS array after sorting" + do i=1,ntot(islice) + write (iout,*) i,iperm(i),fdimless(i) + enddo +#endif + qfree=0.0d0 + do i=1,ntot(islice) + qfree=qfree+exp(-fdimless(i)+fdimless(1)) + enddo +c write (iout,*) "qfree",qfree + nlist=1 + sumprob=0.0 + do i=1,min0(ntot(islice),ensembles) + sumprob=sumprob+exp(-fdimless(i)+fdimless(1))/qfree +#ifdef DEBUG + write (iout,*) i,ib,beta_h(ib,iparm), + & 1.0d0/(1.987d-3*beta_h(ib,iparm)),iperm(i), + & potE(iperm(i),iparm), + & -entfac(iperm(i)),fdimless(i),sumprob +#endif + if (sumprob.gt.0.99d0) goto 122 + nlist=nlist+1 + enddo + 122 continue +#ifdef MPI + endif + call MPI_Bcast(nlist, 1, MPI_INTEGER, Master, WHAM_COMM, + & IERROR) + call MPI_Bcast(iperm,nlist,MPI_INTEGER,Master,WHAM_COMM, + & IERROR) + do i=1,nlist + ii=iperm(i) + iproc=0 + do while (ii.lt.indstart(iproc).or.ii.gt.indend(iproc)) + iproc=iproc+1 + enddo + if (iproc.ge.nprocs) then + write (iout,*) "Fatal error: processor out of range",iproc + call flush(iout) + if (bxfile) then + close (ientout) + else + close (ientout,status="delete") + endif + return1 + endif + ik=ii-indstart(iproc)+1 + if (iproc.ne.Master) then + if (me.eq.iproc) then +#ifdef DEBUG + write (iout,*) "i",i," ii",ii," iproc",iproc," ik",ik, + & " energy",potE(ik,iparm) +#endif + call MPI_Send(potE(ik,iparm),1,MPI_DOUBLE_PRECISION, + & Master,i,WHAM_COMM,IERROR) + else if (me.eq.Master) then + call MPI_Recv(enepot(i),1,MPI_DOUBLE_PRECISION,iproc,i, + & WHAM_COMM,STATUS,IERROR) + endif + else if (me.eq.Master) then + enepot(i)=potE(ik,iparm) + endif + enddo +#else + do i=1,nlist + enepot(i)=potE(iperm(i),iparm) + enddo +#endif +#ifdef MPI + if (me.eq.Master) then +#endif + write(licz3,'(bz,i3.3)') iparm + write(licz2,'(bz,i2.2)') islice + if (temper.lt.100.0d0) then + write(ctemper,'(f3.0)') temper + else if (temper.lt.1000.0) then + write (ctemper,'(f4.0)') temper + else + write (ctemper,'(f5.0)') temper + endif + if (nparmset.eq.1) then + if (separate_parset) then + write(licz4,'(bz,i3.3)') myparm + pdbname=prefix(:ilen(prefix))//"_par"//licz4 + else + pdbname=prefix(:ilen(prefix)) + endif + else + pdbname=prefix(:ilen(prefix))//"_parm_"//licz3 + endif + if (nslice.eq.1) then + pdbname=pdbname(:ilen(pdbname))//"_T_"// + & ctemper(:ilen(ctemper))//"pdb" + else + pdbname=pdbname(:ilen(pdbname))//"_slice_"//licz2//"_T_"// + & ctemper(:ilen(ctemper))//"pdb" + endif + open(ipdb,file=pdbname) + do i=1,nlist + read (ientout,rec=iperm(i)) + & ((csingle(l,k),l=1,3),k=1,nres), + & ((csingle(l,k+nres),l=1,3),k=nnt,nct), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & eini,efree,rmsdev,iscor + do j=1,2*nres + do k=1,3 + c(k,j)=csingle(k,j) + enddo + enddo + eini=fdimless(i) + call pdbout(iperm(i),temper,eini,enepot(i),efree,rmsdev) + enddo +#ifdef MPI + endif +#endif + enddo ! ib + enddo ! iparm + if (bxfile) then + close(ientout) + else + close(ientout,status="delete") + endif + return + end +!-------------------------------------------------- + subroutine mysort1(n, x, ipermut) + implicit none + integer i,j,imax,ipm,n + real x(n) + integer ipermut(n) + real xtemp + do i=1,n + xtemp=x(i) + imax=i + do j=i+1,n + if (x(j).lt.xtemp) then + imax=j + xtemp=x(j) + endif + enddo + x(imax)=x(i) + x(i)=xtemp + ipm=ipermut(imax) + ipermut(imax)=ipermut(i) + ipermut(i)=ipm + enddo + return + end diff --git a/source/wham/src-NEWSC/match_contact.f b/source/wham/src-NEWSC/match_contact.f new file mode 100755 index 0000000..3ec2036 --- /dev/null +++ b/source/wham/src-NEWSC/match_contact.f @@ -0,0 +1,339 @@ + subroutine match_contact(ishif1,ishif2,nc_match,nc_match1_max, + & ncont_ref,icont_ref,ncont,icont,jfrag,n_shif1,n_shif2, + & nc_frac,nc_req_set,istr,llocal,lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + integer ncont_ref,icont_ref(2,maxcont),ncont,icont(2,maxcont), + & ishift,ishif2,nc_match + double precision nc_frac + logical llocal,lprn + nc_match_max=0 + do i=1,ncont_ref + nc_match_max=nc_match_max+ + & min0(icont_ref(2,i)-icont_ref(1,i)-1,3) + enddo + if (istr.eq.3) then + nc_req=0 + else if (nc_req_set.eq.0) then + nc_req=nc_match_max*nc_frac + else + nc_req = dmin1(nc_match_max*nc_frac+0.5d0, + & dfloat(nc_req_set)+1.0d-7) + endif +c write (iout,*) "match_contact: nc_req:",nc_req +c write (iout,*) "nc_match_max",nc_match_max +c write (iout,*) "jfrag",jfrag," n_shif1",n_shif1, +c & " n_shif2",n_shif2 +C Match current contact map against reference contact map; exit, if at least +C half of the contacts match + call ncont_match(nc_match,nc_match1,0,0,ncont_ref,icont_ref, + & ncont,icont,jfrag,llocal,lprn) + nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",0,0," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_req.gt.0 .and. nc_match.ge.nc_req .or. + & nc_req.eq.0 .and. nc_match.eq.1) then + ishif1=0 + ishif2=0 + return + endif +C If sufficient matches are not found, try to shift contact maps up to three +C positions. + if (n_shif1.gt.0) then + do is=1,n_shif1 +C The following four tries help to find shifted beta-sheet patterns +C Shift "left" strand backward + call ncont_match(nc_match,nc_match1,-is,0,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",-is,0," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_req.gt.0 .and. nc_match.ge.nc_req .or. + & nc_req.eq.0 .and. nc_match.eq.1) then + ishif1=-is + ishif2=0 + return + endif +C Shift "left" strand forward + call ncont_match(nc_match,nc_match1,is,0,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",is,0," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_req.gt.0 .and. nc_match.ge.nc_req .or. + & nc_req.eq.0 .and. nc_match.eq.1) then + ishif1=is + ishif2=0 + return + endif + enddo + if (nc_req.eq.0) return +C Shift "right" strand backward + do is=1,n_shif1 + call ncont_match(nc_match,nc_match1,0,-is,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",0,-is," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_match.ge.nc_req) then + ishif1=0 + ishif2=-is + return + endif +C Shift "right" strand upward + call ncont_match(nc_match,nc_match1,0,is,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",0,is," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_match.ge.nc_req) then + ishif1=0 + ishif2=is + return + endif + enddo ! is +C Now try to shift both residues in contacts. + do is=1,n_shif1 + do js=1,is + if (js.ne.is) then + call ncont_match(nc_match,nc_match1,-is,-js,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",-is,-js," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_match.ge.nc_req) then + ishif1=-is + ishif2=-js + return + endif + call ncont_match(nc_match,nc_match1,is,js,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",is,js," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_match.ge.nc_req) then + ishif1=is + ishif2=js + return + endif +c + call ncont_match(nc_match,nc_match1,-js,-is,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",-js,-is," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_match.ge.nc_req) then + ishif1=-js + ishif2=-is + return + endif +c + call ncont_match(nc_match,nc_match1,js,is,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",js,is," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_match.ge.nc_req) then + ishif1=js + ishif2=is + return + endif + endif +c + if (is+js.le.n_shif1) then + call ncont_match(nc_match,nc_match1,-is,js,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",-is,js," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_match.ge.nc_req) then + ishif1=-is + ishif2=js + return + endif +c + call ncont_match(nc_match,nc_match1,js,-is,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",js,-is," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_match.ge.nc_req) then + ishif1=js + ishif2=-is + return + endif + endif +c + enddo !js + enddo !is + endif + + if (n_shif2.gt.0) then + do is=1,n_shif2 + call ncont_match(nc_match,nc_match1,-is,-is,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",-is,-is," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_match.ge.nc_req) then + ishif1=-is + ishif2=-is + return + endif + call ncont_match(nc_match,nc_match1,is,is,ncont_ref, + & icont_ref,ncont,icont,jfrag,llocal,lprn) + if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1 + if (lprn .and. nc_match.gt.0) write (iout,*) + & "Shift:",is,is," nc_match1",nc_match1, + & " nc_match=",nc_match," req'd",nc_req + if (nc_match.ge.nc_req) then + ishif1=is + ishif2=is + return + endif + enddo + endif +C If this point is reached, the contact maps are different. + nc_match=0 + ishif1=0 + ishif2=0 + return + end +c------------------------------------------------------------------------- + subroutine ncont_match(nc_match,nc_match1,ishif1,ishif2, + & ncont_ref,icont_ref,ncont,icont,jfrag,llocal,lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.INTERACT' + include 'COMMON.GEO' + include 'COMMON.COMPAR' + logical llocal,lprn + integer ncont_ref,icont_ref(2,maxcont),ncont,icont(2,maxcont), + & icont_match(2,maxcont),ishift,ishif2,nang_pair, + & iang_pair(2,maxres) +C Compare the contact map against the reference contact map; they're stored +C in ICONT and ICONT_REF, respectively. The current contact map can be shifted. + if (lprn) write (iout,'(80(1h*))') + nc_match=0 + nc_match1=0 +c Check the local structure by comparing dihedral angles. +c write (iout,*) "ncont_match: ncont_ref",ncont_ref," llocal",llocal + if (llocal .and. ncont_ref.eq.0) then +c If there are no contacts just compare the dihedral angles and exit. + call angnorm(jfrag,ishif1,ishif2,ang_cut1(jfrag),diffang,fract, + & lprn) + if (lprn) write (iout,*) "diffang:",diffang*rad2deg, + & " ang_cut:",ang_cut(jfrag)*rad2deg," fract",fract + if (diffang.le.ang_cut(jfrag) .and. fract.ge.frac_min(jfrag)) + & then + nc_match=1 + else + nc_match=0 + endif + return + endif + nang_pair=0 + do i=1,ncont + ic1=icont(1,i)+ishif1 + ic2=icont(2,i)+ishif2 +c write (iout,*) "i",i," ic1",ic1," ic2",ic2 + if (ic1.lt.nnt .or. ic2.gt.nct) goto 10 + do j=1,ncont_ref + if (ic1.eq.icont_ref(1,j).and.ic2.eq.icont_ref(2,j)) then + nc_match=nc_match+min0(icont_ref(2,j)-icont_ref(1,j)-1,3) + nc_match1=nc_match1+1 + icont_match(1,nc_match1)=ic1 + icont_match(2,nc_match1)=ic2 +c call add_angpair(icont(1,i),icont_ref(1,j), +c & nang_pair,iang_pair) +c call add_angpair(icont(2,i),icont_ref(2,j), +c & nang_pair,iang_pair) + if (lprn) write (iout,*) "Contacts:",icont(1,i),icont(2,i), + & " match",icont_ref(1,j),icont_ref(2,j), + & " shifts",ishif1,ishif2 + goto 10 + endif + enddo + 10 continue + enddo + if (lprn) then + write (iout,*) "nc_match",nc_match," nc_match1",nc_match1 + write (iout,*) "icont_match" + do i=1,nc_match1 + write (iout,*) icont_match(1,i),icont_match(2,i) + enddo + endif + if (llocal .and. nc_match.gt.0) then + call angnorm2(jfrag,ishif1,ishif2,nc_match1,icont_match,lprn, + & ang_cut1(jfrag),diffang,fract) + if (lprn) write (iout,*) "diffang:",diffang*rad2deg, + & " ang_cut:",ang_cut(jfrag)*rad2deg, + & " ang_cut1",ang_cut1(jfrag)*rad2deg + if (diffang.gt.ang_cut(jfrag) + & .or. fract.lt.frac_min(jfrag)) nc_match=0 + endif +c if (nc_match.gt.0) then +c diffang = angnorm1(nang_pair,iang_pair,lprn) +c if (diffang.gt.ang_cut(jfrag)) nc_match=0 +c endif + if (lprn) write (iout,*) "ishif1",ishif1," ishif2",ishif2, + & " diffang",rad2deg*diffang," nc_match",nc_match + return + end +c------------------------------------------------------------------------------ + subroutine match_secondary(jfrag,isecstr,nsec_match,lprn) +c This subroutine compares the secondary structure (isecstr) of fragment jfrag +c conformation considered to that of the reference conformation. +c Returns the number of equivalent residues (nsec_match). + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.PEPTCONT' + include 'COMMON.COMPAR' + logical lprn + integer isecstr(maxres) + npart = npiece(jfrag,1) + nsec_match=0 + if (lprn) then + write (iout,*) "match_secondary jfrag",jfrag," ifrag", + & (ifrag(1,i,jfrag),ifrag(2,i,jfrag),i=1,npart) + write (iout,'(80i1)') (isec_ref(j),j=1,nres) + write (iout,'(80i1)') (isecstr(j),j=1,nres) + endif + do i=1,npart + do j=ifrag(1,i,jfrag),ifrag(2,i,jfrag) +c The residue has equivalent conformational state to that of the reference +c structure, if: +c a) the conformational states are equal or +c b) the reference state is a coil and that of the conformation considered +c is a strand or +c c) the conformational state of the conformation considered is a strand +c and that of the reference conformation is a coil. +c 10/28/02 - case (b) deleted. + if (isecstr(j).eq.isec_ref(j) .or. +c & isecstr(j).eq.0 .and. isec_ref(j).eq.1 .or. + & isec_ref(j).eq.0 .and. isecstr(j).eq.1) + & nsec_match=nsec_match+1 + enddo + enddo + return + end diff --git a/source/wham/src-NEWSC/matmult.f b/source/wham/src-NEWSC/matmult.f new file mode 100755 index 0000000..e9257cf --- /dev/null +++ b/source/wham/src-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/wham/src-NEWSC/misc.f b/source/wham/src-NEWSC/misc.f new file mode 100755 index 0000000..e189839 --- /dev/null +++ b/source/wham/src-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/wham/src-NEWSC/molread_zs.F b/source/wham/src-NEWSC/molread_zs.F new file mode 100755 index 0000000..431680d --- /dev/null +++ b/source/wham/src-NEWSC/molread_zs.F @@ -0,0 +1,378 @@ + subroutine molread(*) +C +C Read molecular data. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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.TORCNSTR' + include 'COMMON.CONTROL' + character*4 sequence(maxres) + integer rescode + double precision x(maxvar) + character*320 controlcard,ucase + dimension itype_pdb(maxres) + logical seq_comp + call card_concat(controlcard,.true.) + call reada(controlcard,'SCAL14',scal14,0.4d0) + call reada(controlcard,'SCALSCP',scalscp,1.0d0) + call reada(controlcard,'CUTOFF',cutoff_corr,7.0d0) + call reada(controlcard,'DELT_CORR',delt_corr,0.5d0) + r0_corr=cutoff_corr-delt_corr + call readi(controlcard,"NRES",nres,0) + iscode=index(controlcard,"ONE_LETTER") + if (nres.le.0) then + write (iout,*) "Error: no residues in molecule" + return1 + endif + if (nres.gt.maxres) then + write (iout,*) "Error: too many residues",nres,maxres + endif + write(iout,*) 'nres=',nres +C Read sequence of the protein + 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 + write (iout,*) "Numeric code:" + write (iout,'(20i4)') (itype(i),i=1,nres) + do i=1,nres-1 +#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 + call read_bridge + + if (with_dihed_constr) then + + read (inp,*) ndih_constr + if (ndih_constr.gt.0) then + read (inp,*) ftors + write (iout,*) 'FTORS',ftors + read (inp,*) (idih_constr(i),phi0(i),drange(i),i=1,ndih_constr) + 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 + do i=1,ndih_constr + phi0(i)=deg2rad*phi0(i) + drange(i)=deg2rad*drange(i) + enddo + endif + + endif + + nnt=1 + nct=nres + if (itype(1).eq.21) nnt=2 + if (itype(nres).eq.21) nct=nct-1 + write(iout,*) 'NNT=',NNT,' NCT=',NCT +c Read distance restraints + if (constr_dist.gt.0) then + if (refstr) call read_ref_structure(*11) + call read_dist_constr + call hpb_partition + endif + + call setup_var + call init_int_table + if (ns.gt.0) 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) + write (iout,'(2a,i3,3a,i3,a,3f10.3)') + & restyp(it1),'(',i1,') -- ',restyp(it2),'(',i2,')', + & dhpb(i),ebr,forcon(i) + enddo + endif + write (iout,'(a)') + return + 11 stop "Error reading reference structure" + 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' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' +C Read bridging residues. + read (inp,*) ns,(iss(i),i=1,ns) + print *,'ns=',ns + 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 + 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?!!!' + stop + 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.' + stop + 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_angles(kanal,iscor,energ,iprot,*) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + character*80 lineh + read(kanal,'(a80)',end=10,err=10) lineh + read(lineh(:5),*,err=8) ic + read(lineh(6:),*,err=8) energ + goto 9 + 8 ic=1 + print *,'error, assuming e=1d10',lineh + energ=1d10 + nss=0 + 9 continue + read(lineh(18:),*,end=10,err=10) nss + IF (NSS.LT.9) THEN + read (lineh(20:),*,end=10,err=10) + & (IHPB(I),JHPB(I),I=1,NSS),iscor + ELSE + read (lineh(20:),*,end=10,err=10) (IHPB(I),JHPB(I),I=1,8) + read (kanal,*,end=10,err=10) (IHPB(I),JHPB(I), + & I=9,NSS),iscor + ENDIF +c print *,"energy",energ," iscor",iscor + 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 + 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 read_dist_constr + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + 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,.true.) + 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) + write (iout,*) "NFRAG",nfrag_," NPAIR",npair_," NDIST",ndist_ + write (iout,*) "IFRAG" + do i=1,nfrag_ + write (iout,*) i,ifrag_(1,i),ifrag_(2,i),wfrag_(i) + enddo + write (iout,*) "IPAIR" + do i=1,npair_ + write (iout,*) i,ipair_(1,i),ipair_(2,i),wpair_(i) + enddo + call flush(iout) + 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 + write (iout,'(a,3i5,f8.2,1pe12.2)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) + 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) + write (iout,'(a,3i5,f8.2,f10.1)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) + 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 + 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) + return + end diff --git a/source/wham/src-NEWSC/mygetenv.F b/source/wham/src-NEWSC/mygetenv.F new file mode 100755 index 0000000..b5ea4a2 --- /dev/null +++ b/source/wham/src-NEWSC/mygetenv.F @@ -0,0 +1,55 @@ + subroutine mygetenv(string,var) +C +C Version 1.0 +C +C This subroutine passes the environmental variables to FORTRAN program. +C If the flags -DMYGETENV and -DMPI are not for compilation, it calls the +C standard FORTRAN GETENV subroutine. If both flags are set, the subroutine +C reads the environmental variables from $HOME/.env +C +C Usage: As for the standard FORTRAN GETENV subroutine. +C +C Purpose: some versions/installations of MPI do not transfer the environmental +C variables to slave processors, if these variables are set in the shell script +C from which mpirun is called. +C +C A.Liwo, 7/29/01 +C + implicit none + character*(*) string,var +#if defined(MYGETENV) && defined(MPI) + include "DIMENSIONS.ZSCOPT" + include "mpif.h" + include "COMMON.MPI" + character*360 ucase + external ucase + character*360 string1(360),karta + character*240 home + integer i,n,ilen + external ilen + call getenv("HOME",home) + open(99,file=home(:ilen(home))//"/.env",status="OLD",err=112) + do while (.true.) + read (99,end=111,err=111,'(a)') karta + do i=1,80 + string1(i)=" " + enddo + call split_string(karta,string1,80,n) + if (ucase(string1(1)(:ilen(string1(1)))).eq."SETENV" .and. + & string1(2)(:ilen(string1(2))).eq.string(:ilen(string)) ) then + var=string1(3) + print *,"Processor",me,": ",var(:ilen(var)), + & " assigned to ",string(:ilen(string)) + close(99) + return + endif + enddo + 111 print *,"Environment variable ",string(:ilen(string))," not set." + close(99) + return + 112 print *,"Error opening environment file!" +#else + call getenv(string,var) +#endif + return + end diff --git a/source/wham/src-NEWSC/mysort.f b/source/wham/src-NEWSC/mysort.f new file mode 100755 index 0000000..cb1bbe7 --- /dev/null +++ b/source/wham/src-NEWSC/mysort.f @@ -0,0 +1,52 @@ + subroutine imysort(n, m, mm, x, y, z, z1, z2, z3, z4, z5, z6) + implicit none + integer n,m,mm + integer x(m,mm,n),y(n),z(n),z1(2,n),z6(n),xmin,xtemp + double precision z2(n),z3(n),z4(n),z5(n) + double precision xxtemp + integer i,j,k,imax + do i=1,n + xmin=x(1,1,i) + imax=i + do j=i+1,n + if (x(1,1,j).lt.xmin) then + imax=j + xmin=x(1,1,j) + endif + enddo + xxtemp=z2(imax) + z2(imax)=z2(i) + z2(i)=xxtemp + xxtemp=z3(imax) + z3(imax)=z3(i) + z3(i)=xxtemp + xxtemp=z4(imax) + z4(imax)=z4(i) + z4(i)=xxtemp + xxtemp=z5(imax) + z5(imax)=z5(i) + z5(i)=xxtemp + xtemp=y(imax) + y(imax)=y(i) + y(i)=xtemp + xtemp=z(imax) + z(imax)=z(i) + z(i)=xtemp + xtemp=z6(imax) + z6(imax)=z6(i) + z6(i)=xtemp + do j=1,2 + xtemp=z1(j,imax) + z1(j,imax)=z1(j,i) + z1(j,i)=xtemp + enddo + do j=1,m + do k=1,mm + xtemp=x(j,k,imax) + x(j,k,imax)=x(j,k,i) + x(j,k,i)=xtemp + enddo + enddo + enddo + return + end diff --git a/source/wham/src-NEWSC/odlodc.f b/source/wham/src-NEWSC/odlodc.f new file mode 100755 index 0000000..c18ac72 --- /dev/null +++ b/source/wham/src-NEWSC/odlodc.f @@ -0,0 +1,55 @@ + subroutine odlodc(r1,r2,a,b,uu,vv,aa,bb,dd) + implicit real*8 (a-h,o-z) + dimension r1(3),r2(3),a(3),b(3),x(3),y(3) + odl(u,v) = (r1(1)-r2(1))**2+(r1(2)-r2(2))**2+(r1(3)-r2(3))**2 + & + 2*ar*u - 2*br*v - 2*ab*u*v + aa*u**2 + bb*v**2 +c print *,"r1",(r1(i),i=1,3) +c print *,"r2",(r2(i),i=1,3) +c print *,"a",(a(i),i=1,3) +c print *,"b",(b(i),i=1,3) + aa = a(1)**2+a(2)**2+a(3)**2 + bb = b(1)**2+b(2)**2+b(3)**2 + ab = a(1)*b(1)+a(2)*b(2)+a(3)*b(3) + ar = a(1)*(r1(1)-r2(1))+a(2)*(r1(2)-r2(2))+a(3)*(r1(3)-r2(3)) + br = b(1)*(r1(1)-r2(1))+b(2)*(r1(2)-r2(2))+b(3)*(r1(3)-r2(3)) + det = aa*bb-ab**2 +c print *,'aa',aa,' bb',bb,' ab',ab,' ar',ar,' br',br,' det',det + uu = (-ar*bb+br*ab)/det + vv = (br*aa-ar*ab)/det +c print *,u,v + uu=dmin1(uu,1.0d0) + uu=dmax1(uu,0.0d0) + vv=dmin1(vv,1.0d0) + vv=dmax1(vv,0.0d0) + dd1 = odl(uu,vv) + dd2 = odl(0.0d0,0.0d0) + dd3 = odl(0.0d0,1.0d0) + dd4 = odl(1.0d0,0.0d0) + dd5 = odl(1.0d0,1.0d0) + dd = dsqrt(dmin1(dd1,dd2,dd3,dd4,dd5)) + if (dd.eq.dd2) then + uu=0.0d0 + vv=0.0d0 + else if (dd.eq.dd3) then + uu=0.0d0 + vv=1.0d0 + else if (dd.eq.dd4) then + uu=1.0d0 + vv=0.0d0 + else if (dd.eq.dd5) then + uu=1.0d0 + vv=1.0d0 + endif +c Control check +c do i=1,3 +c x(i)=r1(i)+u*a(i) +c y(i)=r2(i)+v*b(i) +c enddo +c dd1 = (x(1)-y(1))**2+(x(2)-y(2))**2+(x(3)-y(3))**2 +c dd1 = dsqrt(dd1) + aa = dsqrt(aa) + bb = dsqrt(bb) +c write (8,*) uu,vv,dd,dd1 +c print *,dd,dd1 + return + end diff --git a/source/wham/src-NEWSC/openunits.F b/source/wham/src-NEWSC/openunits.F new file mode 100755 index 0000000..b9f54b7 --- /dev/null +++ b/source/wham/src-NEWSC/openunits.F @@ -0,0 +1,105 @@ + subroutine openunits +#ifdef WIN + use dfport +#endif + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' +#ifdef MPI + include 'mpif.h' + include 'COMMON.MPI' + integer MyRank + character*3 liczba +#endif + include 'COMMON.IOUNITS' + integer lenpre,lenpot,ilen + external ilen + +#ifdef MPI + MyRank=Me +#endif + call mygetenv('PREFIX',prefix) + call mygetenv('SCRATCHDIR',scratchdir) + call mygetenv('POT',pot) + lenpre=ilen(prefix) + lenpot=ilen(pot) + call mygetenv('POT',pot) + entname=prefix(:lenpre)//'_'//pot(:lenpot)//'.entr' +C Get the names and open the input files + open (1,file=prefix(:ilen(prefix))//'.inp',status='old') +C Get parameter filenames and open the parameter files. + call mygetenv('BONDPAR',bondname) + open (ibond,file=bondname,status='old') + call mygetenv('THETPAR',thetname) + open (ithep,file=thetname,status='old') + call mygetenv('ROTPAR',rotname) + open (irotam,file=rotname,status='old') + call mygetenv('TORPAR',torname) + open (itorp,file=torname,status='old') + call mygetenv('TORDPAR',tordname) + open (itordp,file=tordname,status='old') + call mygetenv('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old') + call mygetenv('SCCORPAR',sccorname) + open (isccor,file=sccorname,status='old') + call mygetenv('ELEPAR',elename) + open (ielep,file=elename,status='old') + call mygetenv('SIDEPAR',sidename) + open (isidep,file=sidename,status='old') + call mygetenv('SIDEP',sidepname) + open (isidep1,file=sidepname,status="old") +#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 mygetenv('SCPPAR',scpname) + open (iscpp,file=scpname,status='old') +#endif +#ifdef MPL + if (MyID.eq.BossID) then + MyRank = MyID/fgProcs +#endif +#ifdef MPI + print *,'OpenUnits: processor',MyRank + call numstr(MyRank,liczba) + outname=prefix(:lenpre)//'.out_'//pot(:lenpot)//liczba +#else + outname=prefix(:lenpre)//'.out_'//pot(:lenpot) +#endif + open(iout,file=outname,status='unknown') + write (iout,'(80(1h-))') + write (iout,'(30x,a)') "FILE ASSIGNMENT" + write (iout,'(80(1h-))') + write (iout,*) "Input file : ", + & prefix(:ilen(prefix))//'.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,*) "Backbone-rotamer 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,'(80(1h-))') + write (iout,*) + return + end + diff --git a/source/wham/src-NEWSC/parmread.F b/source/wham/src-NEWSC/parmread.F new file mode 100755 index 0000000..baa4a05 --- /dev/null +++ b/source/wham/src-NEWSC/parmread.F @@ -0,0 +1,1108 @@ + subroutine parmread(iparm,*) +C +C Read the parameters of the probability distributions of the virtual-bond +C valence angles and the side chains and energy parameters. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.FREE' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + include 'COMMON.SBRIDGE' + include 'COMMON.WEIGHTS' + include 'COMMON.ENEPS' + include 'COMMON.SCCOR' + include 'COMMON.SCROT' + include 'COMMON.FREE' + character*1 t1,t2,t3 + character*1 onelett(4) /"G","A","P","D"/ + logical lprint + dimension blower(3,3,maxlob) + character*800 controlcard + character*256 bondname_t,thetname_t,rotname_t,torname_t, + & tordname_t,fouriername_t,elename_t,sidename_t,scpname_t, + & sccorname_t + integer ilen + external ilen + character*16 key + integer iparm + double precision ip,mp +C +C Body +C +C Set LPRINT=.TRUE. for debugging + dwa16=2.0d0**(1.0d0/6.0d0) + lprint=.true. + itypro=20 +C Assign virtual-bond length + vbl=3.8D0 + vblinv=1.0D0/vbl + vblinv2=vblinv*vblinv + call card_concat(controlcard,.true.) + wname(4)="WCORRH" + do i=1,n_ene + key = wname(i)(:ilen(wname(i))) + call reada(controlcard,key(:ilen(key)),ww(i),1.0d0) + enddo + + write (iout,*) "iparm",iparm," myparm",myparm +c If reading not own parameters, skip assignment + + if (iparm.eq.myparm .or. .not.separate_parset) then + +c +c Setup weights for UNRES +c + wsc=ww(1) + wscp=ww(2) + welec=ww(3) + wcorr=ww(4) + wcorr5=ww(5) + wcorr6=ww(6) + wel_loc=ww(7) + wturn3=ww(8) + wturn4=ww(9) + wturn6=ww(10) + wang=ww(11) + wscloc=ww(12) + wtor=ww(13) + wtor_d=ww(14) + wvdwpp=ww(16) + wstrain=ww(15) + wbond=ww(18) + wsccor=ww(19) + + endif + + call card_concat(controlcard,.false.) + +c Return if not own parameters + + if (iparm.ne.myparm .and. separate_parset) return + + call reads(controlcard,"BONDPAR",bondname_t,bondname) + open (ibond,file=bondname_t,status='old') + rewind(ibond) + call reads(controlcard,"THETPAR",thetname_t,thetname) + open (ithep,file=thetname_t,status='old') + rewind(ithep) + call reads(controlcard,"ROTPAR",rotname_t,rotname) + open (irotam,file=rotname_t,status='old') + rewind(irotam) + call reads(controlcard,"TORPAR",torname_t,torname) + open (itorp,file=torname_t,status='old') + rewind(itorp) + call reads(controlcard,"TORDPAR",tordname_t,tordname) + open (itordp,file=tordname_t,status='old') + rewind(itordp) + call reads(controlcard,"SCCORAR",sccorname_t,sccorname) + open (isccor,file=sccorname_t,status='old') + rewind(isccor) + call reads(controlcard,"FOURIER",fouriername_t,fouriername) + open (ifourier,file=fouriername_t,status='old') + rewind(ifourier) + call reads(controlcard,"ELEPAR",elename_t,elename) + open (ielep,file=elename_t,status='old') + rewind(ielep) + call reads(controlcard,"SIDEPAR",sidename_t,sidename) + open (isidep,file=sidename_t,status='old') + rewind(isidep) + call reads(controlcard,"SCPPAR",scpname_t,scpname) + open (iscpp,file=scpname_t,status='old') + rewind(iscpp) + write (iout,*) "Parameter set:",iparm + write (iout,*) "Energy-term weights:" + do i=1,n_ene + write (iout,'(a16,f10.5)') wname(i),ww(i) + enddo + write (iout,*) "Sidechain potential file : ", + & sidename_t(:ilen(sidename_t)) +#ifndef OLDSCP + write (iout,*) "SCp potential file : ", + & scpname_t(:ilen(scpname_t)) +#endif + write (iout,*) "Electrostatic potential file : ", + & elename_t(:ilen(elename_t)) + write (iout,*) "Cumulant coefficient file : ", + & fouriername_t(:ilen(fouriername_t)) + write (iout,*) "Torsional parameter file : ", + & torname_t(:ilen(torname_t)) + write (iout,*) "Double torsional parameter file : ", + & tordname_t(:ilen(tordname_t)) + write (iout,*) "Backbone-rotamer parameter file : ", + & sccorname(:ilen(sccorname)) + write (iout,*) "Bond & inertia constant file : ", + & bondname_t(:ilen(bondname_t)) + write (iout,*) "Bending parameter file : ", + & thetname_t(:ilen(thetname_t)) + write (iout,*) "Rotamer parameter file : ", + & rotname_t(:ilen(rotname_t)) + +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 + do i=1,ntyp + nbondterm(i)=1 + read (ibond,*) vbldsc0(1,i),aksc(1,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,*) ijunk,vbldp0,akp,rjunk + do i=1,ntyp + read (ibond,*) nbondterm(i),(vbldsc0(j,i),aksc(j,i),abond0(j,i), + & j=1,nbondterm(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/)')"Force constants virtual bonds:" + write (iout,'(a10,a3,6a10)') 'Type','N','VBL','K', + & 'inertia','Pstok' + write(iout,'(a10,i3,6f10.5)') "p",1,vbldp0,akp,0.0d0 + do i=1,ntyp + write (iout,'(a10,i3,6f10.5)') restyp(i),nbondterm(i), + & vbldsc0(1,i),aksc(1,i),abond0(1,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,*) a0thet(i),(athet(j,i),j=1,2),(bthet(j,i),j=1,2) + read (ithep,*) (polthet(j,i),j=0,3) + read (ithep,*) (gthet(j,i),j=1,3) + read (ithep,*) theta0(i),sig0(i),sigc0(i) + sigc0(i)=sigc0(i)**2 + enddo + close (ithep) + if (lprint) then +c write (iout,'(a)') +c & 'Parameters of the virtual-bond valence angles:' +c write (iout,'(/a/9x,5a/79(1h-))') 'Fourier coefficients:', +c & ' ATHETA0 ',' A1 ',' A2 ', +c & ' B1 ',' B2 ' +c do i=1,ntyp +c write(iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i, +c & a0thet(i),(athet(j,i),j=1,2),(bthet(j,i),j=1,2) +c enddo +c write (iout,'(/a/9x,5a/79(1h-))') +c & 'Parameters of the expression for sigma(theta_c):', +c & ' ALPH0 ',' ALPH1 ',' ALPH2 ', +c & ' ALPH3 ',' SIGMA0C ' +c do i=1,ntyp +c write (iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i, +c & (polthet(j,i),j=0,3),sigc0(i) +c enddo +c write (iout,'(/a/9x,5a/79(1h-))') +c & 'Parameters of the second gaussian:', +c & ' THETA0 ',' SIGMA0 ',' G1 ', +c & ' G2 ',' G3 ' +c do i=1,ntyp +c write (iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i,theta0(i), +c & sig0(i),(gthet(j,i),j=1,3) +c enddo + 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 +#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,*) nthetyp,ntheterm,ntheterm2, + & ntheterm3,nsingle,ndouble + nntheterm=max0(ntheterm,ntheterm2,ntheterm3) + read (ithep,*) (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)') res1,res2,res3 + read (ithep,*) aa0thet(i,j,k) + read (ithep,*)(aathet(l,i,j,k),l=1,ntheterm) + read (ithep,*) + & ((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,*) + & (((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 +#endif + +#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)') 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,*)(censc(k,1,i),k=1,3),((blower(k,l,1),l=1,k),k=1,3) + do j=2,nlob(i) + read (irotam,*) bsc(j,i) + read (irotam,*) (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 + write (iout,'(/3a,i2,a,f8.3)') 'Residue type: ',restyp(i), + & ' # of gaussian lobes:',nlobi,' dsc:',dsc(i) +c write (iout,'(/a,8x,i1,4(25x,i1))') 'Lobe:',(j,j=1,nlobi) +c write (iout,'(a,f10.4,4(16x,f10.4))') +c & 'Center ',(bsc(j,i),j=1,nlobi) +c write (iout,'(5(2x,3f8.4))') ((censc(k,j,i),k=1,3),j=1,nlobi) + 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) +c write (iout,'(a)') +c do j=1,nlobi +c ind=0 +c do k=1,3 +c do l=1,k +c ind=ind+1 +c blower(k,l,j)=gaussc(ind,j,i) +c enddo +c enddo +c enddo + 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 + 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,*) + if (i.eq.10) then + read (irotam,*) + else + do j=1,65 + read(irotam,*) sc_parmin(j,i) + enddo + endif + enddo +#endif + close(irotam) +#ifdef CRYST_TOR +C +C Read torsional parameters in old format +C + read (itorp,*) ntortyp,nterm_old + write (iout,*) 'ntortyp,nterm',ntortyp,nterm_old + read (itorp,*) (itortyp(i),i=1,ntyp) + do i=1,ntortyp + do j=1,ntortyp + read (itorp,'(a)') + do k=1,nterm_old + read (itorp,*) 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,*) ntortyp + read (itorp,*) (itortyp(i),i=1,ntyp) + write (iout,*) 'ntortyp',ntortyp + do i=1,ntortyp + do j=1,ntortyp + read (itorp,*) nterm(i,j),nlor(i,j) + v0ij=0.0d0 + si=-1.0d0 + do k=1,nterm(i,j) + read (itorp,*) 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,*) 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)') 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 + stop "Error in double torsional parameter file" + endif + read (itordp,*) ntermd_1(i,j,k),ntermd_2(i,j,k) + read (itordp,*) (v1c(1,l,i,j,k),l=1,ntermd_1(i,j,k)) + read (itordp,*) (v1s(1,l,i,j,k),l=1,ntermd_1(i,j,k)) + read (itordp,*) (v1c(2,l,i,j,k),l=1,ntermd_1(i,j,k)) + read (itordp,*) (v1s(2,l,i,j,k),l=1,ntermd_1(i,j,k)) + read (itordp,*) ((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,*) nsccortyp + read (isccor,*) (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,*) nterm_sccor(i,j),nlor_sccor(i,j) + v0ijsccor=0.0d0 + si=-1.0d0 + + do k=1,nterm_sccor(i,j) + read (isccor,*) 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,*) 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), + & l=1,maxinter) + 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 9/18/99 (AL) Read coefficients of the Fourier expansion of the local +C interaction energy of the Gly, Ala, and Pro prototypes. +C + read (ifourier,*) nloctyp + do i=1,nloctyp + read (ifourier,*) + read (ifourier,*) (b(ii,i),ii=1,13) + if (lprint) then + write (iout,*) 'Type',i + write (iout,'(a,i2,a,f10.5)') ('b(',ii,')=',b(ii,i),ii=1,13) + endif + B1(1,i) = b(3,i) + B1(2,i) = b(5,i) + B1tilde(1,i) = b(3,i) + B1tilde(2,i) =-b(5,i) + B2(1,i) = b(2,i) + B2(2,i) = b(4,i) + CC(1,1,i)= b(7,i) + CC(2,2,i)=-b(7,i) + CC(2,1,i)= b(9,i) + CC(1,2,i)= b(9,i) + Ctilde(1,1,i)=b(7,i) + Ctilde(1,2,i)=b(9,i) + Ctilde(2,1,i)=-b(9,i) + Ctilde(2,2,i)=b(7,i) + DD(1,1,i)= b(6,i) + DD(2,2,i)=-b(6,i) + DD(2,1,i)= b(8,i) + DD(1,2,i)= b(8,i) + Dtilde(1,1,i)=b(6,i) + Dtilde(1,2,i)=b(8,i) + Dtilde(2,1,i)=-b(8,i) + Dtilde(2,2,i)=b(6,i) + EE(1,1,i)= b(10,i)+b(11,i) + EE(2,2,i)=-b(10,i)+b(11,i) + EE(2,1,i)= b(12,i)-b(13,i) + EE(1,2,i)= b(12,i)+b(13,i) + enddo + if (lprint) then + do i=1,nloctyp + write (iout,*) 'Type',i + write (iout,*) 'B1' +c write (iout,'(f10.5)') B1(:,i) + write(iout,*) B1(1,i),B1(2,i) + write (iout,*) 'B2' +c write (iout,'(f10.5)') B2(:,i) + 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,'(/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,*) ((epp(i,j),j=1,2),i=1,2) + read (ielep,*) ((rpp(i,j),j=1,2),i=1,2) + read (ielep,*) ((elpp6(i,j),j=1,2),i=1,2) + read (ielep,*) ((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,*) ipot,expon + if (ipot.lt.1 .or. ipot.gt.6) then + write (iout,'(2a)') 'Error while reading SC interaction', + & 'potential file - unknown potential type.' + stop + endif + expon2=expon/2 + 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,*)((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,*)((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,*)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp),(sigii(i),i=1,ntyp),(chip0(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)=(chip0(i)-1.0D0)/(chip0(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,*)((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 + + 60 continue + close (isidep) +C----------------------------------------------------------------------- +C Calculate the "working" parameters of SC interactions. + + 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 + write (iout,*) "IPOT=",ipot + 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 + +C +C Define the SC-p interaction constants +C +#ifdef OLDSCP + 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,*) (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 + + if (lprint) 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 + end diff --git a/source/wham/src-NEWSC/pinorm.f b/source/wham/src-NEWSC/pinorm.f new file mode 100755 index 0000000..91392bf --- /dev/null +++ b/source/wham/src-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/wham/src-NEWSC/printmat.f b/source/wham/src-NEWSC/printmat.f new file mode 100755 index 0000000..be2b38f --- /dev/null +++ b/source/wham/src-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/wham/src-NEWSC/proc_cont.f b/source/wham/src-NEWSC/proc_cont.f new file mode 100755 index 0000000..9269496 --- /dev/null +++ b/source/wham/src-NEWSC/proc_cont.f @@ -0,0 +1,156 @@ + subroutine proc_cont + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.HEADER' + include 'COMMON.CONTACTS1' + include 'COMMON.PEPTCONT' + include 'COMMON.GEO' + write (iout,*) "proc_cont: nlevel",nlevel + if (nlevel.lt.0) then + write (iout,*) "call define_fragments" + call define_fragments + else + write (iout,*) "call secondary2" + call secondary2(.true.,.false.,ncont_pept_ref,icont_pept_ref, + & isec_ref) + endif + write (iout,'(80(1h=))') + write (iout,*) "Electrostatic contacts" + call contacts_between_fragments(.true.,0,ncont_pept_ref, + & icont_pept_ref,ncont_frag_ref(1),icont_frag_ref(1,1,1)) + write (iout,'(80(1h=))') + write (iout,*) "Side chain contacts" + call contacts_between_fragments(.true.,0,ncont_ref, + & icont_ref,nsccont_frag_ref(1),isccont_frag_ref(1,1,1)) + if (nlevel.lt.0) then + do i=1,nfrag(1) + ind=icant(i,i) + len_cut=1000 + if (istruct(i).le.1) then + len_cut=max0(len_frag(i,1)*4/5,3) + else if (istruct(i).eq.2 .or. istruct(i).eq.4) then + len_cut=max0(len_frag(i,1)*2/5,3) + endif + write (iout,*) "i",i," istruct",istruct(i)," ncont_frag", + & ncont_frag_ref(ind)," len_cut",len_cut, + & " icont_single",icont_single," iloc_single",iloc_single + iloc(i)=iloc_single + if (iloc(i).gt.0) write (iout,*) + & "Local structure used to compare structure of fragment",i, + & " to native." + if (istruct(i).ne.3 .and. istruct(i).ne.0 + & .and. icont_single.gt.0 .and. + & ncont_frag_ref(ind).ge.len_cut) then + write (iout,*) "Electrostatic contacts used to compare", + & " structure of fragment",i," to native." + ielecont(i,1)=1 + isccont(i,1)=0 + else if (icont_single.gt.0 .and. nsccont_frag_ref(ind) + & .ge.len_cut) then + write (iout,*) "Side chain contacts used to compare", + & " structure of fragment",i," to native." + isccont(i,1)=1 + ielecont(i,1)=0 + else + write (iout,*) "Contacts not used to compare", + & " structure of fragment",i," to native." + ielecont(i,1)=0 + isccont(i,1)=0 + nc_req_setf(i,1)=0 + endif + if (irms_single.gt.0 .or. isccont(i,1).eq.0 + & .and. ielecont(i,1).eq.0) then + write (iout,*) "RMSD used to compare", + & " structure of fragment",i," to native." + irms(i,1)=1 + else + write (iout,*) "RMSD not used to compare", + & " structure of fragment",i," to native." + irms(i,1)=0 + endif + enddo + endif + if (nlevel.lt.-1) then + call define_pairs + nlevel = -nlevel + if (nlevel.gt.3) nlevel=3 + if (nlevel.eq.3) then + nfrag(3)=1 + npiece(1,3)=nfrag(1) + do i=1,nfrag(1) + ipiece(i,1,3)=i + enddo + ielecont(1,3)=0 + isccont(1,3)=0 + irms(1,3)=1 + n_shift(1,1,3)=0 + n_shift(2,1,3)=0 + endif + else if (nlevel.eq.-1) then + nlevel=1 + endif + isnfrag(1)=0 + do i=1,nlevel + isnfrag(i+1)=isnfrag(i)+nfrag(i) + enddo + ndigit=3*nfrag(1) + do i=2,nlevel + ndigit=ndigit+2*nfrag(i) + enddo + write (iout,*) "ndigit",ndigit + if (.not.binary .and. ndigit.gt.30) then + write (iout,*) "Highest class too large; switching to", + & " binary representation." + binary=.true. + endif + write (iout,*) "isnfrag",(isnfrag(i),i=1,nlevel+1) + write(iout,*) "rmscut_base_up",rmscut_base_up, + & " rmscut_base_low",rmscut_base_low," rmsup_lim",rmsup_lim + do i=1,nlevel + do j=1,nfrag(i) + length_frag = 0 + if (i.eq.1) then + do k=1,npiece(j,i) + length_frag=length_frag+ifrag(2,k,j)-ifrag(1,k,j)+1 + enddo + else + do k=1,npiece(j,i) + length_frag=length_frag+len_frag(ipiece(k,j,i),1) + enddo + endif + len_frag(j,i)=length_frag + rmscutfrag(1,j,i)=rmscut_base_up*length_frag + rmscutfrag(2,j,i)=rmscut_base_low*length_frag + if (rmscutfrag(1,j,i).lt.rmsup_lim) + & rmscutfrag(1,j,i)=rmsup_lim + if (rmscutfrag(1,j,i).gt.rmsupup_lim) + & rmscutfrag(1,j,i)=rmsupup_lim + enddo + enddo + write (iout,*) "Level",1," number of fragments:",nfrag(1) + do j=1,nfrag(1) + write (iout,*) npiece(j,1),(ifrag(1,k,j),ifrag(2,k,j), + & k=1,npiece(j,1)),len_frag(j,1),rmscutfrag(1,j,1), + & rmscutfrag(2,j,1),n_shift(1,j,1),n_shift(2,j,1), + & ang_cut(j)*rad2deg,ang_cut1(j)*rad2deg,frac_min(j), + & nc_fragm(j,1),nc_req_setf(j,1),istruct(j) + enddo + do i=2,nlevel + write (iout,*) "Level",i," number of fragments:",nfrag(i) + do j=1,nfrag(i) + write (iout,*) npiece(j,i),(ipiece(k,j,i), + & k=1,npiece(j,i)),len_frag(j,i),rmscutfrag(1,j,i), + & rmscutfrag(2,j,i),n_shift(1,j,i),n_shift(2,j,i), + & nc_fragm(j,i),nc_req_setf(j,i) + enddo + enddo + return + end diff --git a/source/wham/src-NEWSC/proc_proc.c b/source/wham/src-NEWSC/proc_proc.c new file mode 100755 index 0000000..01c6bba --- /dev/null +++ b/source/wham/src-NEWSC/proc_proc.c @@ -0,0 +1,124 @@ +#include +#include +#include + +#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 +#ifdef WIN +void _stdcall PROC_PROC(long int *f, int *i) +#endif +#if defined(AIX) || defined(WINPGI) +void proc_proc(long int *f, int *i) +#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 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 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 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/wham/src-NEWSC/promienie.f b/source/wham/src-NEWSC/promienie.f new file mode 100755 index 0000000..12a2e80 --- /dev/null +++ b/source/wham/src-NEWSC/promienie.f @@ -0,0 +1,46 @@ + subroutine promienie(*) + implicit none + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CONTPAR' + include 'COMMON.LOCAL' + integer i,j + real*8 facont /1.569D0/ ! facont = (2/(1-sqrt(1-1/4)))**(1/6) + character*8 contfunc + character*8 contfuncid(5)/'GB','DIST','CEN','ODC','SIG'/ + character*8 ucase + call getenv("CONTFUNC",contfunc) + contfunc=ucase(contfunc) + do icomparfunc=1,5 + if (contfunc.eq.contfuncid(icomparfunc)) goto 10 + enddo + 10 continue + write (iout,*) "Sidechain contact function is ",contfunc, + & "icomparfunc",icomparfunc + do i=1,ntyp + do j=1,ntyp + if (icomparfunc.lt.3) then + read(isidep1,*) chi_comp(i,j),chip_comp(i,j),sig_comp(i,j), + & sc_cutoff(i,j) + else if (icomparfunc.lt.5) then + read(isidep1,*) sc_cutoff(i,j) + else if (icomparfunc.eq.5) then + sc_cutoff(i,j)=dsqrt(sigma0(i)**2+sigma0(j)**2)*facont + else + write (iout,*) "Error - Unknown contact function" + return1 + endif + enddo + enddo + close (isidep1) + do i=1,ntyp1 + if (i.eq.10 .or. i.eq.21) then + dsc_inv(i)=0.0d0 + else + dsc_inv(i)=1.0d0/dsc(i) + endif + enddo + return + end diff --git a/source/wham/src-NEWSC/qwolynes.f b/source/wham/src-NEWSC/qwolynes.f new file mode 100755 index 0000000..97b5efb --- /dev/null +++ b/source/wham/src-NEWSC/qwolynes.f @@ -0,0 +1,186 @@ + double precision function qwolynes(ilevel,jfrag) + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + integer ilevel,jfrag + integer i,j,jl,k,l,il,kl,nl,np,ip,kp + integer nsep /3/ + double precision dist + double precision qq,qqij,qqijCM,dij,d0ij,dijCM,d0ijCM + logical lprn /.false./ + double precision sigm,x + sigm(x)=0.25d0*x +c write (iout,*) "QWolyes: " jfrag",jfrag, +c & " ilevel",ilevel + qq = 0.0d0 + if (ilevel.eq.0) then + if (lprn) write (iout,*) "Q computed for whole molecule" + nl=0 + do il=nnt+nsep,nct + do jl=nnt,il-nsep + dij=0.0d0 + dijCM=0.0d0 + d0ij=0.0d0 + d0ijCM=0.0d0 + qqij=0.0d0 + qqijCM=0.0d0 + 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 + if (lprn) then + write (iout,*) "il",il," jl",jl, + & " itype",itype(il),itype(jl) + write (iout,*)"d0ij",d0ij," dij",dij," d0ijCM",d0ijCM, + & " dijCM",dijCM," qqij",qqij," qqijCM",qqijCM + endif + enddo + enddo + qq = qq/nl + if (lprn) write (iout,*) "nl",nl," qq",qq + else if (ilevel.eq.1) then + if (lprn) write (iout,*) "Level",ilevel," fragment",jfrag + nl=0 +c write (iout,*) "nlist_frag",nlist_frag(jfrag) + do i=2,nlist_frag(jfrag) + do j=1,i-1 + il=list_frag(i,jfrag) + jl=list_frag(j,jfrag) + if (iabs(il-jl).gt.nsep) then + dij=0.0d0 + dijCM=0.0d0 + d0ij=0.0d0 + d0ijCM=0.0d0 + qqij=0.0d0 + qqijCM=0.0d0 + 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 + if (lprn) then + write (iout,*) "i",i," j",j," il",il," jl",jl, + & " itype",itype(il),itype(jl) + write (iout,*)"d0ij",d0ij," dij",dij," d0ijCM",d0ijCM, + & " dijCM",dijCM," qqij",qqij," qqijCM",qqijCM + endif + endif + enddo + enddo + qq = qq/nl + if (lprn) write (iout,*) "nl",nl," qq",qq + else if (ilevel.eq.2) then + np=npiece(jfrag,ilevel) + nl=0 + do i=2,np + ip=ipiece(i,jfrag,ilevel) + do j=1,nlist_frag(ip) + il=list_frag(j,ip) + do k=1,i-1 + kp=ipiece(k,jfrag,ilevel) + do l=1,nlist_frag(kp) + kl=list_frag(l,kp) + if (iabs(kl-il).gt.nsep) then + nl=nl+1 + dij=0.0d0 + dijCM=0.0d0 + d0ij=0.0d0 + d0ijCM=0.0d0 + qqij=0.0d0 + qqijCM=0.0d0 + d0ij=dsqrt((cref(1,kl)-cref(1,il))**2+ + & (cref(2,kl)-cref(2,il))**2+ + & (cref(3,kl)-cref(3,il))**2) + dij=dist(il,kl) + qqij = dexp(-0.5d0*((dij-d0ij)/(sigm(d0ij)))**2) + if (itype(il).ne.10 .or. itype(kl).ne.10) then + nl=nl+1 + d0ijCM=dsqrt( + & (cref(1,kl+nres)-cref(1,il+nres))**2+ + & (cref(2,kl+nres)-cref(2,il+nres))**2+ + & (cref(3,kl+nres)-cref(3,il+nres))**2) + dijCM=dist(il+nres,kl+nres) + qqijCM = dexp(-0.5d0*((dijCM-d0ijCM)/ + & (sigm(d0ijCM)))**2) + endif + qq = qq+qqij+qqijCM + if (lprn) then + write (iout,*) "i",i," j",j," k",k," l",l," il",il, + & " kl",kl," itype",itype(il),itype(kl) + write (iout,*) " d0ij",d0ij," dij",dij," d0ijCM", + & d0ijCM," dijCM",dijCM," qqij",qqij," qqijCM",qqijCM + endif + endif + enddo ! l + enddo ! k + enddo ! j + enddo ! i + qq = qq/nl + if (lprn) write (iout,*) "nl",nl," qq",qq + else + write (iout,*)"Error: Q can be computed only for level 1 and 2." + endif + qwolynes=1.0d0-qq + return + end +c------------------------------------------------------------------------------- + subroutine fragment_list + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.COMPAR' + logical lprn /.true./ + integer i,ilevel,j,k,jfrag + do jfrag=1,nfrag(1) + nlist_frag(jfrag)=0 + do i=1,npiece(jfrag,1) + if (lprn) write (iout,*) "jfrag=",jfrag, + & "i=",i," fragment",ifrag(1,i,jfrag), + & ifrag(2,i,jfrag) + do j=ifrag(1,i,jfrag),ifrag(2,i,jfrag) + do k=1,nlist_frag(jfrag) + if (list_frag(k,jfrag).eq.j) goto 10 + enddo + nlist_frag(jfrag)=nlist_frag(jfrag)+1 + list_frag(nlist_frag(jfrag),jfrag)=j + enddo + 10 continue + enddo + enddo + write (iout,*) "Fragment list" + do j=1,nfrag(1) + write (iout,*)"Fragment",j," list",(list_frag(k,j), + & k=1,nlist_frag(j)) + enddo + return + end diff --git a/source/wham/src-NEWSC/read_ref_str.F b/source/wham/src-NEWSC/read_ref_str.F new file mode 100755 index 0000000..4b56181 --- /dev/null +++ b/source/wham/src-NEWSC/read_ref_str.F @@ -0,0 +1,165 @@ + subroutine read_ref_structure(*) +C +C Read the reference structure from the PDB file or from a PDB file or in the form of the dihedral +C angles. +C + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + 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.CONTACTS1' + include 'COMMON.PEPTCONT' + include 'COMMON.TIME1' + include 'COMMON.COMPAR' + character*4 sequence(maxres) + integer rescode + double precision x(maxvar) + integer itype_pdb(maxres) + logical seq_comp + integer i,j,k,nres_pdb,iaux + double precision ddsc,dist + integer ilen + external ilen +C + nres0=nres + write (iout,*) "pdbref",pdbref + if (pdbref) then + read(inp,'(a)') pdbfile + write (iout,'(2a,1h.)') '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.' + return1 + 34 continue + do i=1,nres + itype_pdb(i)=itype(i) + enddo + call readpdb(.true.) + do i=1,nres + iaux=itype_pdb(i) + itype_pdb(i)=itype(i) + itype(i)=iaux + enddo + close (ipdbin) + nres_pdb=nres + nres=nres0 + 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 + do j=nnt+nsup-1,nnt,-1 + do k=1,3 + cref(k,nres+j+i)=cref(k,nres_pdb+j) + enddo + enddo + do j=nnt+nsup-1,nnt,-1 + do k=1,3 + cref(k,j+i)=cref(k,j) + enddo + phi_ref(j+i)=phi_ref(j) + theta_ref(j+i)=theta_ref(j) + alph_ref(j+i)=alph_ref(j) + omeg_ref(j+i)=omeg_ref(j) + enddo +#ifdef DEBUG + do j=nnt,nct + write (iout,'(i5,3f10.5,5x,3f10.5)') + & j,(cref(k,j),k=1,3),(cref(k,j+nres),k=1,3) + enddo +#endif + nstart_seq=nnt+i + nstart_sup=nnt+i + goto 111 + endif + enddo + write (iout,'(a)') + & 'Error - sequences to be superposed do not match.' + return1 + 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 + write (iout,'(a,i5)') + & 'Experimental structure begins at residue',nstart_seq + else + call read_angles(inp,*38) + goto 39 + 38 write (iout,'(a)') 'Error reading reference structure.' + return1 + 39 call chainbuild + 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 + endif + nend_sup=nstart_sup+nsup-1 + do i=1,2*nres + do j=1,3 + c(j,i)=cref(j,i) + enddo + enddo + do i=1,nres + do j=1,3 + dc(j,nres+i)=cref(j,nres+i)-cref(j,i) + enddo + if (itype(i).ne.10) then + ddsc = dist(i,nres+i) + do j=1,3 + dc_norm(j,nres+i)=dc(j,nres+i)/ddsc + enddo + else + do j=1,3 + dc_norm(j,nres+i)=0.0d0 + enddo + endif +c write (iout,*) "i",i," dc_norm",(dc_norm(k,nres+i),k=1,3), +c " norm",dc_norm(1,nres+i)**2+dc_norm(2,nres+i)**2+ +c dc_norm(3,nres+i)**2 + do j=1,3 + dc(j,i)=c(j,i+1)-c(j,i) + enddo + ddsc = dist(i,i+1) + do j=1,3 + dc_norm(j,i)=dc(j,i)/ddsc + enddo + enddo +c print *,"Calling contact" + call contact(.true.,ncont_ref,icont_ref(1,1), + & nstart_sup,nend_sup) +c print *,"Calling elecont" + call elecont(.true.,ncont_pept_ref, + & icont_pept_ref(1,1), + & nstart_sup,nend_sup) + write (iout,'(a,i3,a,i3,a,i3,a)') + & 'Number of residues to be superposed:',nsup, + & ' (from residue',nstart_sup,' to residue', + & nend_sup,').' + return + end diff --git a/source/wham/src-NEWSC/readpdb.f b/source/wham/src-NEWSC/readpdb.f new file mode 100755 index 0000000..0b82476 --- /dev/null +++ b/source/wham/src-NEWSC/readpdb.f @@ -0,0 +1,219 @@ + subroutine readpdb +C Read the PDB file and convert the peptide geometry into virtual-chain +C geometry. + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.CONTROL' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.NAMES' + character*3 seq,atom,res + character*80 card + double precision sccor(3,20) + integer i,j,iii,ibeg,ishift,ishift1,ity,ires,ires_old + double precision dcj + integer rescode + ibeg=1 + ishift1=0 + do i=1,10000 + read (ipdbin,'(a80)',end=10) card + 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) call sccenter(ires,iii,sccor) +C Start new residue. + ires_old=ires+ishift-ishift1 + read (card(23:26),*) ires +c print *,"ires_old",ires_old," ires",ires + if (card(27:27).eq."A" .or. card(27:27).eq."B") then +c ishift1=ishift1+1 + endif + 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 + else + ishift=ishift+ires-ires_old-1 + endif + ires=ires-ishift+ishift1 + 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) + write (iout,'(2i3,2x,a,3f8.3)') + & ires,itype(ires),res,(c(j,ires),j=1,3) + iii=1 + do j=1,3 + sccor(j,iii)=c(j,ires) + enddo +c write (*,*) card(23:27),ires,itype(ires) + 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 write (iout,'(a,i5)') ' Nres: ',ires +C Calculate the CM of the last side chain. + call sccenter(ires,iii,sccor) + nres=ires + nsup=nres + nstart_sup=1 + if (itype(nres).ne.10) then + nres=nres+1 + itype(nres)=21 + 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 + 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 + 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 +C Copy the coordinates to reference coordinates + do i=1,2*nres + do j=1,3 + cref(j,i)=c(j,i) + enddo + enddo +C Calculate internal coordinates. + 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,ires+nres),j=1,3) + enddo + call flush(iout) + call int_from_cart(.true.,.true.) + do i=1,nres + phi_ref(i)=phi(i) + theta_ref(i)=theta(i) + alph_ref(i)=alph(i) + omeg_ref(i)=omeg(i) + enddo + ishift_pdb=ishift + return + end +c--------------------------------------------------------------------------- + subroutine int_from_cart(lside,lprn) + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.NAMES' + character*3 seq,atom,res + character*80 card + double precision sccor(3,20) + integer rescode + double precision dist,alpha,beta,di + integer i,j,iti + logical lside,lprn + if (lprn) then + write (iout,'(/a)') + & 'Internal coordinates calculated from crystal structure.' + if (lside) then + write (iout,'(8a)') ' Res ',' dvb',' Theta', + & ' Phi',' Dsc_id',' Dsc',' Alpha', + & ' Omega' + else + write (iout,'(4a)') ' Res ',' dvb',' Theta', + & ' Phi' + endif + endif + do i=2,nres + iti=itype(i) + write (iout,*) i,i-1,(c(j,i),j=1,3),(c(j,i-1),j=1,3),dist(i,i-1) + if (itype(i-1).ne.21 .and. itype(i).ne.21 .and. + & (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 + stop + endif + 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 + if (itype(1).eq.21) then + do j=1,3 + c(j,1)=c(j,2)+(c(j,3)-c(j,4)) + enddo + endif + if (itype(nres).eq.21) then + do j=1,3 + c(j,nres)=c(j,nres-1)+(c(j,nres-2)-c(j,nres-3)) + enddo + endif + if (lside) then + do i=2,nres-1 + do j=1,3 + c(j,maxres2)=0.5D0*(c(j,i-1)+c(j,i+1)) + enddo + iti=itype(i) + di=dist(i,nres+i) + if (iti.ne.10) then + alph(i)=alpha(nres+i,i,maxres2) + omeg(i)=beta(nres+i,i,maxres2,i+1) + endif + if (lprn) + & write (iout,'(a3,i4,7f10.3)') restyp(iti),i,dist(i,i-1), + & rad2deg*theta(i),rad2deg*phi(i),dsc(iti),di, + & rad2deg*alph(i),rad2deg*omeg(i) + enddo + else if (lprn) then + do i=2,nres + iti=itype(i) + 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 sccenter(ires,nscat,sccor) + implicit none + include 'DIMENSIONS' + include 'COMMON.CHAIN' + integer ires,nscat,i,j + double precision sccor(3,20),sccmj + 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 diff --git a/source/wham/src-NEWSC/readrtns.F b/source/wham/src-NEWSC/readrtns.F new file mode 100755 index 0000000..006c111 --- /dev/null +++ b/source/wham/src-NEWSC/readrtns.F @@ -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 + energy_dec=index(controlcard,"ENERGY_DEC").gt.0 + 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 + + do i=1,nQ + prop(i)=0.0d0 + enddo + do islice=1,nslice + ll(islice)=0 + mm(islice)=0 + enddo + 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 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 diff --git a/source/wham/src-NEWSC/readrtns.F.org b/source/wham/src-NEWSC/readrtns.F.org new file mode 100755 index 0000000..1fa6e46 --- /dev/null +++ b/source/wham/src-NEWSC/readrtns.F.org @@ -0,0 +1,691 @@ + 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) + 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) + 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 reada(controlcard,"DELTRGY",deltrgy,5.0d-2) + call readi(controlcard,"RESCALE",rescale_mode,1) + 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 + entfile=index(controlcard,"ENTFILE").gt.0 + zscfile=index(controlcard,"ZSCFILE").gt.0 + return + end +c------------------------------------------------------------------------------ + subroutine read_efree(iparm,*) +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 + integer ilen + external ilen + call card_concat(controlcard,.true.) + call readi(controlcard,'NT',nT_h(iparm),1) + 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 + return + end +c----------------------------------------------------------------------------- + subroutine read_protein_data(iparm,*) + 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 + external ilen,iroof + call flush(iout) +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 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 + 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" + character*64 bprotfile_temp + character*3 liczba + character*2 liczba1 + integer iunit,islice + integer ilen,iroof + external ilen,iroof + logical lerr + + 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 + open (iunit,file=bprotfile_temp,status="unknown", + & form="unformatted",access="direct",recl=lenrec) +#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 + 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 + 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 + + do i=1,nQ + prop(i)=0.0d0 + enddo + do islice=1,nslice + ll(islice)=0 + mm(islice)=0 + enddo + write (iout,*) "nparmset",nparmset + do iparm=1,nparmset + + if (replica(iparm)) then + nthr = 1 + else + nthr = nT_h(iparm) + endif + + 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 diff --git a/source/wham/src-NEWSC/readrtns_compar.F b/source/wham/src-NEWSC/readrtns_compar.F new file mode 100755 index 0000000..8e03f15 --- /dev/null +++ b/source/wham/src-NEWSC/readrtns_compar.F @@ -0,0 +1,160 @@ + subroutine read_compar +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.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.HEADER' + include 'COMMON.GEO' + include 'COMMON.FREE' + character*320 controlcard,ucase + character*64 wfile + integer ilen + external ilen + integer i,j,k + + call card_concat(controlcard,.true.) + pdbref=(index(controlcard,'PDBREF').gt.0) + call reada(controlcard,'CUTOFF_UP',rmscut_base_up,4.0d0) + call reada(controlcard,'CUTOFF_LOW',rmscut_base_low,3.0d0) + call reada(controlcard,'RMSUP_LIM',rmsup_lim,4.0d0) + call reada(controlcard,'RMSUPUP_LIM',rmsupup_lim,7.5d0) + verbose = index(controlcard,"VERBOSE").gt.0 + lgrp=index(controlcard,"STATIN").gt.0 + lgrp_out=index(controlcard,"STATOUT").gt.0 + merge_helices=index(controlcard,"DONT_MERGE_HELICES").eq.0 + binary = index(controlcard,"BINARY").gt.0 + rmscut_base_up=rmscut_base_up/50 + rmscut_base_low=rmscut_base_low/50 + call reada(controlcard,"FRAC_SEC",frac_sec,0.66666666d0) + call readi(controlcard,'NLEVEL',nlevel,1) + if (nlevel.lt.0) goto 121 +c Read the data pertaining to elementary fragments (level 1) + call readi(controlcard,'NFRAG',nfrag(1),0) + write(iout,*)"nfrag(1)",nfrag(1) + do j=1,nfrag(1) + call card_concat(controlcard,.true.) + write (iout,*) controlcard(:ilen(controlcard)) + call readi(controlcard,'NPIECE',npiece(j,1),0) + call readi(controlcard,'N_SHIFT1',n_shift(1,j,1),0) + call readi(controlcard,'N_SHIFT2',n_shift(2,j,1),0) + call reada(controlcard,'ANGCUT',ang_cut(j),50.0d0) + call reada(controlcard,'MAXANG',ang_cut1(j),360.0d0) + call reada(controlcard,'FRAC_MIN',frac_min(j),0.666666d0) + call reada(controlcard,'NC_FRAC',nc_fragm(j,1),0.5d0) + call readi(controlcard,'NC_REQ',nc_req_setf(j,1),0) + call readi(controlcard,'RMS',irms(j,1),0) + call readi(controlcard,'LOCAL',iloc(j),1) + call readi(controlcard,'ELCONT',ielecont(j,1),1) + if (ielecont(j,1).eq.0) then + call readi(controlcard,'SCCONT',isccont(j,1),1) + endif + ang_cut(j)=ang_cut(j)*deg2rad + ang_cut1(j)=ang_cut1(j)*deg2rad + do k=1,npiece(j,1) + call card_concat(controlcard,.true.) + call readi(controlcard,'IFRAG1',ifrag(1,k,j),0) + call readi(controlcard,'IFRAG2',ifrag(2,k,j),0) + enddo + write(iout,*)"j",j," npiece",npiece(j,1)," ifrag", + & (ifrag(1,k,j),ifrag(2,k,j), + & k=1,npiece(j,1))," ang_cut",ang_cut(j)*rad2deg, + & " ang_cut1",ang_cut1(j)*rad2deg + write(iout,*)"n_shift",n_shift(1,j,1),n_shift(2,j,1) + write(iout,*)"nc_frac",nc_fragm(j,1)," nc_req",nc_req_setf(j,1) + write(iout,*)"irms",irms(j,1)," ielecont",ielecont(j,1), + & " ilocal",iloc(j)," isccont",isccont(j,1) + enddo +c Read data pertaning to higher levels + do i=2,nlevel + call card_concat(controlcard,.true.) + call readi(controlcard,'NFRAG',NFRAG(i),0) + write (iout,*) "i",i," nfrag",nfrag(i) + do j=1,nfrag(i) + call card_concat(controlcard,.true.) + if (i.eq.2) then + call readi(controlcard,'ELCONT',ielecont(j,i),0) + if (ielecont(j,i).eq.0) then + call readi(controlcard,'SCCONT',isccont(j,i),1) + endif + call readi(controlcard,'RMS',irms(j,i),0) + else + ielecont(j,i)=0 + isccont(j,i)=0 + irms(j,i)=1 + endif + call readi(controlcard,'NPIECE',npiece(j,i),0) + call readi(controlcard,'N_SHIFT1',n_shift(1,j,i),0) + call readi(controlcard,'N_SHIFT2',n_shift(2,j,i),0) + call multreadi(controlcard,'IPIECE',ipiece(1,j,i), + & npiece(j,i),0) + call reada(controlcard,'NC_FRAC',nc_fragm(j,i),0.5d0) + call readi(controlcard,'NC_REQ',nc_req_setf(j,i),0) + write(iout,*) "j",j," npiece",npiece(j,i)," n_shift", + & n_shift(1,j,i),n_shift(2,j,i)," ielecont",ielecont(j,i), + & " isccont",isccont(j,i)," irms",irms(j,i) + write(iout,*) "ipiece",(ipiece(k,j,i),k=1,npiece(j,i)) + write(iout,*)"n_shift",n_shift(1,j,i),n_shift(2,j,i) + write(iout,*)"nc_frac",nc_fragm(j,i), + & " nc_req",nc_req_setf(j,i) + enddo + enddo + if (binary) write (iout,*) "Classes written in binary format." + return + 121 continue + call reada(controlcard,'ANGCUT_HEL',angcut_hel,50.0d0) + call reada(controlcard,'MAXANG_HEL',angcut1_hel,60.0d0) + call reada(controlcard,'ANGCUT_BET',angcut_bet,90.0d0) + call reada(controlcard,'MAXANG_BET',angcut1_bet,360.0d0) + call reada(controlcard,'ANGCUT_STRAND',angcut_strand,90.0d0) + call reada(controlcard,'MAXANG_STRAND',angcut1_strand,60.0d0) + call reada(controlcard,'FRAC_MIN',frac_min_set,0.666666d0) + call reada(controlcard,'NC_FRAC_HEL',ncfrac_hel,0.5d0) + call readi(controlcard,'NC_REQ_HEL',ncreq_hel,0) + call reada(controlcard,'NC_FRAC_BET',ncfrac_bet,0.5d0) + call reada(controlcard,'NC_FRAC_PAIR',ncfrac_pair,0.3d0) + call readi(controlcard,'NC_REQ_BET',ncreq_bet,0) + call readi(controlcard,'NC_REQ_PAIR',ncreq_pair,0) + call readi(controlcard,'NSHIFT_HEL',nshift_hel,3) + call readi(controlcard,'NSHIFT_BET',nshift_bet,3) + call readi(controlcard,'NSHIFT_STRAND',nshift_strand,3) + call readi(controlcard,'NSHIFT_PAIR',nshift_pair,3) + call readi(controlcard,'RMS_SINGLE',irms_single,0) + call readi(controlcard,'CONT_SINGLE',icont_single,1) + call readi(controlcard,'LOCAL_SINGLE',iloc_single,1) + call readi(controlcard,'RMS_PAIR',irms_pair,0) + call readi(controlcard,'CONT_PAIR',icont_pair,1) + call readi(controlcard,'SPLIT_BET',isplit_bet,0) + angcut_hel=angcut_hel*deg2rad + angcut1_hel=angcut1_hel*deg2rad + angcut_bet=angcut_bet*deg2rad + angcut1_bet=angcut1_bet*deg2rad + angcut_strand=angcut_strand*deg2rad + angcut1_strand=angcut1_strand*deg2rad + write (iout,*) "Automatic detection of structural elements" + write (iout,*) 'NC_FRAC_HEL',ncfrac_hel,' NC_REQ_HEL',ncreq_hel, + & ' NC_FRAC_BET',ncfrac_bet,' NC_REQ_BET',ncreq_bet, + & ' RMS_SINGLE',irms_single,' CONT_SINGLE',icont_single, + & ' NC_FRAC_PAIR',ncfrac_pair,' NC_REQ_PAIR',ncreq_pair, + & ' RMS_PAIR',irms_pair,' CONT_PAIR',icont_pair, + & ' SPLIT_BET',isplit_bet + write (iout,*) 'NSHIFT_HEL',nshift_hel,' NSHIFT_BET',nshift_bet, + & ' NSHIFT_STRAND',nshift_strand,' NSHIFT_PAIR',nshift_pair + write (iout,*) 'ANGCUT_HEL',angcut_hel*rad2deg, + & ' MAXANG_HEL',angcut1_hel*rad2deg + write (iout,*) 'ANGCUT_BET',angcut_bet*rad2deg, + & ' MAXANG_BET',angcut1_bet*rad2deg + write (iout,*) 'ANGCUT_STRAND',angcut_strand*rad2deg, + & ' MAXANG_STRAND',angcut1_strand*rad2deg + write (iout,*) 'FRAC_MIN',frac_min_set + return + end diff --git a/source/wham/src-NEWSC/rescode.f b/source/wham/src-NEWSC/rescode.f new file mode 100755 index 0000000..b516fed --- /dev/null +++ b/source/wham/src-NEWSC/rescode.f @@ -0,0 +1,32 @@ + integer function rescode(iseq,nam,itype) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + 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/wham/src-NEWSC/rmscalc.f b/source/wham/src-NEWSC/rmscalc.f new file mode 100755 index 0000000..70d9425 --- /dev/null +++ b/source/wham/src-NEWSC/rmscalc.f @@ -0,0 +1,156 @@ + double precision function rmscalc(ishif,i,j,jcon,lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + double precision przes(3),obrot(3,3) + double precision creff(3,maxres2),cc(3,maxres2) + logical iadded(maxres) + integer inumber(2,maxres) + common /ccc/ creff,cc,iadded,inumber + logical lprn + logical non_conv + integer ishif,i,j + if (lprn) then + write (iout,*) "i",i," j",j," jcont",jcon," ishif",ishif + write (iout,*) "npiece",npiece(j,i) + endif + ii=0 + do l=1,nres + iadded(l)=.false. + enddo + do k=1,npiece(j,i) + if (i.eq.1) then + if (lprn) + & write (iout,*) "Level 1: j=",j,"k=",k," adding fragment", + & ifrag(1,k,j),ifrag(2,k,j) + call cprep(ifrag(1,k,j),ifrag(2,k,j),ishif,ii) +c write (iout,*) "ii=",ii + else + kk = ipiece(k,j,i) +c write (iout,*) "kk",kk," npiece",npiece(kk,1) + do l=1,npiece(kk,1) + if (lprn) + & write (iout,*) "Level",i,": j=",j,"k=",k," kk=",kk, + & " l=",l," adding fragment", + & ifrag(1,l,kk),ifrag(2,l,kk) + call cprep(ifrag(1,l,kk),ifrag(2,l,kk),ishif,ii) + enddo + endif + enddo + if (lprn) then + do k=1,ii + write(iout,'(5i4,2(3f10.5,5x))') i,j,k,inumber(1,k), + & inumber(2,k),(creff(l,k),l=1,3),(cc(l,k),l=1,3) + enddo + endif + call fitsq(rms,cc(1,1),creff(1,1),ii,przes,obrot,non_conv) + if (non_conv) then + print *,'Error: FITSQ non-convergent, jcon',jcon + rmscalc=1.0d2 + else if (rms.lt.-1.0d-6) then + print *,'Error: rms^2 = ',rms,jcon + rmscalc = 1.0d2 + else if (rms.ge.1.0d-6 .and. rms.lt.0) then + rmscalc=0.0d0 + else + rmscalc = dsqrt(rms) + endif + return + end +c------------------------------------------------------------------------- + subroutine cprep(if1,if2,ishif,ii) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + double precision przes(3),obrot(3,3) + double precision creff(3,maxres2),cc(3,maxres2) + logical iadded(maxres) + integer inumber(2,maxres) + common /ccc/ creff,cc,iadded,inumber +c write (iout,*) "Calling cprep" + do l=if1,if2 +c write (iout,*) "l",l," iadded",iadded(l) + if (l+ishif.gt.1 .and. l+ishif.le.nres .and. .not.iadded(l)) + & then + ii=ii+1 + iadded(l)=.true. + inumber(1,ii)=l + inumber(2,ii)=l+ishif + do m=1,3 + creff(m,ii)=cref(m,l) + cc(m,ii)=c(m,l+ishif) + enddo + endif + enddo + return + end +c------------------------------------------------------------------------- + double precision function rmsnat(jcon) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + double precision przes(3),obrot(3,3) + logical non_conv + integer ishif,i,j + call fitsq(rms,c(1,nstart_sup),cref(1,nstart_sup),nsup, + & przes,obrot,non_conv) + if (non_conv) then + print *,'Error: FITSQ non-convergent, jcon',jcon + rmsnat=1.0d2 + else if (rms.lt.-1.0d-6) then + print *,'Error: rms^2 = ',rms,jcon + rmsnat = 1.0d2 + else if (rms.ge.1.0d-6 .and. rms.lt.0) then + rmsnat=0.0d0 + else + rmsnat = dsqrt(rms) + endif + return + end +c----------------------------------------------------------------------------- + double precision function gyrate(jcon) + 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 = dsqrt(rg/dble(nct-nnt+1)) + return + end diff --git a/source/wham/src-NEWSC/secondary.f b/source/wham/src-NEWSC/secondary.f new file mode 100755 index 0000000..9c9bc7d --- /dev/null +++ b/source/wham/src-NEWSC/secondary.f @@ -0,0 +1,713 @@ + subroutine define_fragments + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.FRAG' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.COMPAR' + include 'COMMON.CHAIN' + include 'COMMON.HEADER' + include 'COMMON.GEO' + include 'COMMON.CONTACTS' + include 'COMMON.PEPTCONT' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + integer nstrand,istrand(2,maxres/2) + integer nhairp,ihairp(2,maxres/5) + character*16 strstr(4) /'helix','hairpin','strand','strand pair'/ + write (iout,*) 'NC_FRAC_HEL',ncfrac_hel,' NC_REQ_HEL',ncreq_hel, + & 'NC_FRAC_BET',ncfrac_bet,' NC_REQ_BET',ncreq_bet, + & 'NC_FRAC_PAIR',ncfrac_pair,' NC_REQ_PAIR',ncreq_pair, + & ' RMS_PAIR',irms_pair,' SPLIT_BET',isplit_bet + write (iout,*) 'NSHIFT_HEL',nshift_hel,' NSHIFT_BET',nshift_bet, + & ' NSHIFT_STRAND',nshift_strand,' NSHIFT_PAIR',nshift_pair + write (iout,*) 'ANGCUT_HEL',angcut_hel*rad2deg, + & ' MAXANG_HEL',angcut1_hel*rad2deg + write (iout,*) 'ANGCUT_BET',angcut_bet*rad2deg, + & ' MAXANG_BET',angcut1_bet*rad2deg + write (iout,*) 'ANGCUT_STRAND',angcut_strand*rad2deg, + & ' MAXANG_STRAND',angcut1_strand*rad2deg + write (iout,*) 'FRAC_MIN',frac_min_set +c Find secondary structure elements (helices and beta-sheets) + call secondary2(.true.,.false.,ncont_pept_ref,icont_pept_ref, + & isec_ref) +c Define primary fragments. First include the helices. + nhairp=0 + nstrand=0 +c Merge helices +c AL 12/23/03 - to avoid splitting helices into very small fragments + if (merge_helices) then + write (iout,*) "Before merging helices: nhfrag",nhfrag + do i=1,nhfrag + write (2,*) hfrag(1,i),hfrag(2,i) + enddo + i=1 + do while (i.lt.nhfrag) + if (hfrag(1,i+1)-hfrag(2,i).le.1) then + nhfrag=nhfrag-1 + hfrag(2,i)=hfrag(2,i+1) + do j=i+1,nhfrag + hfrag(1,j)=hfrag(1,j+1) + hfrag(2,j)=hfrag(2,j+1) + enddo + endif + i=i+1 + enddo + write (iout,*) "After merging helices: nhfrag",nhfrag + do i=1,nhfrag + write (2,*) hfrag(1,i),hfrag(2,i) + enddo + endif + nfrag(1)=nhfrag + do i=1,nhfrag + npiece(i,1)=1 + ifrag(1,1,i)=hfrag(1,i) + ifrag(2,1,i)=hfrag(2,i) + n_shift(1,i,1)=0 + n_shift(2,i,1)=nshift_hel + ang_cut(i)=angcut_hel + ang_cut1(i)=angcut1_hel + frac_min(i)=frac_min_set + nc_fragm(i,1)=ncfrac_hel + nc_req_setf(i,1)=ncreq_hel + istruct(i)=1 + enddo + write (iout,*) "isplit_bet",isplit_bet + if (isplit_bet.gt.1) then +c Split beta-sheets into strands and store strands as primary fragments. + call split_beta(nbfrag,bfrag,nstrand,istrand,nhairp,ihairp) + do i=1,nstrand + ii=i+nfrag(1) + npiece(ii,1)=1 + ifrag(1,1,ii)=istrand(1,i) + ifrag(2,1,ii)=istrand(2,i) + n_shift(1,ii,1)=nshift_strand + n_shift(2,ii,1)=nshift_strand + ang_cut(ii)=angcut_strand + ang_cut1(ii)=angcut1_strand + frac_min(ii)=frac_min_set + nc_fragm(ii,1)=0 + nc_req_setf(ii,1)=0 + istruct(ii)=3 + enddo + nfrag(1)=nfrag(1)+nstrand + else if (isplit_bet.eq.1) then +c Split only far beta-sheets; does not split hairpins. + call find_and_remove_hairpins(nbfrag,bfrag,nhairp,ihairp) + call split_beta(nbfrag,bfrag,nstrand,istrand,nhairp,ihairp) + do i=1,nhairp + ii=i+nfrag(1) + npiece(ii,1)=1 + ifrag(1,1,ii)=ihairp(1,i) + ifrag(2,1,ii)=ihairp(2,i) + n_shift(1,ii,1)=nshift_bet + n_shift(2,ii,1)=nshift_bet + ang_cut(ii)=angcut_bet + ang_cut1(ii)=angcut1_bet + frac_min(ii)=frac_min_set + nc_fragm(ii,1)=ncfrac_bet + nc_req_setf(ii,1)=ncreq_bet + istruct(ii)=2 + enddo + nfrag(1)=nfrag(1)+nhairp + do i=1,nstrand + ii=i+nfrag(1) + npiece(ii,1)=1 + ifrag(1,1,ii)=istrand(1,i) + ifrag(2,1,ii)=istrand(2,i) + n_shift(1,ii,1)=nshift_strand + n_shift(2,ii,1)=nshift_strand + ang_cut(ii)=angcut_strand + ang_cut1(ii)=angcut1_strand + frac_min(ii)=frac_min_set + nc_fragm(ii,1)=0 + nc_req_setf(ii,1)=0 + istruct(ii)=3 + enddo + nfrag(1)=nfrag(1)+nstrand + else +c Do not split beta-sheets; each pair of strands is a primary element. + call find_and_remove_hairpins(nbfrag,bfrag,nhairp,ihairp) + do i=1,nhairp + ii=i+nfrag(1) + npiece(ii,1)=1 + ifrag(1,1,ii)=ihairp(1,i) + ifrag(2,1,ii)=ihairp(2,i) + n_shift(1,ii,1)=nshift_bet + n_shift(2,ii,1)=nshift_bet + ang_cut(ii)=angcut_bet + ang_cut1(ii)=angcut1_bet + frac_min(ii)=frac_min_set + nc_fragm(ii,1)=ncfrac_bet + nc_req_setf(ii,1)=ncreq_bet + istruct(ii)=2 + enddo + nfrag(1)=nfrag(1)+nhairp + do i=1,nbfrag + ii=i+nfrag(1) + npiece(ii,1)=2 + ifrag(1,1,ii)=bfrag(1,i) + ifrag(2,1,ii)=bfrag(2,i) + if (bfrag(3,i).lt.bfrag(4,i)) then + ifrag(1,2,ii)=bfrag(3,i) + ifrag(2,2,ii)=bfrag(4,i) + else + ifrag(1,2,ii)=bfrag(4,i) + ifrag(2,2,ii)=bfrag(3,i) + endif + n_shift(1,ii,1)=nshift_bet + n_shift(2,ii,1)=nshift_bet + ang_cut(ii)=angcut_bet + ang_cut1(ii)=angcut1_bet + frac_min(ii)=frac_min_set + nc_fragm(ii,1)=ncfrac_bet + nc_req_setf(ii,1)=ncreq_bet + istruct(ii)=4 + enddo + nfrag(1)=nfrag(1)+nbfrag + endif + write (iout,*) "The following primary fragments were found:" + write (iout,*) "Helices:",nhfrag + do i=1,nhfrag + i1=ifrag(1,1,i) + i2=ifrag(2,1,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4)') + & i,restyp(it1),i1,restyp(it2),i2 + enddo + write (iout,*) "Hairpins:",nhairp + do i=nhfrag+1,nhfrag+nhairp + i1=ifrag(1,1,i) + i2=ifrag(2,1,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4,2x)') + & i,restyp(it1),i1,restyp(it2),i2 + enddo + write (iout,*) "Far strand pairs:",nbfrag + do i=nhfrag+nhairp+1,nhfrag+nhairp+nbfrag + i1=ifrag(1,1,i) + i2=ifrag(2,1,i) + it1=itype(i1) + it2=itype(i2) + i3=ifrag(1,2,i) + i4=ifrag(2,2,i) + it3=itype(i3) + it4=itype(i4) + write (iout,'(i3,2x,a,i4,2x,a,i4," and ",a,i4,2x,a,i4)') + & i,restyp(it1),i1,restyp(it2),i2, + & restyp(it3),i3,restyp(it4),i4 + enddo + write (iout,*) "Strands:",nstrand + do i=nhfrag+nhairp+nbfrag+1,nfrag(1) + i1=ifrag(1,1,i) + i2=ifrag(2,1,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4)') + & i,restyp(it1),i1,restyp(it2),i2 + enddo + call imysort(nfrag(1),2,maxpiece,ifrag(1,1,1),npiece(1,1), + & istruct(1),n_shift(1,1,1),ang_cut(1),ang_cut1(1),frac_min(1), + & nc_fragm(1,1),nc_req_setf(1,1)) + write (iout,*) "Fragments after sorting:" + do i=1,nfrag(1) + i1=ifrag(1,1,i) + i2=ifrag(2,1,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4,$)') + & i,restyp(it1),i1,restyp(it2),i2 + if (npiece(i,1).eq.1) then + write (iout,'(2x,a)') strstr(istruct(i)) + else + i1=ifrag(1,2,i) + i2=ifrag(2,2,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(2x,a,i4,2x,a,i4,2x,a)') + & restyp(it1),i1,restyp(it2),i2,strstr(istruct(i)) + endif + enddo + return + end +c------------------------------------------------------------------------------ + subroutine find_and_remove_hairpins(nbfrag,bfrag,nhairp,ihairp) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + integer nbfrag,bfrag(4,maxres/3) + integer nhairp,ihairp(2,maxres/5) + write (iout,*) "Entered find_and_remove_hairpins" + write (iout,*) "nbfrag",nbfrag + do i=1,nbfrag + write (iout,*) i,(bfrag(k,i),k=1,4) + enddo + nhairp=0 + i=1 + do while (i.le.nbfrag) + write (iout,*) "check hairpin:",i,(bfrag(j,i),j=1,4) + if (bfrag(3,i).gt.bfrag(4,i) .and. bfrag(4,i)-bfrag(2,i).lt.5) + & then + write (iout,*) "Found hairpin:",i,bfrag(1,i),bfrag(3,i) + nhairp=nhairp+1 + ihairp(1,nhairp)=bfrag(1,i) + ihairp(2,nhairp)=bfrag(3,i) + nbfrag=nbfrag-1 + do j=i,nbfrag + do k=1,4 + bfrag(k,j)=bfrag(k,j+1) + enddo + enddo + else + i=i+1 + endif + enddo + write (iout,*) "After finding hairpins:" + write (iout,*) "nhairp",nhairp + do i=1,nhairp + write (iout,*) i,ihairp(1,i),ihairp(2,i) + enddo + write (iout,*) "nbfrag",nbfrag + do i=1,nbfrag + write (iout,*) i,(bfrag(k,i),k=1,4) + enddo + return + end +c------------------------------------------------------------------------------ + subroutine split_beta(nbfrag,bfrag,nstrand,istrand,nhairp,ihairp) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + integer nbfrag,bfrag(4,maxres/3) + integer nstrand,istrand(2,maxres/2) + integer nhairp,ihairp(2,maxres/5) + logical found + write (iout,*) "Entered split_beta" + write (iout,*) "nbfrag",nbfrag + do i=1,nbfrag + write (iout,*) i,(bfrag(k,i),k=1,4) + enddo + nstrand=0 + do i=1,nbfrag + write (iout,*) "calling add_strand:",i,bfrag(1,i),bfrag(2,i) + call add_strand(nstrand,istrand,nhairp,ihairp, + & bfrag(1,i),bfrag(2,i),found) + if (bfrag(3,i).lt.bfrag(4,i)) then + write (iout,*) "calling add_strand:",i,bfrag(3,i),bfrag(4,i) + call add_strand(nstrand,istrand,nhairp,ihairp, + & bfrag(3,i),bfrag(4,i),found) + else + write (iout,*) "calling add_strand:",i,bfrag(4,i),bfrag(3,i) + call add_strand(nstrand,istrand,nhairp,ihairp, + & bfrag(4,i),bfrag(3,i),found) + endif + enddo + nbfrag=0 + write (iout,*) "Strands found:",nstrand + do i=1,nstrand + write (iout,*) i,istrand(1,i),istrand(2,i) + enddo + return + end +c------------------------------------------------------------------------------ + subroutine add_strand(nstrand,istrand,nhairp,ihairp,is1,is2,found) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'COMMON.IOUNITS' + integer nstrand,istrand(2,maxres/2) + integer nhairp,ihairp(2,maxres/5) + logical found + found=.false. + do j=1,nhairp + idelt=(ihairp(2,j)-ihairp(1,j))/6 + if (is1.lt.ihairp(2,j)-idelt.and.is2.gt.ihairp(1,j)+idelt) then + write (iout,*) "strand",is1,is2," is part of hairpin", + & ihairp(1,j),ihairp(2,j) + return + endif + enddo + do j=1,nstrand + idelt=(istrand(2,j)-istrand(1,j))/3 + if (is1.lt.istrand(2,j)-idelt.and.is2.gt.istrand(1,j)+idelt) + & then +c The strand already exists in the array; update its ends if necessary. + write (iout,*) "strand",is1,is2," found at position",j, + & ":",istrand(1,j),istrand(2,j) + istrand(1,j)=min0(istrand(1,j),is1) + istrand(2,j)=max0(istrand(2,j),is2) + return + endif + enddo +c The strand has not been found; add it to the array. + write (iout,*) "strand",is1,is2," added to the array." + found=.true. + nstrand=nstrand+1 + istrand(1,nstrand)=is1 + istrand(2,nstrand)=is2 + return + end +c------------------------------------------------------------------------------ + subroutine secondary2(lprint,lprint_sec,ncont,icont,isecstr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' + include 'COMMON.FRAG' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + integer ncont,icont(2,maxcont),isec(maxres,4),nsec(maxres), + & isecstr(maxres) + logical lprint,lprint_sec,not_done,freeres + double precision p1,p2 + external freeres + character*1 csec(0:2) /'-','E','H'/ + if (lprint) then + write (iout,*) "entered secondary2",ncont + write (iout,*) "nstart_sup",nstart_sup," nend_sup",nend_sup + do i=1,ncont + write (iout,*) icont(1,i),icont(2,i) + enddo + endif + do i=1,nres + isecstr(i)=0 + enddo + nbfrag=0 + nhfrag=0 + do i=1,nres + isec(i,1)=0 + isec(i,2)=0 + nsec(i)=0 + enddo + +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 (i1.ge.nstart_sup .and. i1.le.nend_sup + & .and. j1.gt.nstart_sup .and. j1.le.nend_sup) then +cd write (iout,*) "parallel",i1,j1 + 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_sec) 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 + endif ! i1.ge.nstart_sup .and. i1.le.nend_sup .and. i2.gt.nstart_sup .and. i2.le.nend_sup + 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 (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) then + isec(ij,nsec(ij))=nbeta + endif + enddo + + + if (lprint_sec) 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 + +cd write (iout,*) "After beta:",nbfrag +cd do i=1,nbfrag +cd write (iout,*) (bfrag(j,i),j=1,4) +cd enddo + + if (nstrand.gt.0.and.lprint_sec) 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) + 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.4) 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_sec) 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_sec) 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_sec) then + write(12,'(a37)') "DefPropRes 'coil' '! (helix | sheet)'" + write(12,'(a20)') "XMacStand ribbon.mac" + endif + + if (lprint) then + + 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 + + do j=1,nbfrag + do k=min0(bfrag(1,j),bfrag(2,j)),max0(bfrag(1,j),bfrag(2,j)) + isecstr(k)=1 + enddo + do k=min0(bfrag(3,j),bfrag(4,j)),max0(bfrag(3,j),bfrag(4,j)) + isecstr(k)=1 + enddo + enddo + do j=1,nhfrag + do k=hfrag(1,j),hfrag(2,j) + isecstr(k)=2 + enddo + enddo + if (lprint) then + write (iout,*) + write (iout,*) "Secondary structure" + do i=1,nres,80 + ist=i + ien=min0(i+79,nres) + write (iout,*) + write (iout,'(8(7x,i3))') (k,k=ist+9,ien,10) + write (iout,'(80a1)') (onelet(itype(k)),k=ist,ien) + write (iout,'(80a1)') (csec(isecstr(k)),k=ist,ien) + enddo + write (iout,*) + endif + return + end +c------------------------------------------------- + logical function freeres(i,j,nsec,isec) + include 'DIMENSIONS' + integer isec(maxres,4),nsec(maxres) + freeres=.false. + + 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/wham/src-NEWSC/setup_var.f b/source/wham/src-NEWSC/setup_var.f new file mode 100755 index 0000000..f052400 --- /dev/null +++ b/source/wham/src-NEWSC/setup_var.f @@ -0,0 +1,31 @@ + subroutine setup_var + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' +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 diff --git a/source/wham/src-NEWSC/slices.F b/source/wham/src-NEWSC/slices.F new file mode 100755 index 0000000..b22ea13 --- /dev/null +++ b/source/wham/src-NEWSC/slices.F @@ -0,0 +1,80 @@ + subroutine set_slices(is,ie,ts,te,iR,ib,iparm) + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.FREE' + include 'COMMON.IOUNITS' + include 'COMMON.PROTFILES' + include 'COMMON.OBCINKA' + include 'COMMON.PROT' + integer islice,iR,ib,iparm + integer is(MaxSlice),ie(MaxSlice),nrec_slice + double precision ts(MaxSlice),te(MaxSlice),time_slice + + do islice=1,nslice + if (time_end_collect(iR,ib,iparm).ge.1.0d10) then + ts(islice)=time_start_collect(iR,ib,iparm) + te(islice)=time_end_collect(iR,ib,iparm) + nrec_slice=(rec_end(iR,ib,iparm)- + & rec_start(iR,ib,iparm)+1)/nslice + is(islice)=rec_start(iR,ib,iparm)+(islice-1)*nrec_slice + ie(islice)=rec_start(iR,ib,iparm)+islice*nrec_slice-1 + else + time_slice=(time_end_collect(iR,ib,iparm) + & -time_start_collect(iR,ib,iparm))/nslice + ts(islice)=time_start_collect(iR,ib,iparm)+(islice-1)* + & time_slice + te(islice)=time_start_collect(iR,ib,iparm)+islice*time_slice + is(islice)=rec_start(iR,ib,iparm) + ie(islice)=rec_end(iR,ib,iparm) + endif + enddo + + write (iout,*) "nrec_slice",nrec_slice," time_slice",time_slice + write (iout,*) "is",(is(islice),islice=1,nslice) + write (iout,*) "ie",(ie(islice),islice=1,nslice) + write (iout,*) "rec_start", + & rec_start(iR,ib,iparm)," rec_end",rec_end(iR,ib,iparm) + write (iout,*) "ts",(ts(islice),islice=1,nslice) + write (iout,*) "te",(te(islice),islice=1,nslice) + write (iout,*) "time_start", + & time_start_collect(iR,ib,iparm)," time_end", + & time_end_collect(iR,ib,iparm) + call flush(iout) + + return + end +c----------------------------------------------------------------------------- + integer function slice(irecord,time,is,ie,ts,te) + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.FREE' + include 'COMMON.IOUNITS' + include 'COMMON.PROTFILES' + include 'COMMON.OBCINKA' + include 'COMMON.PROT' + integer is(MaxSlice),ie(MaxSlice),nrec_slice + double precision ts(MaxSlice),te(MaxSlice),time_slice + integer i,ii,irecord + double precision time + +c write (iout,*) "within slice nslice",nslice +c call flush(iout) + if (irecord.lt.is(1) .or. time.lt.ts(1)) then + ii=0 + else + ii=1 + do while (ii.le.nslice .and. + & (irecord.lt.is(ii) .or. irecord.gt.ie(ii) .or. + & time.lt.ts(ii) .or. time.gt.te(ii)) ) +c write (iout,*) "ii",ii,time,ts(ii) +c call flush(iout) + ii=ii+1 + enddo + endif +c write (iout,*) "end: ii",ii +c call flush(iout) + slice=ii + return + end diff --git a/source/wham/src-NEWSC/store_parm.F b/source/wham/src-NEWSC/store_parm.F new file mode 100755 index 0000000..0ededff --- /dev/null +++ b/source/wham/src-NEWSC/store_parm.F @@ -0,0 +1,547 @@ + subroutine store_parm(iparm) +C +C Store parameters of set IPARM +C valence angles and the side chains and energy parameters. +C + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.FREE' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + include 'COMMON.SBRIDGE' + include 'COMMON.SCROT' + include 'COMMON.SCCOR' + include 'COMMON.ALLPARM' + integer i,j,k,l,m,mm,iparm + +c Store weights + ww_all(1,iparm)=wsc + ww_all(2,iparm)=wscp + ww_all(3,iparm)=welec + ww_all(4,iparm)=wcorr + ww_all(5,iparm)=wcorr5 + ww_all(6,iparm)=wcorr6 + ww_all(7,iparm)=wel_loc + ww_all(8,iparm)=wturn3 + ww_all(9,iparm)=wturn4 + ww_all(10,iparm)=wturn6 + ww_all(11,iparm)=wang + ww_all(12,iparm)=wscloc + ww_all(13,iparm)=wtor + ww_all(14,iparm)=wtor_d + ww_all(15,iparm)=wstrain + ww_all(16,iparm)=wvdwpp + ww_all(17,iparm)=wbond + ww_all(19,iparm)=wsccor +c Store bond parameters + vbldp0_all(iparm)=vbldp0 + akp_all(iparm)=akp + do i=1,ntyp + nbondterm_all(i,iparm)=nbondterm(i) + do j=1,nbondterm(i) + vbldsc0_all(j,i,iparm)=vbldsc0(j,i) + aksc_all(j,i,iparm)=aksc(j,i) + abond0_all(j,i,iparm)=abond0(j,i) + enddo + enddo +c Store bond angle parameters +#ifdef CRYST_THETA + do i=1,ntyp + a0thet_all(i,iparm)=a0thet(i) + do j=1,2 + athet_all(j,i,iparm)=athet(j,i) + bthet_all(j,i,iparm)=bthet(j,i) + enddo + do j=0,3 + polthet_all(j,i,iparm)=polthet(j,i) + enddo + do j=1,3 + gthet_all(j,i,iparm)=gthet(j,i) + enddo + theta0_all(i,iparm)=theta0(i) + sig0_all(i,iparm)=sig0(i) + sigc0_all(i,iparm)=sigc0(i) + enddo +#else + nthetyp_all(iparm)=nthetyp + ntheterm_all(iparm)=ntheterm + ntheterm2_all(iparm)=ntheterm2 + ntheterm3_all(iparm)=ntheterm3 + nsingle_all(iparm)=nsingle + ndouble_all(iparm)=ndouble + nntheterm_all(iparm)=nntheterm + do i=1,ntyp1 + ithetyp_all(i,iparm)=ithetyp(i) + enddo + do i=1,maxthetyp1 + do j=1,maxthetyp1 + do k=1,maxthetyp1 + aa0thet_all(i,j,k,iparm)=aa0thet(i,j,k) + do l=1,ntheterm + aathet_all(l,i,j,k,iparm)=aathet(l,i,j,k) + enddo + do l=1,ntheterm2 + do m=1,nsingle + bbthet_all(m,l,i,j,k,iparm)=bbthet(m,l,i,j,k) + ccthet_all(m,l,i,j,k,iparm)=ccthet(m,l,i,j,k) + ddthet_all(m,l,i,j,k,iparm)=ddthet(m,l,i,j,k) + eethet_all(m,l,i,j,k,iparm)=eethet(m,l,i,j,k) + enddo + enddo + do l=1,ntheterm3 + do m=1,ndouble + do mm=1,ndouble + ffthet_all(mm,m,l,i,j,k,iparm)=ffthet(mm,m,l,i,j,k) + ggthet_all(mm,m,l,i,j,k,iparm)=ggthet(mm,m,l,i,j,k) + enddo + enddo + enddo + enddo + enddo + enddo +#endif +#ifdef CRYST_SC +c Store the sidechain rotamer parameters + do i=1,ntyp + nlob_all(i,iparm)=nlob(i) + do j=1,nlob(i) + bsc_all(j,i,iparm)=bsc(j,i) + do k=1,3 + censc_all(k,j,i,iparm)=censc(k,j,i) + enddo + do k=1,3 + do l=1,3 + gaussc_all(l,k,j,i,iparm)=gaussc(l,k,j,i) + enddo + enddo + enddo + enddo +#else + do i=1,ntyp + do j=1,65 + sc_parmin_all(j,i,iparm)=sc_parmin(j,i) + enddo + enddo +#endif +c Store the torsional parameters + do i=1,ntortyp + do j=1,ntortyp + v0_all(i,j,iparm)=v0(i,j) + nterm_all(i,j,iparm)=nterm(i,j) + nlor_all(i,j,iparm)=nlor(i,j) + do k=1,nterm(i,j) + v1_all(k,i,j,iparm)=v1(k,i,j) + v2_all(k,i,j,iparm)=v2(i,i,j) + enddo + do k=1,nlor(i,j) + vlor1_all(k,i,j,iparm)=vlor1(k,i,j) + vlor2_all(k,i,j,iparm)=vlor2(k,i,j) + vlor3_all(k,i,j,iparm)=vlor3(k,i,j) + enddo + enddo + enddo +c Store the double torsional parameters + do i=1,ntortyp + do j=1,ntortyp + do k=1,ntortyp + ntermd1_all(i,j,k,iparm)=ntermd_1(i,j,k) + ntermd2_all(i,j,k,iparm)=ntermd_2(i,j,k) + do l=1,ntermd_1(i,j,k) + v1c_all(1,l,i,j,k,iparm)=v1c(1,l,i,j,k) + v1c_all(2,l,i,j,k,iparm)=v1c(2,l,i,j,k) + v2c_all(1,l,i,j,k,iparm)=v2c(1,l,i,j,k) + v2c_all(2,l,i,j,k,iparm)=v2c(2,l,i,j,k) + enddo + do l=1,ntermd_2(i,j,k) + do m=1,ntermd_2(i,j,k) + v2s_all(l,m,i,j,k,iparm)=v2s(l,m,i,j,k) + enddo + enddo + enddo + enddo + enddo +c Store parameters of the cumulants + do i=1,nloctyp + do j=1,2 + b1_all(j,i,iparm)=b1(j,i) + b1tilde_all(j,i,iparm)=b1tilde(j,i) + b2_all(j,i,iparm)=b2(j,i) + enddo + do j=1,2 + do k=1,2 + cc_all(k,j,i,iparm)=cc(k,j,i) + ctilde_all(k,j,i,iparm)=ctilde(k,j,i) + dd_all(k,j,i,iparm)=dd(k,j,i) + dtilde_all(k,j,i,iparm)=dtilde(k,j,i) + ee_all(k,j,i,iparm)=ee(k,j,i) + enddo + enddo + enddo +c Store the parameters of electrostatic interactions + do i=1,2 + do j=1,2 + app_all(j,i,iparm)=app(j,i) + bpp_all(j,i,iparm)=bpp(j,i) + ael6_all(j,i,iparm)=ael6(j,i) + ael3_all(j,i,iparm)=ael3(j,i) + enddo + enddo +c Store sidechain parameters + do i=1,ntyp + do j=1,ntyp + aa_all(j,i,iparm)=aa(j,i) + bb_all(j,i,iparm)=bb(j,i) + r0_all(j,i,iparm)=r0(j,i) + sigma_all(j,i,iparm)=sigma(j,i) + chi_all(j,i,iparm)=chi(j,i) + chipp_all(j,i,iparm)=chipp(j,i) + augm_all(j,i,iparm)=augm(j,i) + eps_all(j,i,iparm)=eps(j,i) + sigmap1_all(j,i,iparm)=sigmap1(j,i) + sigmap2_all(j,i,iparm)=sigmap2(j,i) + chis_all(j,i,iparm)=chis(j,i) + do k=1,4 + alphasur_all(k,j,i,iparm)=alphasur(k,j,i) + wstate_all(k,j,i,iparm)=wstate(k,j,i) + enddo + nstate_all(j,i,iparm)=nstate(j,i) + do k=1,2 + do l=1,2 + dhead_all(l,k,j,i,iparm)=dhead(l,k,j,i) + enddo + enddo + do k=1,2 + dtail_all(k,j,i,iparm)=dtail(k,j,i) + enddo + epshead_all(j,i,iparm)=epshead(j,i) + rborn_all(j,i,iparm)=rborn(j,i) + do k=1,2 + wqdip_all(k,j,i,iparm)=wqdip(k,j,i) + enddo + wquad_all(j,i,iparm)=wquad(j,i) + alphapol_all(j,i,iparm)=alphapol(j,i) + do k=1,4 + alphiso_all(k,j,i,iparm)=alphiso(k,j,i) + enddo + sigiso1_all(j,i,iparm)=sigiso1(j,i) + sigiso2_all(j,i,iparm)=sigiso2(j,i) + epsintab_all(j,i,iparm)=epsintab(j,i) + enddo + enddo + do i=1,ntyp + chip_all(i,iparm)=chip(i) + alp_all(i,iparm)=alp(i) + enddo +c Store the SCp parameters + do i=1,ntyp + do j=1,2 + aad_all(i,j,iparm)=aad(i,j) + bad_all(i,j,iparm)=bad(i,j) + enddo + enddo +c Store disulfide-bond parameters + ebr_all(iparm)=ebr + d0cm_all(iparm)=d0cm + akcm_all(iparm)=akcm + akth_all(iparm)=akth + akct_all(iparm)=akct + v1ss_all(iparm)=v1ss + v2ss_all(iparm)=v2ss + v3ss_all(iparm)=v3ss +c Store SC-backbone correlation parameters + do i=1,nsccortyp + do j=1,nsccortyp + + nterm_sccor_all(j,i,iparm)=nterm_sccor(j,i) + do l=1,3 + do k=1,nterm_sccor(j,i) + v1sccor_all(k,l,j,i,iparm)=v1sccor(k,l,j,i) + v2sccor_all(k,l,j,i,iparm)=v2sccor(k,l,j,i) + enddo + enddo + enddo + enddo + return + end +c-------------------------------------------------------------------------- + subroutine restore_parm(iparm) +C +C Store parameters of set IPARM +C valence angles and the side chains and energy parameters. +C + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.FREE' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + include 'COMMON.SBRIDGE' + include 'COMMON.SCROT' + include 'COMMON.SCCOR' + include 'COMMON.ALLPARM' + integer i,j,k,l,m,mm,iparm + +c Restore weights + wsc=ww_all(1,iparm) + wscp=ww_all(2,iparm) + welec=ww_all(3,iparm) + wcorr=ww_all(4,iparm) + wcorr5=ww_all(5,iparm) + wcorr6=ww_all(6,iparm) + wel_loc=ww_all(7,iparm) + wturn3=ww_all(8,iparm) + wturn4=ww_all(9,iparm) + wturn6=ww_all(10,iparm) + wang=ww_all(11,iparm) + wscloc=ww_all(12,iparm) + wtor=ww_all(13,iparm) + wtor_d=ww_all(14,iparm) + wstrain=ww_all(15,iparm) + wvdwpp=ww_all(16,iparm) + wbond=ww_all(17,iparm) + wsccor=ww_all(19,iparm) +c Restore bond parameters + vbldp0=vbldp0_all(iparm) + akp=akp_all(iparm) + do i=1,ntyp + nbondterm(i)=nbondterm_all(i,iparm) + do j=1,nbondterm(i) + vbldsc0(j,i)=vbldsc0_all(j,i,iparm) + aksc(j,i)=aksc_all(j,i,iparm) + abond0(j,i)=abond0_all(j,i,iparm) + enddo + enddo +c Restore bond angle parameters +#ifdef CRYST_THETA + do i=1,ntyp + a0thet(i)=a0thet_all(i,iparm) + do j=1,2 + athet(j,i)=athet_all(j,i,iparm) + bthet(j,i)=bthet_all(j,i,iparm) + enddo + do j=0,3 + polthet(j,i)=polthet_all(j,i,iparm) + enddo + do j=1,3 + gthet(j,i)=gthet_all(j,i,iparm) + enddo + theta0(i)=theta0_all(i,iparm) + sig0(i)=sig0_all(i,iparm) + sigc0(i)=sigc0_all(i,iparm) + enddo +#else + nthetyp=nthetyp_all(iparm) + ntheterm=ntheterm_all(iparm) + ntheterm2=ntheterm2_all(iparm) + ntheterm3=ntheterm3_all(iparm) + nsingle=nsingle_all(iparm) + ndouble=ndouble_all(iparm) + nntheterm=nntheterm_all(iparm) + do i=1,ntyp1 + ithetyp(i)=ithetyp_all(i,iparm) + enddo + do i=1,maxthetyp1 + do j=1,maxthetyp1 + do k=1,maxthetyp1 + aa0thet(i,j,k)=aa0thet_all(i,j,k,iparm) + do l=1,ntheterm + aathet(l,i,j,k)=aathet_all(l,i,j,k,iparm) + enddo + do l=1,ntheterm2 + do m=1,nsingle + bbthet(m,l,i,j,k)=bbthet_all(m,l,i,j,k,iparm) + ccthet(m,l,i,j,k)=ccthet_all(m,l,i,j,k,iparm) + ddthet(m,l,i,j,k)=ddthet_all(m,l,i,j,k,iparm) + eethet(m,l,i,j,k)=eethet_all(m,l,i,j,k,iparm) + enddo + enddo + do l=1,ntheterm3 + do m=1,ndouble + do mm=1,ndouble + ffthet(mm,m,l,i,j,k)=ffthet_all(mm,m,l,i,j,k,iparm) + ggthet(mm,m,l,i,j,k)=ggthet_all(mm,m,l,i,j,k,iparm) + enddo + enddo + enddo + enddo + enddo + enddo +#endif +c Restore the sidechain rotamer parameters +#ifdef CRYST_SC + do i=1,ntyp + nlob(i)=nlob_all(i,iparm) + do j=1,nlob(i) + bsc(j,i)=bsc_all(j,i,iparm) + do k=1,3 + censc(k,j,i)=censc_all(k,j,i,iparm) + enddo + do k=1,3 + do l=1,3 + gaussc(l,k,j,i)=gaussc_all(l,k,j,i,iparm) + enddo + enddo + enddo + enddo +#else + do i=1,ntyp + do j=1,65 + sc_parmin(j,i)=sc_parmin_all(j,i,iparm) + enddo + enddo +#endif +c Restore the torsional parameters + do i=1,ntortyp + do j=1,ntortyp + v0(i,j)=v0_all(i,j,iparm) + nterm(i,j)=nterm_all(i,j,iparm) + nlor(i,j)=nlor_all(i,j,iparm) + do k=1,nterm(i,j) + v1(k,i,j)=v1_all(k,i,j,iparm) + v2(i,i,j)=v2_all(k,i,j,iparm) + enddo + do k=1,nlor(i,j) + vlor1(k,i,j)=vlor1_all(k,i,j,iparm) + vlor2(k,i,j)=vlor2_all(k,i,j,iparm) + vlor3(k,i,j)=vlor3_all(k,i,j,iparm) + enddo + enddo + enddo +c Restore the double torsional parameters + do i=1,ntortyp + do j=1,ntortyp + do k=1,ntortyp + ntermd_1(i,j,k)=ntermd1_all(i,j,k,iparm) + ntermd_2(i,j,k)=ntermd2_all(i,j,k,iparm) + do l=1,ntermd_1(i,j,k) + v1c(1,l,i,j,k)=v1c_all(1,l,i,j,k,iparm) + v1c(2,l,i,j,k)=v1c_all(2,l,i,j,k,iparm) + v2c(1,l,i,j,k)=v2c_all(1,l,i,j,k,iparm) + v2c(2,l,i,j,k)=v2c_all(2,l,i,j,k,iparm) + enddo + do l=1,ntermd_2(i,j,k) + do m=1,ntermd_2(i,j,k) + v2s(l,m,i,j,k)=v2s_all(l,m,i,j,k,iparm) + enddo + enddo + enddo + enddo + enddo +c Restore parameters of the cumulants + do i=1,nloctyp + do j=1,2 + b1(j,i)=b1_all(j,i,iparm) + b1tilde(j,i)=b1tilde_all(j,i,iparm) + b2(j,i)=b2_all(j,i,iparm) + enddo + do j=1,2 + do k=1,2 + cc(k,j,i)=cc_all(k,j,i,iparm) + ctilde(k,j,i)=ctilde_all(k,j,i,iparm) + dd(k,j,i)=dd_all(k,j,i,iparm) + dtilde(k,j,i)=dtilde_all(k,j,i,iparm) + ee(k,j,i)=ee_all(k,j,i,iparm) + enddo + enddo + enddo +c Restore the parameters of electrostatic interactions + do i=1,2 + do j=1,2 + app(j,i)=app_all(j,i,iparm) + bpp(j,i)=bpp_all(j,i,iparm) + ael6(j,i)=ael6_all(j,i,iparm) + ael3(j,i)=ael3_all(j,i,iparm) + enddo + enddo +c Restore sidechain parameters + do i=1,ntyp + do j=1,ntyp + aa(j,i)=aa_all(j,i,iparm) + bb(j,i)=bb_all(j,i,iparm) + r0(j,i)=r0_all(j,i,iparm) + sigma(j,i)=sigma_all(j,i,iparm) + chi(j,i)=chi_all(j,i,iparm) + chipp(j,i)=chipp_all(j,i,iparm) + augm(j,i)=augm_all(j,i,iparm) + eps(j,i)=eps_all(j,i,iparm) + sigmap1(j,i)=sigmap1_all(j,i,iparm) + sigmap2(j,i)=sigmap2_all(j,i,iparm) + chis(j,i)=chis_all(j,i,iparm) + do k=1,4 + alphasur(k,j,i)=alphasur_all(k,j,i,iparm) + wstate(k,j,i)=wstate_all(k,j,i,iparm) + enddo + nstate(j,i)=nstate_all(j,i,iparm) + do k=1,2 + do l=1,2 + dhead(l,k,j,i)=dhead_all(l,k,j,i,iparm) + enddo + enddo + do k=1,2 + dtail(k,j,i)=dtail_all(k,j,i,iparm) + enddo + epshead(j,i)=epshead_all(j,i,iparm) + rborn(j,i)=rborn_all(j,i,iparm) + do k=1,2 + wqdip(k,j,i)=wqdip_all(k,j,i,iparm) + enddo + wquad(j,i)=wquad_all(j,i,iparm) + alphapol(j,i)=alphapol_all(j,i,iparm) + do k=1,4 + alphiso(k,j,i)=alphiso_all(k,j,i,iparm) + enddo + sigiso1(j,i)=sigiso1_all(j,i,iparm) + sigiso2(j,i)=sigiso2_all(j,i,iparm) + epsintab(j,i)=epsintab_all(j,i,iparm) + enddo + enddo + do i=1,ntyp + chip(i)=chip_all(i,iparm) + alp(i)=alp_all(i,iparm) + enddo +c Restore the SCp parameters + do i=1,ntyp + do j=1,2 + aad(i,j)=aad_all(i,j,iparm) + bad(i,j)=bad_all(i,j,iparm) + enddo + enddo +c Restore disulfide-bond parameters + ebr=ebr_all(iparm) + d0cm=d0cm_all(iparm) + akcm=akcm_all(iparm) + akth=akth_all(iparm) + akct=akct_all(iparm) + v1ss=v1ss_all(iparm) + v2ss=v2ss_all(iparm) + v3ss=v3ss_all(iparm) +c Restore SC-backbone correlation parameters + do i=1,nsccortyp + do j=1,nsccortyp + + nterm_sccor(j,i)=nterm_sccor_all(j,i,iparm) +c do i=1,20 +c do j=1,20 + do l=1,3 + do k=1,nterm_sccor(j,i) + v1sccor(k,l,j,i)=v1sccor_all(k,l,j,i,iparm) + v2sccor(k,l,j,i)=v2sccor_all(k,l,j,i,iparm) + enddo + enddo + enddo + enddo + return + end diff --git a/source/wham/src-NEWSC/timing.F b/source/wham/src-NEWSC/timing.F new file mode 100755 index 0000000..1012457 --- /dev/null +++ b/source/wham/src-NEWSC/timing.F @@ -0,0 +1,163 @@ +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' +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() +cd print *,' in SET_TIMERS stime=',stime + return + end +C------------------------------------------------------------------------------ + logical function stopx(nf) +C This function returns .true. in case of time up on the master node. + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + integer nf + logical ovrtim +#ifdef MPI + include 'mpif.h' + include 'COMMON.MPI' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + if (ovrtim()) then +C Finish if time is up. + stopx = .true. + WhatsUp=1 + else if (cutoffviol) then + stopx = .true. + WhatsUp=2 + else + stopx=.false. + endif + return + end +C-------------------------------------------------------------------------- + logical function ovrtim() + implicit none + include 'COMMON.TIME1' + real*8 tcpu,curtim + curtim= tcpu() +c print *,'curtim=',curtim,' timlim=',timlim +C curtim is the current time in seconds. +c ovrtim=(curtim .ge. timlim - safety ) +c ovrtim does not work sometimes and crashes the program ! CHUUUJ ! +c setting always to false + ovrtim=.false. + return + end +************************************************************************** + double precision function tcpu() + implicit none + 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 + 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 + 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 WIN +**************************** +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) + implicit none + include 'COMMON.IOUNITS' + integer ihr,imn,isc + 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 diff --git a/source/wham/src-NEWSC/wham_calc1.F b/source/wham/src-NEWSC/wham_calc1.F new file mode 100755 index 0000000..57a41d3 --- /dev/null +++ b/source/wham/src-NEWSC/wham_calc1.F @@ -0,0 +1,1454 @@ + subroutine WHAM_CALC(islice,*) +! Weighed Histogram Analysis Method (WHAM) code +! Written by A. Liwo based on the work of Kumar et al., +! J.Comput.Chem., 13, 1011 (1992) +! +! 2/1/05 Multiple temperatures allowed. +! 2/2/05 Free energies calculated directly from data points +! acc. to Eq. (21) of Kumar et al.; final histograms also +! constructed based on this equation. +! 2/12/05 Multiple parameter sets included +! +! 2/2/05 Parallel version + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" + integer MaxBinRms,MaxBinRgy + parameter (MaxBinRms=100,MaxBinRgy=100) + integer MaxHdim +c parameter (MaxHdim=200000) + parameter (MaxHdim=100) + integer maxinde + parameter (maxinde=100) +#ifdef MPI + include "mpif.h" + include "COMMON.MPI" + integer ierror,errcode,status(MPI_STATUS_SIZE) +#endif + include "COMMON.CONTROL" + include "COMMON.IOUNITS" + include "COMMON.FREE" + include "COMMON.ENERGIES" + include "COMMON.FFIELD" + include "COMMON.SBRIDGE" + include "COMMON.PROT" + include "COMMON.ENEPS" + integer MaxPoint,MaxPointProc + parameter (MaxPoint=MaxStr, + & MaxPointProc=MaxStr_Proc) + double precision finorm_max,potfac,entmin,entmax,expfac,vf + double precision entfac_min,entfac_min_t + parameter (finorm_max=1.0d0) + integer islice + integer i,ii,j,jj,k,kk,l,m,ind,iter,t,tmax,ient,ientmax,iln + integer start,end,iharm,ib,iib,nbin1,nbin,nbin_rms,nbin_rgy, + & nbin_rmsrgy,liczba,iparm,nFi,indrgy,indrms + integer htot(0:MaxHdim),histent(0:2000) + double precision v(MaxPointProc,MaxR,MaxT_h,Max_Parm) + double precision energia(0:max_ene) +#ifdef MPI + integer tmax_t,upindE_p + double precision fi_p(MaxR,MaxT_h,Max_Parm), + & fi_p_min(MaxR,MaxT_h,Max_Parm) + double precision sumW_p(0:Max_GridT,Max_Parm), + & sumE_p(0:Max_GridT,Max_Parm),sumEsq_p(0:Max_GridT,Max_Parm), + & sumQ_p(MaxQ1,0:Max_GridT,Max_Parm), + & sumQsq_p(MaxQ1,0:Max_GridT,Max_Parm), + & sumEQ_p(MaxQ1,0:Max_GridT,Max_Parm), + & sumEprim_p(MaxQ1,0:Max_GridT,Max_Parm), + & sumEbis_p(0:Max_GridT,Max_Parm) + double precision hfin_p(0:MaxHdim,maxT_h), + & hfin_ent_p(0:MaxHdim),histE_p(0:maxindE),sumH, + & hrmsrgy_p(0:MaxBinRgy,0:MaxBinRms,maxT_h) + double precision rgymin_t,rmsmin_t,rgymax_t,rmsmax_t + double precision potEmin_t_all(maxT_h,Max_Parm),entmin_p,entmax_p + integer histent_p(0:2000) + logical lprint /.true./ +#endif + double precision rgymin,rmsmin,rgymax,rmsmax + double precision sumW(0:NGridT,Max_Parm),sumE(0:NGridT,Max_Parm), + & sumEsq(0:NGridT,Max_Parm),sumQ(MaxQ1,0:NGridT,Max_Parm), + & sumQsq(MaxQ1,0:NGridT,Max_Parm),sumEQ(MaxQ1,0:NGridT,Max_Parm), + & sumEprim(0:NGridT,Max_Parm),sumEbis(0:NGridT,Max_Parm),betaT, + & weight,econstr + double precision fi(MaxR,maxT_h,Max_Parm), + & fi_min(MaxR,maxT_h,Max_Parm), + & dd,dd1,dd2,hh,dmin,denom,finorm,avefi,pom, + & hfin(0:MaxHdim,maxT_h),histE(0:maxindE), + & hrmsrgy(0:MaxBinRgy,0:MaxBinRms,maxT_h), + & potEmin_all(maxT_h,Max_Parm),potEmin,potEmin_min,ent, + & hfin_ent(0:MaxHdim),vmax,aux + double precision fT(6),fTprim(6),fTbis(6),quot,quotl1,quotl,kfacl, + & eprim,ebis,temper,kfac/2.4d0/,T0/300.0d0/, + & eplus,eminus,logfac,tanhT,tt + double precision etot,evdw,evdw_t,evdw2,ees,evdw1,ebe,etors, + & escloc,ehpb,ecorr,ecorr5,ecorr6,eello_turn4,eello_turn3, + & eturn6,eel_loc,edihcnstr,etors_d,estr,evdw2_14,esccor + + integer ind_point(maxpoint),upindE,indE + character*16 plik + character*1 licz1 + character*2 licz2 + character*3 licz3 + character*128 nazwa + integer ilen + external ilen + + write (iout,*) "Enter WHAM_calc" + call flush(iout) + write(licz2,'(bz,i2.2)') islice + nbin1 = 1.0d0/delta + write (iout,'(//80(1h-)/"Solving WHAM equations for slice", + & i2/80(1h-)//)') islice + write (iout,*) "delta",delta," nbin1",nbin1 + write (iout,*) "MaxN",MaxN," MaxQ",MaxQ," MaHdim",MaxHdim + call flush(iout) + dmin=0.0d0 + tmax=0 + do i=1,nParmset + do j=1,nT_h(i) + potEmin_all(j,i)=1.0d10 + enddo + enddo + rgymin=1.0d10 + rmsmin=1.0d10 + rgymax=0.0d0 + rmsmax=0.0d0 + do t=0,MaxN + htot(t)=0 + enddo +#ifdef MPI + do i=1,scount(me1) +#else + do i=1,ntot(islice) +#endif + if (q(nQ+1,i).lt.rmsmin) rmsmin=q(nQ+1,i) + if (q(nQ+1,i).gt.rmsmax) rmsmax=q(nQ+1,i) + if (q(nQ+2,i).lt.rgymin) rgymin=q(nQ+2,i) + if (q(nQ+2,i).gt.rgymax) rgymax=q(nQ+2,i) + ind_point(i)=0 + do j=nQ,1,-1 + ind=(q(j,i)-dmin+1.0d-8)/delta + if (j.eq.1) then + ind_point(i)=ind_point(i)+ind + else + ind_point(i)=ind_point(i)+nbin1**(j-1)*ind + endif + if (ind_point(i).lt.0 .or. ind_point(i).gt.MaxHdim) then + write (iout,*) "Error - index exceeds range for point",i, + & " q=",q(j,i)," ind",ind_point(i) +#ifdef MPI + write (iout,*) "Processor",me1 + call flush(iout) + call MPI_Abort(MPI_COMM_WORLD, Ierror, Errcode ) +#endif + stop + endif + enddo ! j + if (ind_point(i).gt.tmax) tmax=ind_point(i) + htot(ind_point(i))=htot(ind_point(i))+1 +#ifdef DEBUG + write (iout,*) "i",i,"q",(q(j,i),j=1,nQ)," ind",ind_point(i), + & " htot",htot(ind_point(i)) + call flush(iout) +#endif + enddo ! i + call flush(iout) + + nbin=nbin1**nQ-1 + write (iout,'(a)') "Numbers of counts in Q bins" + do t=0,tmax + if (htot(t).gt.0) then + write (iout,'(i15,$)') t + liczba=t + do j=1,nQ + jj = mod(liczba,nbin1) + liczba=liczba/nbin1 + write (iout,'(i5,$)') jj + enddo + write (iout,'(i8)') htot(t) + endif + enddo + do iparm=1,nParmSet + write (iout,'(a,i3)') "Number of data points for parameter set", + & iparm + write (iout,'(i7,$)') ((snk(m,ib,iparm,islice),m=1,nr(ib,iparm)), + & ib=1,nT_h(iparm)) + write (iout,'(i8)') stot(islice) + write (iout,'(a)') + enddo + call flush(iout) + +#ifdef MPI + call MPI_AllReduce(tmax,tmax_t,1,MPI_INTEGER,MPI_MAX, + & WHAM_COMM,IERROR) + tmax=tmax_t + call MPI_AllReduce(rmsmin,rmsmin_t,1,MPI_DOUBLE_PRECISION, + & MPI_MIN,WHAM_COMM,IERROR) + call MPI_AllReduce(rmsmax,rmsmax_t,1,MPI_DOUBLE_PRECISION, + & MPI_MAX,WHAM_COMM,IERROR) + call MPI_AllReduce(rgymin,rgymin_t,1,MPI_DOUBLE_PRECISION, + & MPI_MIN,WHAM_COMM,IERROR) + call MPI_AllReduce(rgymax,rgymax_t,1,MPI_DOUBLE_PRECISION, + & MPI_MAX,WHAM_COMM,IERROR) + rgymin=rgymin_t + rgymax=rgymax_t + rmsmin=rmsmin_t + rmsmax=rmsmax_t +#endif + rmsmin=deltrms*dint(rmsmin/deltrms) + rmsmax=deltrms*dint(rmsmax/deltrms) + rgymin=deltrms*dint(rgymin/deltrgy) + rgymax=deltrms*dint(rgymax/deltrgy) + nbin_rms=(rmsmax-rmsmin)/deltrms + nbin_rgy=(rgymax-rgymin)/deltrgy + write (iout,*) "rmsmin",rmsmin," rmsmax",rmsmax," rgymin",rgymin, + & " rgymax",rgymax," nbin_rms",nbin_rms," nbin_rgy",nbin_rgy + nFi=0 + do i=1,nParmSet + do j=1,nT_h(i) + nFi=nFi+nR(j,i) + enddo + enddo + write (iout,*) "nFi",nFi +! Compute the Boltzmann factor corresponing to restrain potentials in different +! simulations. +#ifdef MPI + do i=1,scount(me1) +#else + do i=1,ntot(islice) +#endif +c write (9,'(3i5,f10.5)') i,(iparm,potE(i,iparm),iparm=1,nParmSet) + do iparm=1,nParmSet +#ifdef DEBUG + write (iout,'(2i5,21f8.2)') i,iparm, + & (enetb(k,i,iparm),k=1,21) +#endif + call restore_parm(iparm) +#ifdef DEBUG + write (iout,*) wsc,wscp,welec,wvdwpp,wang,wtor,wscloc, + & wcorr,wcorr5,wcorr6,wturn4,wturn3,wturn6,wel_loc, + & wtor_d,wsccor,wbond +#endif + do ib=1,nT_h(iparm) + if (rescale_mode.eq.1) then + quot=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0) + quotl=1.0d0 + kfacl=1.0d0 + do l=1,5 + quotl1=quotl + quotl=quotl*quot + kfacl=kfacl*kfac + fT(l)=kfacl/(kfacl-1.0d0+quotl) + enddo +#if defined(FUNCTH) + tt = 1.0d0/(beta_h(ib,iparm)*1.987D-3) + ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0 +#elif defined(FUNCT) + ft(6)=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0) +#else + ft(6)=1.0d0 +#endif + else if (rescale_mode.eq.2) then + quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3) + quotl=1.0d0 + do l=1,5 + quotl=quotl*quot + fT(l)=1.12692801104297249644d0/ + & dlog(dexp(quotl)+dexp(-quotl)) + enddo +#if defined(FUNCTH) + tt = 1.0d0/(beta_h(ib,iparm)*1.987D-3) + ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0 +#elif defined(FUNCT) + ft(6)=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0) +#else + ft(6)=1.0d0 +#endif +c write (iout,*) 1.0d0/(beta_h(ib,iparm)*1.987D-3),ft + else if (rescale_mode.eq.0) then + do l=1,6 + fT(l)=1.0d0 + enddo + else + write (iout,*) "Error in WHAM_CALC: wrong RESCALE_MODE", + & rescale_mode + call flush(iout) + return1 + endif + evdw=enetb(1,i,iparm) + evdw_t=enetb(21,i,iparm) +#ifdef SCP14 + evdw2_14=enetb(17,i,iparm) + evdw2=enetb(2,i,iparm)+evdw2_14 +#else + evdw2=enetb(2,i,iparm) + evdw2_14=0.0d0 +#endif +#ifdef SPLITELE + ees=enetb(3,i,iparm) + evdw1=enetb(16,i,iparm) +#else + ees=enetb(3,i,iparm) + evdw1=0.0d0 +#endif + ecorr=enetb(4,i,iparm) + ecorr5=enetb(5,i,iparm) + ecorr6=enetb(6,i,iparm) + eel_loc=enetb(7,i,iparm) + eello_turn3=enetb(8,i,iparm) + eello_turn4=enetb(9,i,iparm) + eturn6=enetb(10,i,iparm) + ebe=enetb(11,i,iparm) + escloc=enetb(12,i,iparm) + etors=enetb(13,i,iparm) + etors_d=enetb(14,i,iparm) + ehpb=enetb(15,i,iparm) + estr=enetb(18,i,iparm) + esccor=enetb(19,i,iparm) + edihcnstr=enetb(20,i,iparm) +#ifdef DEBUG + write (iout,'(3i5,6f5.2,14f12.3)') i,ib,iparm,(ft(l),l=1,6), + & evdw+evdw_t,evdw2,ees,evdw1,ecorr,eel_loc,estr,ebe,escloc, + & etors,etors_d,eello_turn3,eello_turn4,esccor +#endif + +#ifdef SPLITELE + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees + & +wvdwpp*evdw1 + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc + & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr +#else + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2 + & +ft(1)*welec*(ees+evdw1) + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr + & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr +#endif +#ifdef DEBUG + write (iout,*) i,iparm,1.0d0/(beta_h(ib,iparm)*1.987D-3), + & etot +#endif +#ifdef DEBUG + if (iparm.eq.1 .and. ib.eq.1) then + write (iout,*)"Conformation",i + energia(0)=etot + do k=1,max_ene + energia(k)=enetb(k,i,iparm) + enddo + call enerprint(energia(0),fT) + endif +#endif + do kk=1,nR(ib,iparm) + Econstr=0.0d0 + do j=1,nQ + dd = q(j,i) + Econstr=Econstr+Kh(j,kk,ib,iparm) + & *(dd-q0(j,kk,ib,iparm))**2 + enddo + v(i,kk,ib,iparm)= + & -beta_h(ib,iparm)*(etot+Econstr) +#ifdef DEBUG + write (iout,'(4i5,4e15.5)') i,kk,ib,iparm, + & etot,v(i,kk,ib,iparm) +#endif + enddo ! kk + enddo ! ib + enddo ! iparm + enddo ! i +! Simple iteration to calculate free energies corresponding to all simulation +! runs. + do iter=1,maxit + +! Compute new free-energy values corresponding to the righ-hand side of the +! equation and their derivatives. + write (iout,*) "------------------------fi" + entfac_min=1.0d10 +#ifdef MPI + do t=1,scount(me1) +#else + do t=1,ntot(islice) +#endif + vmax=-1.0d+20 + do i=1,nParmSet + do k=1,nT_h(i) + do l=1,nR(k,i) + vf=v(t,l,k,i)+f(l,k,i) + if (vf.gt.vmax) vmax=vf + enddo + enddo + enddo + denom=0.0d0 + do i=1,nParmSet + do k=1,nT_h(i) + do l=1,nR(k,i) + aux=f(l,k,i)+v(t,l,k,i)-vmax + if (aux.gt.-200.0d0) + & denom=denom+snk(l,k,i,islice)*dexp(aux) + enddo + enddo + enddo + entfac(t)=-dlog(denom)-vmax + if (entfac(t).lt.entfac_min) entfac_min=entfac(t) +#ifdef DEBUG + write (iout,*) t,"vmax",vmax," denom",denom,"entfac",entfac(t) +#endif + enddo +c#ifdef MPI +c write (iout,*) "entfac_min before AllReduce",entfac_min +c call MPI_AllReduce(entfac_min,entfac_min_t,1, +c & MPI_DOUBLE_PRECISION,MPI_MAX,WHAM_COMM,IERROR) +c entfac_min=entfac_min_t +c write (iout,*) "entfac_min after AllReduce",entfac_min +c#endif +c#ifdef MPI +c do t=1,scount(me) +c entfac(t)=entfac(t)-entfac_min +c enddo +c#else +c do t=1,ntot(islice) +c entfac(t)=entfac(t)-entfac_min +c enddo +c#endif + do iparm=1,nParmSet + do iib=1,nT_h(iparm) + do ii=1,nR(iib,iparm) +#ifdef MPI + fi_p_min(ii,iib,iparm)=-1.0d10 + do t=1,scount(me) + aux=v(t,ii,iib,iparm)+entfac(t) + if (aux.gt.fi_p_min(ii,iib,iparm)) + & fi_p_min(ii,iib,iparm)=aux + enddo +#else + do t=1,ntot(islice) + aux=v(t,ii,iib,iparm)+entfac(t) + if (aux.gt.fi_min(ii,iib,iparm)) + & fi_min(ii,iib,iparm)=aux + enddo +#endif + enddo ! ii + enddo ! iib + enddo ! iparm +#ifdef MPI +#ifdef DEBUG + write (iout,*) "fi_min before AllReduce" + do i=1,nParmSet + do j=1,nT_h(i) + write (iout,*) (i,j,k,fi_p_min(k,j,i),k=1,nR(j,i)) + enddo + enddo +#endif + call MPI_AllReduce(fi_p_min,fi_min,MaxR*MaxT_h*nParmSet, + & MPI_DOUBLE_PRECISION,MPI_MAX,WHAM_COMM,IERROR) +#ifdef DEBUG + write (iout,*) "fi_min after AllReduce" + do i=1,nParmSet + do j=1,nT_h(i) + write (iout,*) (i,j,k,fi_min(k,j,i),k=1,nR(j,i)) + enddo + enddo +#endif +#endif + do iparm=1,nParmSet + do iib=1,nT_h(iparm) + do ii=1,nR(iib,iparm) +#ifdef MPI + fi_p(ii,iib,iparm)=0.0d0 + do t=1,scount(me) + fi_p(ii,iib,iparm)=fi_p(ii,iib,iparm) + & +dexp(v(t,ii,iib,iparm)+entfac(t)-fi_min(ii,iib,iparm)) +#ifdef DEBUG + write (iout,'(4i5,4e15.5)') t,ii,iib,iparm, + & v(t,ii,iib,iparm),entfac(t),fi_min(ii,iib,iparm), + & fi_p(ii,iib,iparm) +#endif + enddo +#else + fi(ii,iib,iparm)=0.0d0 + do t=1,ntot(islice) + fi(ii,iib,iparm)=fi(ii,iib,iparm) + & +dexp(v(t,ii,iib,iparm)+entfac(t)-fi_min(ii,iib,iparm)) + enddo +#endif + enddo ! ii + enddo ! iib + enddo ! iparm + +#ifdef MPI +#ifdef DEBUG + write (iout,*) "fi before MPI_Reduce me",me,' master',master + do iparm=1,nParmSet + do ib=1,nT_h(iparm) + write (iout,*) "iparm",iparm," ib",ib + write (iout,*) "beta=",beta_h(ib,iparm) + write (iout,'(8e15.5)') (fi_p(i,ib,iparm),i=1,nR(ib,iparm)) + enddo + enddo +#endif +#ifdef DEBUG + write (iout,*) "REDUCE size",maxR,MaxT_h,nParmSet, + & maxR*MaxT_h*nParmSet + write (iout,*) "MPI_COMM_WORLD",MPI_COMM_WORLD, + & " WHAM_COMM",WHAM_COMM +#endif + call MPI_Reduce(fi_p(1,1,1),fi(1,1,1),maxR*MaxT_h*nParmSet, + & MPI_DOUBLE_PRECISION, + & MPI_SUM,Master,WHAM_COMM,IERROR) +#ifdef DEBUG + write (iout,*) "fi after MPI_Reduce nparmset",nparmset + do iparm=1,nParmSet + write (iout,*) "iparm",iparm + do ib=1,nT_h(iparm) + write (iout,*) "beta=",beta_h(ib,iparm) + write (iout,'(8e15.5)') (fi(i,ib,iparm),i=1,nR(ib,iparm)) + enddo + enddo +#endif + if (me1.eq.Master) then +#endif + avefi=0.0d0 + do iparm=1,nParmSet + do ib=1,nT_h(iparm) + do i=1,nR(ib,iparm) + fi(i,ib,iparm)=-dlog(fi(i,ib,iparm))-fi_min(i,ib,iparm) + avefi=avefi+fi(i,ib,iparm) + enddo + enddo + enddo + avefi=avefi/nFi + do iparm=1,nParmSet + write (iout,*) "Parameter set",iparm + do ib =1,nT_h(iparm) + write (iout,*) "beta=",beta_h(ib,iparm) + do i=1,nR(ib,iparm) + fi(i,ib,iparm)=fi(i,ib,iparm)-avefi + enddo + write (iout,'(8f10.5)') (fi(i,ib,iparm),i=1,nR(ib,iparm)) + write (iout,'(8f10.5)') (f(i,ib,iparm),i=1,nR(ib,iparm)) + enddo + enddo + +! Compute the norm of free-energy increments. + finorm=0.0d0 + do iparm=1,nParmSet + do ib=1,nT_h(iparm) + do i=1,nR(ib,iparm) + finorm=finorm+dabs(fi(i,ib,iparm)-f(i,ib,iparm)) + f(i,ib,iparm)=fi(i,ib,iparm) + enddo + enddo + enddo + + write (iout,*) 'Iteration',iter,' finorm',finorm + +#ifdef MPI + endif + call MPI_Bcast(f(1,1,1),MaxR*MaxT_h*nParmSet, + & MPI_DOUBLE_PRECISION,Master, + & WHAM_COMM,IERROR) + call MPI_Bcast(finorm,1,MPI_DOUBLE_PRECISION,Master, + & WHAM_COMM,IERROR) +#endif +! Exit, if the increment norm is smaller than pre-assigned tolerance. + if (finorm.lt.fimin) then + write (iout,*) 'Iteration converged' + goto 20 + endif + + enddo ! iter + + 20 continue +! Now, put together the histograms from all simulations, in order to get the +! unbiased total histogram. + +C Determine the minimum free energies +#ifdef MPI + do i=1,scount(me1) +#else + do i=1,ntot(islice) +#endif +c write (9,'(3i5,f10.5)') i,(iparm,potE(i,iparm),iparm=1,nParmSet) + do iparm=1,nParmSet +#ifdef DEBUG + write (iout,'(2i5,21f8.2)') i,iparm, + & (enetb(k,i,iparm),k=1,21) +#endif + call restore_parm(iparm) +#ifdef DEBUG + write (iout,*) wsc,wscp,welec,wvdwpp,wang,wtor,wscloc, + & wcorr,wcorr5,wcorr6,wturn4,wturn3,wturn6,wel_loc, + & wtor_d,wsccor,wbond +#endif + do ib=1,nT_h(iparm) + if (rescale_mode.eq.1) then + quot=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0) + quotl=1.0d0 + kfacl=1.0d0 + do l=1,5 + quotl1=quotl + quotl=quotl*quot + kfacl=kfacl*kfac + fT(l)=kfacl/(kfacl-1.0d0+quotl) + enddo +#if defined(FUNCTH) + tt = 1.0d0/(beta_h(ib,iparm)*1.987D-3) + ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0 +#elif defined(FUNCT) + ft(6)=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0) +#else + ft(6)=1.0d0 +#endif + else if (rescale_mode.eq.2) then + quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3) + quotl=1.0d0 + do l=1,5 + quotl=quotl*quot + fT(l)=1.12692801104297249644d0/ + & dlog(dexp(quotl)+dexp(-quotl)) + enddo +#if defined(FUNCTH) + tt = 1.0d0/(beta_h(ib,iparm)*1.987D-3) + ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0 +#elif defined(FUNCT) + ft(6)=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0) +#else + ft(6)=1.0d0 +#endif +c write (iout,*) 1.0d0/(beta_h(ib,iparm)*1.987D-3),ft + else if (rescale_mode.eq.0) then + do l=1,6 + fT(l)=1.0d0 + enddo + else + write (iout,*) "Error in WHAM_CALC: wrong RESCALE_MODE", + & rescale_mode + call flush(iout) + return1 + endif + evdw=enetb(1,i,iparm) + evdw_t=enetb(21,i,iparm) +#ifdef SCP14 + evdw2_14=enetb(17,i,iparm) + evdw2=enetb(2,i,iparm)+evdw2_14 +#else + evdw2=enetb(2,i,iparm) + evdw2_14=0.0d0 +#endif +#ifdef SPLITELE + ees=enetb(3,i,iparm) + evdw1=enetb(16,i,iparm) +#else + ees=enetb(3,i,iparm) + evdw1=0.0d0 +#endif + ecorr=enetb(4,i,iparm) + ecorr5=enetb(5,i,iparm) + ecorr6=enetb(6,i,iparm) + eel_loc=enetb(7,i,iparm) + eello_turn3=enetb(8,i,iparm) + eello_turn4=enetb(9,i,iparm) + eturn6=enetb(10,i,iparm) + ebe=enetb(11,i,iparm) + escloc=enetb(12,i,iparm) + etors=enetb(13,i,iparm) + etors_d=enetb(14,i,iparm) + ehpb=enetb(15,i,iparm) + estr=enetb(18,i,iparm) + esccor=enetb(19,i,iparm) + edihcnstr=enetb(20,i,iparm) +#ifdef DEBUG + write (iout,'(3i5,6f5.2,14f12.3)') i,ib,iparm,(ft(l),l=1,6), + & evdw+evdw_t,evdw2,ees,evdw1,ecorr,eel_loc,estr,ebe,escloc, + & etors,etors_d,eello_turn3,eello_turn4,esccor,edihcnstr +#endif + +#ifdef SPLITELE + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees + & +wvdwpp*evdw1 + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc + & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr +#else + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2 + & +ft(1)*welec*(ees+evdw1) + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr + & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr +#endif +c write (iout,*) "i",i," ib",ib, +c & " temp",1.0d0/(1.987d-3*beta_h(ib,iparm))," etot",etot, +c & " entfac",entfac(i) + etot=etot-entfac(i)/beta_h(ib,iparm) + if(etot.lt.potEmin_all(ib,iparm)) potEmin_all(ib,iparm)=etot +c write (iout,*) "efree",etot," potEmin",potEmin_all(ib,iparm) + enddo ! ib + enddo ! iparm + enddo ! i +#ifdef DEBUG + write (iout,*) "The potEmin array before reduction" + do i=1,nParmSet + write (iout,*) "Parameter set",i + do j=1,nT_h(i) + write (iout,*) j,PotEmin_all(j,i) + enddo + enddo + write (iout,*) "potEmin_min",potEmin_min +#endif +#ifdef MPI +C Determine the minimum energes for all parameter sets and temperatures + call MPI_AllReduce(potEmin_all(1,1),potEmin_t_all(1,1), + & maxT_h*nParmSet,MPI_DOUBLE_PRECISION,MPI_MIN,WHAM_COMM,IERROR) + do i=1,nParmSet + do j=1,nT_h(i) + potEmin_all(j,i)=potEmin_t_all(j,i) + enddo + enddo +#endif + potEmin_min=potEmin_all(1,1) + do i=1,nParmSet + do j=1,nT_h(i) + if (potEmin_all(j,i).lt.potEmin_min) + & potEmin_min=potEmin_all(j,i) + enddo + enddo +#ifdef DEBUG + write (iout,*) "The potEmin array" + do i=1,nParmSet + write (iout,*) "Parameter set",i + do j=1,nT_h(i) + write (iout,*) j,PotEmin_all(j,i) + enddo + enddo + write (iout,*) "potEmin_min",potEmin_min +#endif + +#ifdef MPI + do t=0,tmax + hfin_ent_p(t)=0.0d0 + enddo +#else + do t=0,tmax + hfin_ent(t)=0.0d0 + enddo +#endif + write (iout,*) "--------------hist" +#ifdef MPI + do iparm=1,nParmSet + do i=0,nGridT + sumW_p(i,iparm)=0.0d0 + sumE_p(i,iparm)=0.0d0 + sumEbis_p(i,iparm)=0.0d0 + sumEsq_p(i,iparm)=0.0d0 + do j=1,nQ+2 + sumQ_p(j,i,iparm)=0.0d0 + sumQsq_p(j,i,iparm)=0.0d0 + sumEQ_p(j,i,iparm)=0.0d0 + enddo + enddo + enddo + upindE_p=0 +#else + do iparm=1,nParmSet + do i=0,nGridT + sumW(i,iparm)=0.0d0 + sumE(i,iparm)=0.0d0 + sumEbis(i,iparm)=0.0d0 + sumEsq(i,iparm)=0.0d0 + do j=1,nQ+2 + sumQ(j,i,iparm)=0.0d0 + sumQsq(j,i,iparm)=0.0d0 + sumEQ(j,i,iparm)=0.0d0 + enddo + enddo + enddo + upindE=0 +#endif +c 8/26/05 entropy distribution +#ifdef MPI + entmin_p=1.0d10 + entmax_p=-1.0d10 + do t=1,scount(me1) +c ent=-dlog(entfac(t)) + ent=entfac(t) + if (ent.lt.entmin_p) entmin_p=ent + if (ent.gt.entmax_p) entmax_p=ent + enddo + write (iout,*) "entmin",entmin_p," entmax",entmax_p + call flush(iout) + call MPI_Allreduce(entmin_p,entmin,1,MPI_DOUBLE_PRECISION,MPI_MIN, + & WHAM_COMM,IERROR) + call MPI_Allreduce(entmax_p,entmax,1,MPI_DOUBLE_PRECISION,MPI_MAX, + & WHAM_COMM,IERROR) + ientmax=entmax-entmin + if (ientmax.gt.2000) ientmax=2000 + write (iout,*) "entmin",entmin," entmax",entmax," ientmax",ientmax + call flush(iout) + do t=1,scount(me1) +c ient=-dlog(entfac(t))-entmin + ient=entfac(t)-entmin + if (ient.le.2000) histent_p(ient)=histent_p(ient)+1 + enddo + call MPI_Allreduce(histent_p(0),histent(0),ientmax+1,MPI_INTEGER, + & MPI_SUM,WHAM_COMM,IERROR) + if (me1.eq.Master) then + write (iout,*) "Entropy histogram" + do i=0,ientmax + write(iout,'(f15.4,i10)') entmin+i,histent(i) + enddo + endif +#else + entmin=1.0d10 + entmax=-1.0d10 + do t=1,ntot(islice) + ent=entfac(t) + if (ent.lt.entmin) entmin=ent + if (ent.gt.entmax) entmax=ent + enddo + ientmax=-dlog(entmax)-entmin + if (ientmax.gt.2000) ientmax=2000 + do t=1,ntot(islice) + ient=entfac(t)-entmin + if (ient.le.2000) histent(ient)=histent(ient)+1 + enddo + write (iout,*) "Entropy histogram" + do i=0,ientmax + write(iout,'(2f15.4)') entmin+i,histent(i) + enddo +#endif + +#ifdef MPI +c write (iout,*) "me1",me1," scount",scount(me1) + + do iparm=1,nParmSet + +#ifdef MPI + do ib=1,nT_h(iparm) + do t=0,tmax + hfin_p(t,ib)=0.0d0 + enddo + enddo + do i=1,maxindE + histE_p(i)=0.0d0 + enddo +#else + do ib=1,nT_h(iparm) + do t=0,tmax + hfin(t,ib)=0.0d0 + enddo + enddo + do i=1,maxindE + histE(i)=0.0d0 + enddo +#endif + do ib=1,nT_h(iparm) + do i=0,MaxBinRms + do j=0,MaxBinRgy + hrmsrgy(j,i,ib)=0.0d0 +#ifdef MPI + hrmsrgy_p(j,i,ib)=0.0d0 +#endif + enddo + enddo + enddo + + do t=1,scount(me1) +#else + do t=1,ntot(islice) +#endif + ind = ind_point(t) +#ifdef MPI + hfin_ent_p(ind)=hfin_ent_p(ind)+dexp(entfac(t)) +#else + hfin_ent(ind)=hfin_ent(ind)+dexp(entfac(t)) +#endif + call restore_parm(iparm) + evdw=enetb(21,t,iparm) + evdw_t=enetb(1,t,iparm) +#ifdef SCP14 + evdw2_14=enetb(17,t,iparm) + evdw2=enetb(2,t,iparm)+evdw2_14 +#else + evdw2=enetb(2,t,iparm) + evdw2_14=0.0d0 +#endif +#ifdef SPLITELE + ees=enetb(3,t,iparm) + evdw1=enetb(16,t,iparm) +#else + ees=enetb(3,t,iparm) + evdw1=0.0d0 +#endif + ecorr=enetb(4,t,iparm) + ecorr5=enetb(5,t,iparm) + ecorr6=enetb(6,t,iparm) + eel_loc=enetb(7,t,iparm) + eello_turn3=enetb(8,t,iparm) + eello_turn4=enetb(9,t,iparm) + eturn6=enetb(10,t,iparm) + ebe=enetb(11,t,iparm) + escloc=enetb(12,t,iparm) + etors=enetb(13,t,iparm) + etors_d=enetb(14,t,iparm) + ehpb=enetb(15,t,iparm) + estr=enetb(18,t,iparm) + esccor=enetb(19,t,iparm) + edihcnstr=enetb(20,t,iparm) + do k=0,nGridT + betaT=startGridT+k*delta_T + temper=betaT +c fT=T0/betaT +c ft=2*T0/(T0+betaT) + if (rescale_mode.eq.1) then + quot=betaT/T0 + quotl=1.0d0 + kfacl=1.0d0 + do l=1,5 + quotl1=quotl + quotl=quotl*quot + kfacl=kfacl*kfac + denom=kfacl-1.0d0+quotl + fT(l)=kfacl/denom + ftprim(l)=-l*ft(l)*quotl1/(T0*denom) + ftbis(l)=l*kfacl*quotl1* + & (2*l*quotl-(l-1)*denom)/(quot*t0*t0*denom**3) + enddo +#if defined(FUNCTH) + ft(6)=(320.0d0+80.0d0*dtanh((betaT-320.0d0)/80.0d0))/ + & 320.0d0 + ftprim(6)=1.0d0/(320.0d0*dcosh((betaT-320.0d0)/80.0d0)**2) + ftbis(6)=-2.0d0*dtanh((betaT-320.0d0)/80.0d0) + & /(320.0d0*80.0d0*dcosh((betaT-320.0d0)/80.0d0)**3) +#elif defined(FUNCT) + fT(6)=betaT/T0 + ftprim(6)=1.0d0/T0 + ftbis(6)=0.0d0 +#else + fT(6)=1.0d0 + ftprim(6)=0.0d0 + ftbis(6)=0.0d0 +#endif + else if (rescale_mode.eq.2) then + quot=betaT/T0 + quotl=1.0d0 + do l=1,5 + quotl1=quotl + quotl=quotl*quot + eplus=dexp(quotl) + eminus=dexp(-quotl) + logfac=1.0d0/dlog(eplus+eminus) + tanhT=(eplus-eminus)/(eplus+eminus) + fT(l)=1.12692801104297249644d0*logfac + ftprim(l)=-l*quotl1*ft(l)*tanhT*logfac/T0 + ftbis(l)=(l-1)*ftprim(l)/(quot*T0)- + & 2*l*quotl1/T0*logfac* + & (2*l*quotl1*ft(l)/(T0*(eplus+eminus)**2) + & +ftprim(l)*tanhT) + enddo +#if defined(FUNCTH) + ft(6)=(320.0d0+80.0d0*dtanh((betaT-320.0d0)/80.0d0))/ + & 320.0d0 + ftprim(6)=1.0d0/(320.0d0*dcosh((betaT-320.0d0)/80.0d0)**2) + ftbis(6)=-2.0d0*dtanh((betaT-320.0d0)/80.0d0) + & /(320.0d0*80.0d0*dcosh((betaT-320.0d0)/80.0d0)**3) +#elif defined(FUNCT) + fT(6)=betaT/T0 + ftprim(6)=1.0d0/T0 + ftbis(6)=0.0d0 +#else + fT(6)=1.0d0 + ftprim(6)=0.0d0 + ftbis(6)=0.0d0 +#endif + else if (rescale_mode.eq.0) then + do l=1,5 + fT(l)=1.0d0 + ftprim(l)=0.0d0 + enddo + else + write (iout,*) "Error in WHAM_CALC: wrong RESCALE_MODE", + & rescale_mode + call flush(iout) + return1 + endif +c write (iout,*) "ftprim",ftprim +c write (iout,*) "ftbis",ftbis + betaT=1.0d0/(1.987D-3*betaT) + if (betaT.ge.beta_h(1,iparm)) then + potEmin=potEmin_all(1,iparm) +c write(iout,*) "first",temper,potEmin + else if (betaT.lt.beta_h(nT_h(iparm),iparm)) then + potEmin=potEmin_all(nT_h(iparm),iparm) +c write (iout,*) "last",temper,potEmin + else + do l=1,nT_h(iparm)-1 + if (betaT.le.beta_h(l,iparm) .and. + & betaT.gt.beta_h(l+1,iparm)) then + potEmin=potEmin_all(l,iparm) +c write (iout,*) "l",l, +c & betaT,1.0d0/(1.987D-3*beta_h(l,iparm)), +c & 1.0d0/(1.987D-3*beta_h(l+1,iparm)),temper,potEmin + exit + endif + enddo + endif +c write (iout,*) ib," PotEmin",potEmin +#ifdef SPLITELE + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees + & +wvdwpp*evdw1 + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc + & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr + eprim=ftprim(6)*evdw_t+ftprim(1)*welec*ees + & +ftprim(1)*wtor*etors+ + & ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+ + & ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+ + & ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eturn6+ + & ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+ + & ftprim(1)*wsccor*esccor + ebis=ftbis(1)*welec*ees+ftbis(1)*wtor*etors+ + & ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+ + & ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+ + & ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eturn6+ + & ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+ + & ftbis(1)*wsccor*esccor +#else + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2 + & +ft(1)*welec*(ees+evdw1) + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr + & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr + eprim=ftprim(6)*evdw_t+ftprim(1)*welec*(ees+evdw1) + & +ftprim(1)*wtor*etors+ + & ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+ + & ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+ + & ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eturn6+ + & ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+ + & ftprim(1)*wsccor*esccor + ebis=ftbis(1)*welec*(ees+evdw1)+ftbis(1)*wtor*etors+ + & ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+ + & ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+ + & ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eturn6+ + & ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+ + & ftprim(1)*wsccor*esccor +#endif + weight=dexp(-betaT*(etot-potEmin)+entfac(t)) +#ifdef DEBUG + write (iout,*) "iparm",iparm," t",t," temper",temper, + & " etot",etot," entfac",entfac(t), + & " efree",etot-entfac(t)/betaT," potEmin",potEmin, + & " boltz",-betaT*(etot-potEmin)+entfac(t), + & " weight",weight," ebis",ebis +#endif + etot=etot-temper*eprim +#ifdef MPI + sumW_p(k,iparm)=sumW_p(k,iparm)+weight + sumE_p(k,iparm)=sumE_p(k,iparm)+etot*weight + sumEbis_p(k,iparm)=sumEbis_p(k,iparm)+ebis*weight + sumEsq_p(k,iparm)=sumEsq_p(k,iparm)+etot**2*weight + do j=1,nQ+2 + sumQ_p(j,k,iparm)=sumQ_p(j,k,iparm)+q(j,t)*weight + sumQsq_p(j,k,iparm)=sumQsq_p(j,k,iparm)+q(j,t)**2*weight + sumEQ_p(j,k,iparm)=sumEQ_p(j,k,iparm) + & +etot*q(j,t)*weight + enddo +#else + sumW(k,iparm)=sumW(k,iparm)+weight + sumE(k,iparm)=sumE(k,iparm)+etot*weight + sumEbis(k,iparm)=sumEbis(k,iparm)+ebis*weight + sumEsq(k,iparm)=sumEsq(k,iparm)+etot**2*weight + do j=1,nQ+2 + sumQ(j,k,iparm)=sumQ(j,k,iparm)+q(j,t)*weight + sumQsq(j,k,iparm)=sumQsq(j,k,iparm)+q(j,t)**2*weight + sumEQ(j,k,iparm)=sumEQ(j,k,iparm) + & +etot*q(j,t)*weight + enddo +#endif + enddo + indE = aint(potE(t,iparm)-aint(potEmin)) + if (indE.ge.0 .and. indE.le.maxinde) then + if (indE.gt.upindE_p) upindE_p=indE + histE_p(indE)=histE_p(indE)+dexp(-entfac(t)) + endif +#ifdef MPI + do ib=1,nT_h(iparm) + potEmin=potEmin_all(ib,iparm) + expfac=dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t)) + hfin_p(ind,ib)=hfin_p(ind,ib)+ + & dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t)) + if (rmsrgymap) then + indrgy=dint((q(nQ+2,t)-rgymin)/deltrgy) + indrms=dint((q(nQ+1,t)-rmsmin)/deltrms) + hrmsrgy_p(indrgy,indrms,ib)= + & hrmsrgy_p(indrgy,indrms,ib)+expfac + endif + enddo +#else + do ib=1,nT_h(iparm) + potEmin=potEmin_all(ib,iparm) + expfac=dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t)) + hfin(ind,ib)=hfin(ind,ib)+ + & dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t)) + if (rmsrgymap) then + indrgy=dint((q(nQ+2,t)-rgymin)/deltrgy) + indrms=dint((q(nQ+1,t)-rmsmin)/deltrms) + hrmsrgy(indrgy,indrms,ib)= + & hrmsrgy(indrgy,indrms,ib)+expfac + endif + enddo +#endif + enddo ! t + do ib=1,nT_h(iparm) + if (histout) call MPI_Reduce(hfin_p(0,ib),hfin(0,ib),nbin, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + if (rmsrgymap) then + call MPI_Reduce(hrmsrgy_p(0,0,ib),hrmsrgy(0,0,ib), + & (MaxBinRgy+1)*(nbin_rms+1),MPI_DOUBLE_PRECISION,MPI_SUM,Master, + & WHAM_COMM,IERROR) + endif + enddo + call MPI_Reduce(upindE_p,upindE,1, + & MPI_INTEGER,MPI_MAX,Master,WHAM_COMM,IERROR) + call MPI_Reduce(histE_p(0),histE(0),maxindE, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + + if (me1.eq.master) then + + if (histout) then + + write (iout,'(6x,$)') + write (iout,'(f20.2,$)') (1.0d0/(1.987D-3*beta_h(ib,iparm)), + & ib=1,nT_h(iparm)) + write (iout,*) + + write (iout,'(/a)') 'Final histograms' + if (histfile) then + if (nslice.eq.1) then + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//'_par'//licz3//'.hist' + else + histname=prefix(:ilen(prefix))//'.hist' + endif + else + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//'_par'//licz3// + & '_slice_'//licz2//'.hist' + else + histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.hist' + endif + endif +#if defined(AIX) || defined(PGI) + open (ihist,file=histname,position='append') +#else + open (ihist,file=histname,access='append') +#endif + endif + + do t=0,tmax + liczba=t + sumH=0.0d0 + do ib=1,nT_h(iparm) + sumH=sumH+hfin(t,ib) + enddo + if (sumH.gt.0.0d0) then + do j=1,nQ + jj = mod(liczba,nbin1) + liczba=liczba/nbin1 + write (iout,'(f6.3,$)') dmin+(jj+0.5d0)*delta + if (histfile) + & write (ihist,'(f6.3,$)') dmin+(jj+0.5d0)*delta + enddo + do ib=1,nT_h(iparm) + write (iout,'(e20.10,$)') hfin(t,ib) + if (histfile) write (ihist,'(e20.10,$)') hfin(t,ib) + enddo + write (iout,'(i5)') iparm + if (histfile) write (ihist,'(i5)') iparm + endif + enddo + + endif + + if (entfile) then + if (nslice.eq.1) then + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//"_par"//licz3//'.ent' + else + histname=prefix(:ilen(prefix))//'.ent' + endif + else + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//'par_'//licz3// + & '_slice_'//licz2//'.ent' + else + histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.ent' + endif + endif +#if defined(AIX) || defined(PGI) + open (ihist,file=histname,position='append') +#else + open (ihist,file=histname,access='append') +#endif + write (ihist,'(a)') "# Microcanonical entropy" + do i=0,upindE + write (ihist,'(f8.0,$)') dint(potEmin)+i + if (histE(i).gt.0.0e0) then + write (ihist,'(f15.5,$)') dlog(histE(i)) + else + write (ihist,'(f15.5,$)') 0.0d0 + endif + enddo + write (ihist,*) + close(ihist) + endif + write (iout,*) "Microcanonical entropy" + do i=0,upindE + write (iout,'(f8.0,$)') dint(potEmin)+i + if (histE(i).gt.0.0e0) then + write (iout,'(f15.5,$)') dlog(histE(i)) + else + write (iout,'(f15.5,$)') 0.0d0 + endif + write (iout,*) + enddo + if (rmsrgymap) then + if (nslice.eq.1) then + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//'_par'//licz3//'.rmsrgy' + else + histname=prefix(:ilen(prefix))//'.rmsrgy' + endif + else + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//'_par'//licz3// + & '_slice_'//licz2//'.rmsrgy' + else + histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.rmsrgy' + endif + endif +#if defined(AIX) || defined(PGI) + open (ihist,file=histname,position='append') +#else + open (ihist,file=histname,access='append') +#endif + do i=0,nbin_rms + do j=0,nbin_rgy + write(ihist,'(2f8.2,$)') + & rgymin+deltrgy*j,rmsmin+deltrms*i + do ib=1,nT_h(iparm) + if (hrmsrgy(j,i,ib).gt.0.0d0) then + write(ihist,'(e14.5,$)') + & -dlog(hrmsrgy(j,i,ib))/beta_h(ib,iparm) + & +potEmin + else + write(ihist,'(e14.5,$)') 1.0d6 + endif + enddo + write (ihist,'(i2)') iparm + enddo + enddo + close(ihist) + endif + endif + enddo ! iparm +#ifdef MPI + call MPI_Reduce(hfin_ent_p(0),hfin_ent(0),nbin, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + call MPI_Reduce(sumW_p(0,1),sumW(0,1),(nGridT+1)*nParmSet, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + call MPI_Reduce(sumE_p(0,1),sumE(0,1),(nGridT+1)*nParmSet, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + call MPI_Reduce(sumEbis_p(0,1),sumEbis(0,1),(nGridT+1)*nParmSet, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + call MPI_Reduce(sumEsq_p(0,1),sumEsq(0,1),(nGridT+1)*nParmSet, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + call MPI_Reduce(sumQ_p(1,0,1),sumQ(1,0,1), + & MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master, + & WHAM_COMM,IERROR) + call MPI_Reduce(sumQsq_p(1,0,1),sumQsq(1,0,1), + & MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master, + & WHAM_COMM,IERROR) + call MPI_Reduce(sumEQ_p(1,0,1),sumEQ(1,0,1), + & MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master, + & WHAM_COMM,IERROR) + if (me.eq.master) then +#endif + write (iout,'(/a)') 'Thermal characteristics of folding' + if (nslice.eq.1) then + nazwa=prefix + else + nazwa=prefix(:ilen(prefix))//"_slice_"//licz2 + endif + iln=ilen(nazwa) + if (nparmset.eq.1 .and. .not.separate_parset) then + nazwa=nazwa(:iln)//".thermal" + else if (nparmset.eq.1 .and. separate_parset) then + write(licz3,"(bz,i3.3)") myparm + nazwa=nazwa(:iln)//"_par_"//licz3//".thermal" + endif + do iparm=1,nParmSet + if (nparmset.gt.1) then + write(licz3,"(bz,i3.3)") iparm + nazwa=nazwa(:iln)//"_par_"//licz3//".thermal" + endif + open(34,file=nazwa) + if (separate_parset) then + write (iout,'(a,i3)') "Parameter set",myparm + else + write (iout,'(a,i3)') "Parameter set",iparm + endif + do i=0,NGridT + betaT=1.0d0/(1.987D-3*(startGridT+i*delta_T)) + if (betaT.ge.beta_h(1,iparm)) then + potEmin=potEmin_all(1,iparm) + else if (betaT.lt.beta_h(nT_h(iparm),iparm)) then + potEmin=potEmin_all(nT_h(iparm),iparm) + else + do l=1,nT_h(iparm)-1 + if (betaT.le.beta_h(l,iparm) .and. + & betaT.gt.beta_h(l+1,iparm)) then + potEmin=potEmin_all(l,iparm) + exit + endif + enddo + endif + sumE(i,iparm)=sumE(i,iparm)/sumW(i,iparm) + sumEbis(i,iparm)=(startGridT+i*delta_T)*sumEbis(i,iparm)/ + & sumW(i,iparm) + sumEsq(i,iparm)=(sumEsq(i,iparm)/sumW(i,iparm) + & -sumE(i,iparm)**2)/(1.987D-3*(startGridT+i*delta_T)**2) + do j=1,nQ+2 + sumQ(j,i,iparm)=sumQ(j,i,iparm)/sumW(i,iparm) + sumQsq(j,i,iparm)=sumQsq(j,i,iparm)/sumW(i,iparm) + & -sumQ(j,i,iparm)**2 + sumEQ(j,i,iparm)=sumEQ(j,i,iparm)/sumW(i,iparm) + & -sumQ(j,i,iparm)*sumE(i,iparm) + enddo + sumW(i,iparm)=-dlog(sumW(i,iparm))*(1.987D-3* + & (startGridT+i*delta_T))+potEmin + write (iout,'(f7.1,2f15.5,$)') startGridT+i*delta_T, + & sumW(i,iparm),sumE(i,iparm) + write (iout,'(f10.5,$)') (sumQ(j,i,iparm),j=1,nQ+2) + write (iout,'(e15.5,$)') sumEsq(i,iparm)-sumEbis(i,iparm), + & (sumQsq(j,i,iparm),j=1,nQ+2),(sumEQ(j,i,iparm),j=1,nQ+2) + write (iout,*) + write (34,'(f7.1,2f15.5,$)') startGridT+i*delta_T, + & sumW(i,iparm),sumE(i,iparm) + write (34,'(f10.5,$)') (sumQ(j,i,iparm),j=1,nQ+2) + write (34,'(e15.5,$)') sumEsq(i,iparm)-sumEbis(i,iparm), + & (sumQsq(j,i,iparm),j=1,nQ+2),(sumEQ(j,i,iparm),j=1,nQ+2) + write (34,*) + enddo + close(34) + enddo + if (histout) then + do t=0,tmax + if (hfin_ent(t).gt.0.0d0) then + liczba=t + jj = mod(liczba,nbin1) + write (iout,'(f6.3,e20.10," ent")') dmin+(jj+0.5d0)*delta, + & hfin_ent(t) + if (histfile) write (ihist,'(f6.3,e20.10," ent")') + & dmin+(jj+0.5d0)*delta, + & hfin_ent(t) + endif + enddo + if (histfile) close(ihist) + endif + +#ifdef ZSCORE +! Write data for zscore + if (nslice.eq.1) then + zscname=prefix(:ilen(prefix))//".zsc" + else + zscname=prefix(:ilen(prefix))//"_slice_"//licz2//".zsc" + endif +#if defined(AIX) || defined(PGI) + open (izsc,file=prefix(:ilen(prefix))//'.zsc',position='append') +#else + open (izsc,file=prefix(:ilen(prefix))//'.zsc',access='append') +#endif + write (izsc,'("NQ=",i1," NPARM=",i1)') nQ,nParmSet + do iparm=1,nParmSet + write (izsc,'("NT=",i1)') nT_h(iparm) + do ib=1,nT_h(iparm) + write (izsc,'("TEMP=",f6.1," NR=",i2," SNK=",$)') + & 1.0d0/(beta_h(ib,iparm)*1.987D-3),nR(ib,iparm) + jj = min0(nR(ib,iparm),7) + write (izsc,'(i8,$)') (snk(i,ib,iparm,islice),i=1,jj) + write (izsc,'(a1,$)') (" ",i=22+8*jj+1,79) + write (izsc,'("&")') + if (nR(ib,iparm).gt.7) then + do ii=8,nR(ib,iparm),9 + jj = min0(nR(ib,iparm),ii+8) + write (izsc,'(i8,$)') (snk(i,ib,iparm,islice),i=ii,jj) + write (izsc,'(a1,$') (" ",i=(jj-ii+1)*8+1,79) + write (izsc,'("&")') + enddo + endif + write (izsc,'("FI=",$)') + jj=min0(nR(ib,iparm),7) + write (izsc,'(f10.5,$)') (fi(i,ib,iparm),i=1,jj) + write (izsc,'(a1,$)') (" ",i=3+10*jj+1,79) + write (izsc,'("&")') + if (nR(ib,iparm).gt.7) then + do ii=8,nR(ib,iparm),9 + jj = min0(nR(ib,iparm),ii+8) + write (izsc,'(f10.5,$)') (fi(i,ib,iparm),i=ii,jj) + if (jj.eq.nR(ib,iparm)) then + write (izsc,*) + else + write (izsc,'(a1,$)') (" ",i=10*(jj-ii+1)+1,79) + write (izsc,'(t80,"&")') + endif + enddo + endif + do i=1,nR(ib,iparm) + write (izsc,'("KH=",$)') + write (izsc,'(f7.2,$)') (Kh(j,i,ib,iparm),j=1,nQ) + write (izsc,'(" Q0=",$)') + write (izsc,'(f7.5,$)') (q0(j,i,ib,iparm),j=1,nQ) + write (izsc,*) + enddo + enddo + enddo + close(izsc) +#endif +#ifdef MPI + endif +#endif + + return + end diff --git a/source/wham/src-NEWSC/wham_calc1.F.safe b/source/wham/src-NEWSC/wham_calc1.F.safe new file mode 100755 index 0000000..f51dcc4 --- /dev/null +++ b/source/wham/src-NEWSC/wham_calc1.F.safe @@ -0,0 +1,1195 @@ + subroutine WHAM_CALC(islice,*) +! Weighed Histogram Analysis Method (WHAM) code +! Written by A. Liwo based on the work of Kumar et al., +! J.Comput.Chem., 13, 1011 (1992) +! +! 2/1/05 Multiple temperatures allowed. +! 2/2/05 Free energies calculated directly from data points +! acc. to Eq. (21) of Kumar et al.; final histograms also +! constructed based on this equation. +! 2/12/05 Multiple parameter sets included +! +! 2/2/05 Parallel version + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" + integer nGridT + parameter (NGridT=400) + integer MaxBinRms,MaxBinRgy + parameter (MaxBinRms=100,MaxBinRgy=100) + integer MaxHdim +c parameter (MaxHdim=200000) + parameter (MaxHdim=200) + integer maxinde + parameter (maxinde=200) +#ifdef MPI + include "mpif.h" + include "COMMON.MPI" + integer ierror,errcode,status(MPI_STATUS_SIZE) +#endif + include "COMMON.CONTROL" + include "COMMON.IOUNITS" + include "COMMON.FREE" + include "COMMON.ENERGIES" + include "COMMON.FFIELD" + include "COMMON.SBRIDGE" + include "COMMON.PROT" + include "COMMON.ENEPS" + integer MaxPoint,MaxPointProc + parameter (MaxPoint=MaxStr, + & MaxPointProc=MaxStr_Proc) + double precision finorm_max,potfac,entmin,entmax,expfac,vf + parameter (finorm_max=1.0d0) + integer islice + integer i,ii,j,jj,k,kk,l,m,ind,iter,t,tmax,ient,ientmax,iln + integer start,end,iharm,ib,iib,nbin1,nbin,nbin_rms,nbin_rgy, + & nbin_rmsrgy,liczba,iparm,nFi,indrgy,indrms + integer htot(0:MaxHdim),histent(0:2000) + double precision v(MaxPointProc,MaxR,MaxT_h,Max_Parm) + double precision energia(0:max_ene) +#ifdef MPI + integer tmax_t,upindE_p + double precision fi_p(MaxR,MaxT_h,Max_Parm) + double precision sumW_p(0:nGridT,Max_Parm), + & sumE_p(0:nGridT,Max_Parm),sumEsq_p(0:nGridT,Max_Parm), + & sumQ_p(MaxQ1,0:nGridT,Max_Parm), + & sumQsq_p(MaxQ1,0:nGridT,Max_Parm), + & sumEQ_p(MaxQ1,0:nGridT,Max_Parm), + & sumEprim_p(MaxQ1,0:nGridT,Max_Parm), + & sumEbis_p(0:nGridT,Max_Parm) + double precision hfin_p(0:MaxHdim,maxT_h), + & hfin_ent_p(0:MaxHdim),histE_p(0:maxindE),sumH, + & hrmsrgy_p(0:MaxBinRgy,0:MaxBinRms,maxT_h) + double precision rgymin_t,rmsmin_t,rgymax_t,rmsmax_t + double precision potEmin_t,entmin_p,entmax_p + integer histent_p(0:2000) + logical lprint /.true./ +#endif + double precision delta_T /1.0d0/ + double precision rgymin,rmsmin,rgymax,rmsmax + double precision sumW(0:NGridT,Max_Parm),sumE(0:NGridT,Max_Parm), + & sumEsq(0:NGridT,Max_Parm),sumQ(MaxQ1,0:NGridT,Max_Parm), + & sumQsq(MaxQ1,0:NGridT,Max_Parm),sumEQ(MaxQ1,0:NGridT,Max_Parm), + & sumEprim(0:NGridT,Max_Parm),sumEbis(0:NGridT,Max_Parm),betaT, + & weight,econstr + double precision fi(MaxR,maxT_h,Max_Parm), + & dd,dd1,dd2,hh,dmin,denom,finorm,avefi,pom, + & hfin(0:MaxHdim,maxT_h),histE(0:maxindE), + & hrmsrgy(0:MaxBinRgy,0:MaxBinRms,maxT_h), + & potEmin,ent, + & hfin_ent(0:MaxHdim),vmax,aux + double precision fT(6),fTprim(6),fTbis(6),quot,quotl1,quotl,kfacl, + & eprim,ebis,temper,kfac/2.4d0/,T0/300.0d0/,startGridT/200.0d0/, + & eplus,eminus,logfac,tanhT,tt + double precision etot,evdw,evdw_t,evdw2,ees,evdw1,ebe,etors, + & escloc,ehpb,ecorr,ecorr5,ecorr6,eello_turn4,eello_turn3, + & eturn6,eel_loc,edihcnstr,etors_d,estr,evdw2_14,esccor + + integer ind_point(maxpoint),upindE,indE + character*16 plik + character*1 licz1 + character*2 licz2 + character*3 licz3 + character*128 nazwa + integer ilen + external ilen + + write(licz2,'(bz,i2.2)') islice + nbin1 = 1.0d0/delta + write (iout,'(//80(1h-)/"Solving WHAM equations for slice", + & i2/80(1h-)//)') islice + write (iout,*) "delta",delta," nbin1",nbin1 + write (iout,*) "MaxN",MaxN," MaxQ",MaxQ," MaHdim",MaxHdim + call flush(iout) + dmin=0.0d0 + tmax=0 + potEmin=1.0d10 + rgymin=1.0d10 + rmsmin=1.0d10 + rgymax=0.0d0 + rmsmax=0.0d0 + do t=0,MaxN + htot(t)=0 + enddo +#ifdef MPI + do i=1,scount(me1) +#else + do i=1,ntot(islice) +#endif + do j=1,nParmSet + if (potE(i,j).le.potEmin) potEmin=potE(i,j) + enddo + if (q(nQ+1,i).lt.rmsmin) rmsmin=q(nQ+1,i) + if (q(nQ+1,i).gt.rmsmax) rmsmax=q(nQ+1,i) + if (q(nQ+2,i).lt.rgymin) rgymin=q(nQ+2,i) + if (q(nQ+2,i).gt.rgymax) rgymax=q(nQ+2,i) + ind_point(i)=0 + do j=nQ,1,-1 + ind=(q(j,i)-dmin+1.0d-8)/delta + if (j.eq.1) then + ind_point(i)=ind_point(i)+ind + else + ind_point(i)=ind_point(i)+nbin1**(j-1)*ind + endif +c write (iout,*) "i",i," j",j," q",q(j,i)," ind_point", +c & ind_point(i) + call flush(iout) + if (ind_point(i).lt.0 .or. ind_point(i).gt.MaxHdim) then + write (iout,*) "Error - index exceeds range for point",i, + & " q=",q(j,i)," ind",ind_point(i) +#ifdef MPI + write (iout,*) "Processor",me1 + call flush(iout) + call MPI_Abort(MPI_COMM_WORLD, Ierror, Errcode ) +#endif + stop + endif + enddo ! j + if (ind_point(i).gt.tmax) tmax=ind_point(i) + htot(ind_point(i))=htot(ind_point(i))+1 +#ifdef DEBUG + write (iout,*) "i",i,"q",(q(j,i),j=1,nQ)," ind",ind_point(i), + & " htot",htot(ind_point(i)) + call flush(iout) +#endif + enddo ! i + call flush(iout) + + nbin=nbin1**nQ-1 + write (iout,'(a)') "Numbers of counts in Q bins" + do t=0,tmax + if (htot(t).gt.0) then + write (iout,'(i15,$)') t + liczba=t + do j=1,nQ + jj = mod(liczba,nbin1) + liczba=liczba/nbin1 + write (iout,'(i5,$)') jj + enddo + write (iout,'(i8)') htot(t) + endif + enddo + do iparm=1,nParmSet + write (iout,'(a,i3)') "Number of data points for parameter set", + & iparm + write (iout,'(i7,$)') ((snk(m,ib,iparm,islice),m=1,nr(ib,iparm)), + & ib=1,nT_h(iparm)) + write (iout,'(i8)') stot(islice) + write (iout,'(a)') + enddo + call flush(iout) + +#ifdef MPI + call MPI_AllReduce(tmax,tmax_t,1,MPI_INTEGER,MPI_MAX, + & WHAM_COMM,IERROR) + tmax=tmax_t + call MPI_AllReduce(potEmin,potEmin_t,1,MPI_DOUBLE_PRECISION, + & MPI_MIN,WHAM_COMM,IERROR) + call MPI_AllReduce(rmsmin,rmsmin_t,1,MPI_DOUBLE_PRECISION, + & MPI_MIN,WHAM_COMM,IERROR) + call MPI_AllReduce(rmsmax,rmsmax_t,1,MPI_DOUBLE_PRECISION, + & MPI_MAX,WHAM_COMM,IERROR) + call MPI_AllReduce(rgymin,rgymin_t,1,MPI_DOUBLE_PRECISION, + & MPI_MIN,WHAM_COMM,IERROR) + call MPI_AllReduce(rgymax,rgymax_t,1,MPI_DOUBLE_PRECISION, + & MPI_MAX,WHAM_COMM,IERROR) + potEmin=potEmin_t/2 + rgymin=rgymin_t + rgymax=rgymax_t + rmsmin=rmsmin_t + rmsmax=rmsmax_t + write (iout,*) "potEmin",potEmin +#endif + rmsmin=deltrms*dint(rmsmin/deltrms) + rmsmax=deltrms*dint(rmsmax/deltrms) + rgymin=deltrms*dint(rgymin/deltrgy) + rgymax=deltrms*dint(rgymax/deltrgy) + nbin_rms=(rmsmax-rmsmin)/deltrms + nbin_rgy=(rgymax-rgymin)/deltrgy + write (iout,*) "rmsmin",rmsmin," rmsmax",rmsmax," rgymin",rgymin, + & " rgymax",rgymax," nbin_rms",nbin_rms," nbin_rgy",nbin_rgy + nFi=0 + do i=1,nParmSet + do j=1,nT_h(i) + nFi=nFi+nR(j,i) + enddo + enddo + write (iout,*) "nFi",nFi +! Compute the Boltzmann factor corresponing to restrain potentials in different +! simulations. +#ifdef MPI + do i=1,scount(me1) +#else + do i=1,ntot(islice) +#endif +c write (9,'(3i5,f10.5)') i,(iparm,potE(i,iparm),iparm=1,nParmSet) + do iparm=1,nParmSet +#ifdef DEBUG + write (iout,'(2i5,21f8.2)') i,iparm, + & (enetb(k,i,iparm),k=1,21) +#endif + call restore_parm(iparm) +#ifdef DEBUG + write (iout,*) wsc,wscp,welec,wvdwpp,wang,wtor,wscloc, + & wcorr,wcorr5,wcorr6,wturn4,wturn3,wturn6,wel_loc, + & wtor_d,wsccor,wbond +#endif + do ib=1,nT_h(iparm) + if (rescale_mode.eq.1) then + quot=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0) + quotl=1.0d0 + kfacl=1.0d0 + do l=1,5 + quotl1=quotl + quotl=quotl*quot + kfacl=kfacl*kfac + fT(l)=kfacl/(kfacl-1.0d0+quotl) + enddo +#if defined(FUNCTH) + tt = 1.0d0/(beta_h(ib,iparm)*1.987D-3) + ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0 +#elif defined(FUNCT) + ft(6)=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0) +#else + ft(6)=1.0d0 +#endif + else if (rescale_mode.eq.2) then + quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3) + quotl=1.0d0 + do l=1,5 + quotl=quotl*quot + fT(l)=1.12692801104297249644d0/ + & dlog(dexp(quotl)+dexp(-quotl)) + enddo +#if defined(FUNCTH) + tt = 1.0d0/(beta_h(ib,iparm)*1.987D-3) + ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0 +#elif defined(FUNCT) + ft(6)=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0) +#else + ft(6)=1.0d0 +#endif +c write (iout,*) 1.0d0/(beta_h(ib,iparm)*1.987D-3),ft + else if (rescale_mode.eq.0) then + do l=1,6 + fT(l)=1.0d0 + enddo + else + write (iout,*) "Error in WHAM_CALC: wrong RESCALE_MODE", + & rescale_mode + call flush(iout) + return1 + endif + evdw=enetb(1,i,iparm) + evdw_t=enetb(21,i,iparm) +#ifdef SCP14 + evdw2_14=enetb(17,i,iparm) + evdw2=enetb(2,i,iparm)+evdw2_14 +#else + evdw2=enetb(2,i,iparm) + evdw2_14=0.0d0 +#endif +#ifdef SPLITELE + ees=enetb(3,i,iparm) + evdw1=enetb(16,i,iparm) +#else + ees=enetb(3,i,iparm) + evdw1=0.0d0 +#endif + ecorr=enetb(4,i,iparm) + ecorr5=enetb(5,i,iparm) + ecorr6=enetb(6,i,iparm) + eel_loc=enetb(7,i,iparm) + eello_turn3=enetb(8,i,iparm) + eello_turn4=enetb(9,i,iparm) + eturn6=enetb(10,i,iparm) + ebe=enetb(11,i,iparm) + escloc=enetb(12,i,iparm) + etors=enetb(13,i,iparm) + etors_d=enetb(14,i,iparm) + ehpb=enetb(15,i,iparm) + estr=enetb(18,i,iparm) + esccor=enetb(19,i,iparm) + edihcnstr=enetb(20,i,iparm) +#ifdef DEBUG + write (iout,'(3i5,6f5.2,14f12.3)') i,ib,iparm,(ft(l),l=1,6), + & evdw+evdw_t,evdw2,ees,evdw1,ecorr,eel_loc,estr,ebe,escloc, + & etors,etors_d,eello_turn3,eello_turn4,esccor +#endif + +#ifdef SPLITELE + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees + & +wvdwpp*evdw1 + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc + & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr +#else + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2 + & +ft(1)*welec*(ees+evdw1) + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr + & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr +#endif +#ifdef DEBUG + write (iout,*) i,iparm,1.0d0/(beta_h(ib,iparm)*1.987D-3), + & etot,potEmin +#endif +#ifdef DEBUG + if (iparm.eq.1 .and. ib.eq.1) then + write (iout,*)"Conformation",i + energia(0)=etot + do k=1,max_ene + energia(k)=enetb(k,i,iparm) + enddo + call enerprint(energia(0),fT) + endif +#endif + do kk=1,nR(ib,iparm) + Econstr=0.0d0 + do j=1,nQ + dd = q(j,i) + Econstr=Econstr+Kh(j,kk,ib,iparm) + & *(dd-q0(j,kk,ib,iparm))**2 + enddo + v(i,kk,ib,iparm)= + & -beta_h(ib,iparm)*(etot-potEmin+Econstr) +#ifdef DEBUG + write (iout,'(4i5,4e15.5)') i,kk,ib,iparm, + & etot,potEmin,etot-potEmin,v(i,kk,ib,iparm) +#endif + enddo ! kk + enddo ! ib + enddo ! iparm + enddo ! i +! Simple iteration to calculate free energies corresponding to all simulation +! runs. + do iter=1,maxit + +! Compute new free-energy values corresponding to the righ-hand side of the +! equation and their derivatives. + write (iout,*) "------------------------fi" +#ifdef MPI + do t=1,scount(me1) +#else + do t=1,ntot(islice) +#endif + vmax=-1.0d+20 + do i=1,nParmSet + do k=1,nT_h(i) + do l=1,nR(k,i) + vf=v(t,l,k,i)+f(l,k,i) + if (vf.gt.vmax) vmax=vf + enddo + enddo + enddo + denom=0.0d0 + do i=1,nParmSet + do k=1,nT_h(i) + do l=1,nR(k,i) + aux=f(l,k,i)+v(t,l,k,i)-vmax + if (aux.gt.-200.0d0) + & denom=denom+snk(l,k,i,islice)*dexp(aux) + enddo + enddo + enddo + entfac(t)=-dlog(denom)-vmax +#ifdef DEBUG + write (iout,*) t,"vmax",vmax," denom",denom,"entfac",entfac(t) +#endif + enddo + do iparm=1,nParmSet + do iib=1,nT_h(iparm) + do ii=1,nR(iib,iparm) +#ifdef MPI + fi_p(ii,iib,iparm)=0.0d0 + do t=1,scount(me) + fi_p(ii,iib,iparm)=fi_p(ii,iib,iparm) + & +dexp(v(t,ii,iib,iparm)+entfac(t)) +#ifdef DEBUG + write (iout,'(4i5,3e15.5)') t,ii,iib,iparm, + & v(t,ii,iib,iparm),entfac(t),fi_p(ii,iib,iparm) +#endif + enddo +#else + fi(ii,iib,iparm)=0.0d0 + do t=1,ntot(islice) + fi(ii,iib,iparm)=fi(ii,iib,iparm) + & +dexp(v(t,ii,iib,iparm)+entfac(t)) + enddo +#endif + enddo ! ii + enddo ! iib + enddo ! iparm + +#ifdef MPI +#ifdef DEBUG + write (iout,*) "fi before MPI_Reduce me",me,' master',master + do iparm=1,nParmSet + do ib=1,nT_h(nparmset) + write (iout,*) "iparm",iparm," ib",ib + write (iout,*) "beta=",beta_h(ib,iparm) + write (iout,'(8e15.5)') (fi_p(i,ib,iparm),i=1,nR(ib,iparm)) + enddo + enddo +#endif + write (iout,*) "REDUCE size",maxR,MaxT_h,nParmSet, + & maxR*MaxT_h*nParmSet + write (iout,*) "MPI_COMM_WORLD",MPI_COMM_WORLD, + & " WHAM_COMM",WHAM_COMM + call MPI_Reduce(fi_p(1,1,1),fi(1,1,1),maxR*MaxT_h*nParmSet, + & MPI_DOUBLE_PRECISION, + & MPI_SUM,Master,WHAM_COMM,IERROR) +#ifdef DEBUG + write (iout,*) "fi after MPI_Reduce nparmset",nparmset + do iparm=1,nParmSet + write (iout,*) "iparm",iparm + do ib=1,nT_h(iparm) + write (iout,*) "beta=",beta_h(ib,iparm) + write (iout,'(8e15.5)') (fi(i,ib,iparm),i=1,nR(ib,iparm)) + enddo + enddo +#endif + if (me1.eq.Master) then +#endif + avefi=0.0d0 + do iparm=1,nParmSet + do ib=1,nT_h(iparm) + do i=1,nR(ib,iparm) + fi(i,ib,iparm)=-dlog(fi(i,ib,iparm)) + avefi=avefi+fi(i,ib,iparm) + enddo + enddo + enddo + avefi=avefi/nFi + do iparm=1,nParmSet + write (iout,*) "Parameter set",iparm + do ib =1,nT_h(iparm) + write (iout,*) "beta=",beta_h(ib,iparm) + do i=1,nR(ib,iparm) + fi(i,ib,iparm)=fi(i,ib,iparm)-avefi + enddo + write (iout,'(8f10.5)') (fi(i,ib,iparm),i=1,nR(ib,iparm)) + write (iout,'(8f10.5)') (f(i,ib,iparm),i=1,nR(ib,iparm)) + enddo + enddo + +! Compute the norm of free-energy increments. + finorm=0.0d0 + do iparm=1,nParmSet + do ib=1,nT_h(iparm) + do i=1,nR(ib,iparm) + finorm=finorm+dabs(fi(i,ib,iparm)-f(i,ib,iparm)) + f(i,ib,iparm)=fi(i,ib,iparm) + enddo + enddo + enddo + + write (iout,*) 'Iteration',iter,' finorm',finorm + +#ifdef MPI + endif + call MPI_Bcast(f(1,1,1),MaxR*MaxT_h*nParmSet, + & MPI_DOUBLE_PRECISION,Master, + & WHAM_COMM,IERROR) + call MPI_Bcast(finorm,1,MPI_DOUBLE_PRECISION,Master, + & WHAM_COMM,IERROR) +#endif +! Exit, if the increment norm is smaller than pre-assigned tolerance. + if (finorm.lt.fimin) then + write (iout,*) 'Iteration converged' + goto 20 + endif + + enddo ! iter + + 20 continue +! Now, put together the histograms from all simulations, in order to get the +! unbiased total histogram. +#ifdef MPI + do t=0,tmax + hfin_ent_p(t)=0.0d0 + enddo +#else + do t=0,tmax + hfin_ent(t)=0.0d0 + enddo +#endif + write (iout,*) "--------------hist" +#ifdef MPI + do iparm=1,nParmSet + do i=0,nGridT + sumW_p(i,iparm)=0.0d0 + sumE_p(i,iparm)=0.0d0 + sumEbis_p(i,iparm)=0.0d0 + sumEsq_p(i,iparm)=0.0d0 + do j=1,nQ+2 + sumQ_p(j,i,iparm)=0.0d0 + sumQsq_p(j,i,iparm)=0.0d0 + sumEQ_p(j,i,iparm)=0.0d0 + enddo + enddo + enddo + upindE_p=0 +#else + do iparm=1,nParmSet + do i=0,nGridT + sumW(i,iparm)=0.0d0 + sumE(i,iparm)=0.0d0 + sumEbis(i,iparm)=0.0d0 + sumEsq(i,iparm)=0.0d0 + do j=1,nQ+2 + sumQ(j,i,iparm)=0.0d0 + sumQsq(j,i,iparm)=0.0d0 + sumEQ(j,i,iparm)=0.0d0 + enddo + enddo + enddo + upindE=0 +#endif +c 8/26/05 entropy distribution +#ifdef MPI + entmin_p=1.0d10 + entmax_p=-1.0d10 + do t=1,scount(me1) +c ent=-dlog(entfac(t)) + ent=entfac(t) + if (ent.lt.entmin_p) entmin_p=ent + if (ent.gt.entmax_p) entmax_p=ent + enddo + write (iout,*) "entmin",entmin_p," entmax",entmax_p + call flush(iout) + call MPI_Allreduce(entmin_p,entmin,1,MPI_DOUBLE_PRECISION,MPI_MIN, + & WHAM_COMM,IERROR) + call MPI_Allreduce(entmax_p,entmax,1,MPI_DOUBLE_PRECISION,MPI_MAX, + & WHAM_COMM,IERROR) + ientmax=entmax-entmin + if (ientmax.gt.2000) ientmax=2000 + write (iout,*) "entmin",entmin," entmax",entmax," ientmax",ientmax + call flush(iout) + do t=1,scount(me1) +c ient=-dlog(entfac(t))-entmin + ient=entfac(t)-entmin + if (ient.le.2000) histent_p(ient)=histent_p(ient)+1 + enddo + call MPI_Allreduce(histent_p(0),histent(0),ientmax+1,MPI_INTEGER, + & MPI_SUM,WHAM_COMM,IERROR) + if (me1.eq.Master) then + write (iout,*) "Entropy histogram" + do i=0,ientmax + write(iout,'(f15.4,i10)') entmin+i,histent(i) + enddo + endif +#else + entmin=1.0d10 + entmax=-1.0d10 + do t=1,ntot(islice) + ent=entfac(t) + if (ent.lt.entmin) entmin=ent + if (ent.gt.entmax) entmax=ent + enddo + ientmax=-dlog(entmax)-entmin + if (ientmax.gt.2000) ientmax=2000 + do t=1,ntot(islice) + ient=entfac(t)-entmin + if (ient.le.2000) histent(ient)=histent(ient)+1 + enddo + write (iout,*) "Entropy histogram" + do i=0,ientmax + write(iout,'(2f15.4)') entmin+i,histent(i) + enddo +#endif + +#ifdef MPI +c write (iout,*) "me1",me1," scount",scount(me1) + + do iparm=1,nParmSet + +#ifdef MPI + do ib=1,nT_h(iparm) + do t=0,tmax + hfin_p(t,ib)=0.0d0 + enddo + enddo + do i=1,maxindE + histE_p(i)=0.0d0 + enddo +#else + do ib=1,nT_h(iparm) + do t=0,tmax + hfin(t,ib)=0.0d0 + enddo + enddo + do i=1,maxindE + histE(i)=0.0d0 + enddo +#endif + do ib=1,nT_h(iparm) + do i=0,MaxBinRms + do j=0,MaxBinRgy + hrmsrgy(j,i,ib)=0.0d0 +#ifdef MPI + hrmsrgy_p(j,i,ib)=0.0d0 +#endif + enddo + enddo + enddo + + do t=1,scount(me1) +#else + do t=1,ntot(islice) +#endif + ind = ind_point(t) +#ifdef MPI + hfin_ent_p(ind)=hfin_ent_p(ind)+dexp(entfac(t)) +#else + hfin_ent(ind)=hfin_ent(ind)+dexp(entfac(t)) +#endif +c write (iout,'(2i5,20f8.2)') t,t,(enetb(k,t,iparm),k=1,18) + call restore_parm(iparm) + evdw=enetb(21,t,iparm) + evdw_t=enetb(1,t,iparm) +#ifdef SCP14 + evdw2_14=enetb(17,t,iparm) + evdw2=enetb(2,t,iparm)+evdw2_14 +#else + evdw2=enetb(2,t,iparm) + evdw2_14=0.0d0 +#endif +#ifdef SPLITELE + ees=enetb(3,t,iparm) + evdw1=enetb(16,t,iparm) +#else + ees=enetb(3,t,iparm) + evdw1=0.0d0 +#endif + ecorr=enetb(4,t,iparm) + ecorr5=enetb(5,t,iparm) + ecorr6=enetb(6,t,iparm) + eel_loc=enetb(7,t,iparm) + eello_turn3=enetb(8,t,iparm) + eello_turn4=enetb(9,t,iparm) + eturn6=enetb(10,t,iparm) + ebe=enetb(11,t,iparm) + escloc=enetb(12,t,iparm) + etors=enetb(13,t,iparm) + etors_d=enetb(14,t,iparm) + ehpb=enetb(15,t,iparm) + estr=enetb(18,t,iparm) + esccor=enetb(19,t,iparm) + edihcnstr=enetb(20,t,iparm) + edihcnstr=0.0d0 + do k=0,nGridT + betaT=startGridT+k*delta_T + temper=betaT +c fT=T0/betaT +c ft=2*T0/(T0+betaT) + if (rescale_mode.eq.1) then + quot=betaT/T0 + quotl=1.0d0 + kfacl=1.0d0 + do l=1,5 + quotl1=quotl + quotl=quotl*quot + kfacl=kfacl*kfac + denom=kfacl-1.0d0+quotl + fT(l)=kfacl/denom + ftprim(l)=-l*ft(l)*quotl1/(T0*denom) + ftbis(l)=l*kfacl*quotl1* + & (2*l*quotl-(l-1)*denom)/(quot*t0*t0*denom**3) + enddo +#if defined(FUNCTH) + ft(6)=(320.0d0+80.0d0*dtanh((betaT-320.0d0)/80.0d0))/ + & 320.0d0 + ftprim(6)=1.0d0/(320.0d0*dcosh((betaT-320.0d0)/80.0d0)**2) + ftbis(6)=-2.0d0*dtanh((betaT-320.0d0)/80.0d0) + & /(320.0d0*80.0d0*dcosh((betaT-320.0d0)/80.0d0)**3) +#elif defined(FUNCT) + fT(6)=betaT/T0 + ftprim(6)=1.0d0/T0 + ftbis(6)=0.0d0 +#else + fT(6)=1.0d0 + ftprim(6)=0.0d0 + ftbis(6)=0.0d0 +#endif + else if (rescale_mode.eq.2) then + quot=betaT/T0 + quotl=1.0d0 + do l=1,5 + quotl1=quotl + quotl=quotl*quot + eplus=dexp(quotl) + eminus=dexp(-quotl) + logfac=1.0d0/dlog(eplus+eminus) + tanhT=(eplus-eminus)/(eplus+eminus) + fT(l)=1.12692801104297249644d0*logfac + ftprim(l)=-l*quotl1*ft(l)*tanhT*logfac/T0 + ftbis(l)=(l-1)*ftprim(l)/(quot*T0)- + & 2*l*quotl1/T0*logfac* + & (2*l*quotl1*ft(l)/(T0*(eplus+eminus)**2) + & +ftprim(l)*tanhT) + enddo +#if defined(FUNCTH) + ft(6)=(320.0d0+80.0d0*dtanh((betaT-320.0d0)/80.0d0))/ + & 320.0d0 + ftprim(6)=1.0d0/(320.0d0*dcosh((betaT-320.0d0)/80.0d0)**2) + ftbis(6)=-2.0d0*dtanh((betaT-320.0d0)/80.0d0) + & /(320.0d0*80.0d0*dcosh((betaT-320.0d0)/80.0d0)**3) +#elif defined(FUNCT) + fT(6)=betaT/T0 + ftprim(6)=1.0d0/T0 + ftbis(6)=0.0d0 +#else + fT(6)=1.0d0 + ftprim(6)=0.0d0 + ftbis(6)=0.0d0 +#endif + else if (rescale_mode.eq.0) then + do l=1,5 + fT(l)=1.0d0 + ftprim(l)=0.0d0 + enddo + else + write (iout,*) "Error in WHAM_CALC: wrong RESCALE_MODE", + & rescale_mode + call flush(iout) + return1 + endif +c write (iout,*) "ftprim",ftprim +c write (iout,*) "ftbis",ftbis + betaT=1.0d0/(1.987D-3*betaT) +#ifdef SPLITELE + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees + & +wvdwpp*evdw1 + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc + & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr + eprim=ftprim(6)*evdw_t+ftprim(1)*welec*ees + & +ftprim(1)*wtor*etors+ + & ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+ + & ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+ + & ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eturn6+ + & ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+ + & ftprim(1)*wsccor*esccor + ebis=ftbis(1)*welec*ees+ftbis(1)*wtor*etors+ + & ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+ + & ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+ + & ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eturn6+ + & ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+ + & ftbis(1)*wsccor*esccor +#else + etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2 + & +ft(1)*welec*(ees+evdw1) + & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 + & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 + & +ft(2)*wturn3*eello_turn3 + & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr + & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor + & +wbond*estr + eprim=ftprim(6)*evdw_t+ftprim(1)*welec*(ees+evdw1) + & +ftprim(1)*wtor*etors+ + & ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+ + & ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+ + & ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eturn6+ + & ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+ + & ftprim(1)*wsccor*esccor + ebis=ftbis(1)*welec*(ees+evdw1)+ftbis(1)*wtor*etors+ + & ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+ + & ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+ + & ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eturn6+ + & ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+ + & ftprim(1)*wsccor*esccor +#endif + weight=dexp(-betaT*(etot-potEmin)+entfac(t)) +#define DEBUG +#ifdef DEBUG + write (iout,*) "iparm",iparm," t",t," betaT",betaT, + & " etot",etot," entfac",entfac(t), + & " weight",weight," ebis",ebis +#endif +#undef DEBUG + etot=etot-temper*eprim +#ifdef MPI + sumW_p(k,iparm)=sumW_p(k,iparm)+weight + sumE_p(k,iparm)=sumE_p(k,iparm)+etot*weight + sumEbis_p(k,iparm)=sumEbis_p(k,iparm)+ebis*weight + sumEsq_p(k,iparm)=sumEsq_p(k,iparm)+etot**2*weight + do j=1,nQ+2 + sumQ_p(j,k,iparm)=sumQ_p(j,k,iparm)+q(j,t)*weight + sumQsq_p(j,k,iparm)=sumQsq_p(j,k,iparm)+q(j,t)**2*weight + sumEQ_p(j,k,iparm)=sumEQ_p(j,k,iparm) + & +etot*q(j,t)*weight + enddo +#else + sumW(k,iparm)=sumW(k,iparm)+weight + sumE(k,iparm)=sumE(k,iparm)+etot*weight + sumEbis(k,iparm)=sumEbis(k,iparm)+ebis*weight + sumEsq(k,iparm)=sumEsq(k,iparm)+etot**2*weight + do j=1,nQ+2 + sumQ(j,k,iparm)=sumQ(j,k,iparm)+q(j,t)*weight + sumQsq(j,k,iparm)=sumQsq(j,k,iparm)+q(j,t)**2*weight + sumEQ(j,k,iparm)=sumEQ(j,k,iparm) + & +etot*q(j,t)*weight + enddo +#endif + enddo + indE = aint(potE(t,iparm)-aint(potEmin)) + if (indE.ge.0 .and. indE.le.maxinde) then + if (indE.gt.upindE_p) upindE_p=indE + histE_p(indE)=histE_p(indE)+dexp(-entfac(t)) + endif +#ifdef MPI + do ib=1,nT_h(iparm) + expfac=dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t)) + hfin_p(ind,ib)=hfin_p(ind,ib)+ + & dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t)) + if (rmsrgymap) then + indrgy=dint((q(nQ+2,t)-rgymin)/deltrgy) + indrms=dint((q(nQ+1,t)-rmsmin)/deltrms) + hrmsrgy_p(indrgy,indrms,ib)= + & hrmsrgy_p(indrgy,indrms,ib)+expfac + endif + enddo +#else + do ib=1,nT_h(iparm) + expfac=dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t)) + hfin(ind,ib)=hfin(ind,ib)+ + & dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t)) + if (rmsrgymap) then + indrgy=dint((q(nQ+2,t)-rgymin)/deltrgy) + indrms=dint((q(nQ+1,t)-rmsmin)/deltrms) + hrmsrgy(indrgy,indrms,ib)= + & hrmsrgy(indrgy,indrms,ib)+expfac + endif + enddo +#endif + enddo ! t + do ib=1,nT_h(iparm) + if (histout) call MPI_Reduce(hfin_p(0,ib),hfin(0,ib),nbin, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + if (rmsrgymap) then + call MPI_Reduce(hrmsrgy_p(0,0,ib),hrmsrgy(0,0,ib), + & (MaxBinRgy+1)*(nbin_rms+1),MPI_DOUBLE_PRECISION,MPI_SUM,Master, + & WHAM_COMM,IERROR) + endif + enddo + call MPI_Reduce(upindE_p,upindE,1, + & MPI_INTEGER,MPI_MAX,Master,WHAM_COMM,IERROR) + call MPI_Reduce(histE_p(0),histE(0),maxindE, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + + if (me1.eq.master) then + + if (histout) then + + write (iout,'(6x,$)') + write (iout,'(f20.2,$)') (1.0d0/(1.987D-3*beta_h(ib,iparm)), + & ib=1,nT_h(iparm)) + write (iout,*) + + write (iout,'(/a)') 'Final histograms' + if (histfile) then + if (nslice.eq.1) then + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//'_par'//licz3//'.hist' + else + histname=prefix(:ilen(prefix))//'.hist' + endif + else + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//'_par'//licz3// + & '_slice_'//licz2//'.hist' + else + histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.hist' + endif + endif +#if defined(AIX) || defined(PGI) + open (ihist,file=histname,position='append') +#else + open (ihist,file=histname,access='append') +#endif + endif + + do t=0,tmax + liczba=t + sumH=0.0d0 + do ib=1,nT_h(iparm) + sumH=sumH+hfin(t,ib) + enddo + if (sumH.gt.0.0d0) then + do j=1,nQ + jj = mod(liczba,nbin1) + liczba=liczba/nbin1 + write (iout,'(f6.3,$)') dmin+(jj+0.5d0)*delta + if (histfile) + & write (ihist,'(f6.3,$)') dmin+(jj+0.5d0)*delta + enddo + do ib=1,nT_h(iparm) + write (iout,'(e20.10,$)') hfin(t,ib) + if (histfile) write (ihist,'(e20.10,$)') hfin(t,ib) + enddo + write (iout,'(i5)') iparm + if (histfile) write (ihist,'(i5)') iparm + endif + enddo + + endif + + if (entfile) then + if (nslice.eq.1) then + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//"_par"//licz3//'.ent' + else + histname=prefix(:ilen(prefix))//'.ent' + endif + else + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//'par_'//licz3// + & '_slice_'//licz2//'.ent' + else + histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.ent' + endif + endif +#if defined(AIX) || defined(PGI) + open (ihist,file=histname,position='append') +#else + open (ihist,file=histname,access='append') +#endif + write (ihist,'(a)') "# Microcanonical entropy" + do i=0,upindE + write (ihist,'(f8.0,$)') dint(potEmin)+i + if (histE(i).gt.0.0e0) then + write (ihist,'(f15.5,$)') dlog(histE(i)) + else + write (ihist,'(f15.5,$)') 0.0d0 + endif + enddo + write (ihist,*) + close(ihist) + endif + write (iout,*) "Microcanonical entropy" + do i=0,upindE + write (iout,'(f8.0,$)') dint(potEmin)+i + if (histE(i).gt.0.0e0) then + write (iout,'(f15.5,$)') dlog(histE(i)) + else + write (iout,'(f15.5,$)') 0.0d0 + endif + write (iout,*) + enddo + if (rmsrgymap) then + if (nslice.eq.1) then + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//'_par'//licz3//'.rmsrgy' + else + histname=prefix(:ilen(prefix))//'.rmsrgy' + endif + else + if (separate_parset) then + write(licz3,"(bz,i3.3)") myparm + histname=prefix(:ilen(prefix))//'_par'//licz3// + & '_slice_'//licz2//'.rmsrgy' + else + histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.rmsrgy' + endif + endif +#if defined(AIX) || defined(PGI) + open (ihist,file=histname,position='append') +#else + open (ihist,file=histname,access='append') +#endif + do i=0,nbin_rms + do j=0,nbin_rgy + write(ihist,'(2f8.2,$)') + & rgymin+deltrgy*j,rmsmin+deltrms*i + do ib=1,nT_h(iparm) + if (hrmsrgy(j,i,ib).gt.0.0d0) then + write(ihist,'(e14.5,$)') + & -dlog(hrmsrgy(j,i,ib))/beta_h(ib,iparm) + & +potEmin + else + write(ihist,'(e14.5,$)') 1.0d6 + endif + enddo + write (ihist,'(i2)') iparm + enddo + enddo + close(ihist) + endif + endif + enddo ! iparm +#ifdef MPI + call MPI_Reduce(hfin_ent_p(0),hfin_ent(0),nbin, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + call MPI_Reduce(sumW_p(0,1),sumW(0,1),(nGridT+1)*nParmSet, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + call MPI_Reduce(sumE_p(0,1),sumE(0,1),(nGridT+1)*nParmSet, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + call MPI_Reduce(sumEbis_p(0,1),sumEbis(0,1),(nGridT+1)*nParmSet, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + call MPI_Reduce(sumEsq_p(0,1),sumEsq(0,1),(nGridT+1)*nParmSet, + & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR) + call MPI_Reduce(sumQ_p(1,0,1),sumQ(1,0,1), + & MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master, + & WHAM_COMM,IERROR) + call MPI_Reduce(sumQsq_p(1,0,1),sumQsq(1,0,1), + & MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master, + & WHAM_COMM,IERROR) + call MPI_Reduce(sumEQ_p(1,0,1),sumEQ(1,0,1), + & MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master, + & WHAM_COMM,IERROR) + if (me.eq.master) then +#endif + write (iout,'(/a)') 'Thermal characteristics of folding' + if (nslice.eq.1) then + nazwa=prefix + else + nazwa=prefix(:ilen(prefix))//"_slice_"//licz2 + endif + iln=ilen(nazwa) + if (nparmset.eq.1 .and. .not.separate_parset) then + nazwa=nazwa(:iln)//".thermal" + else if (nparmset.eq.1 .and. separate_parset) then + write(licz3,"(bz,i3.3)") myparm + nazwa=nazwa(:iln)//"_par_"//licz3//".thermal" + endif + do iparm=1,nParmSet + if (nparmset.gt.1) then + write(licz3,"(bz,i3.3)") iparm + nazwa=nazwa(:iln)//"_par_"//licz3//".thermal" + endif + open(34,file=nazwa) + if (separate_parset) then + write (iout,'(a,i3)') "Parameter set",myparm + else + write (iout,'(a,i3)') "Parameter set",iparm + endif + do i=0,NGridT + sumE(i,iparm)=sumE(i,iparm)/sumW(i,iparm) + sumEbis(i,iparm)=(startGridT+i*delta_T)*sumEbis(i,iparm)/ + & sumW(i,iparm) + sumEsq(i,iparm)=(sumEsq(i,iparm)/sumW(i,iparm) + & -sumE(i,iparm)**2)/(1.987D-3*(startGridT+i*delta_T)**2) + do j=1,nQ+2 + sumQ(j,i,iparm)=sumQ(j,i,iparm)/sumW(i,iparm) + sumQsq(j,i,iparm)=sumQsq(j,i,iparm)/sumW(i,iparm) + & -sumQ(j,i,iparm)**2 + sumEQ(j,i,iparm)=sumEQ(j,i,iparm)/sumW(i,iparm) + & -sumQ(j,i,iparm)*sumE(i,iparm) + enddo + sumW(i,iparm)=-dlog(sumW(i,iparm))*(1.987D-3* + & (startGridT+i*delta_T))+potEmin + write (iout,'(f7.1,2f15.5,$)') startGridT+i*delta_T, + & sumW(i,iparm),sumE(i,iparm) + write (iout,'(f10.5,$)') (sumQ(j,i,iparm),j=1,nQ+2) + write (iout,'(e15.5,$)') sumEsq(i,iparm)-sumEbis(i,iparm), + & (sumQsq(j,i,iparm),j=1,nQ+2),(sumEQ(j,i,iparm),j=1,nQ+2) + write (iout,*) + write (34,'(f7.1,2f15.5,$)') startGridT+i*delta_T, + & sumW(i,iparm),sumE(i,iparm) + write (34,'(f10.5,$)') (sumQ(j,i,iparm),j=1,nQ+2) + write (34,'(e15.5,$)') sumEsq(i,iparm)-sumEbis(i,iparm), + & (sumQsq(j,i,iparm),j=1,nQ+2),(sumEQ(j,i,iparm),j=1,nQ+2) + write (34,*) + enddo + close(34) + enddo + if (histout) then + do t=0,tmax + if (hfin_ent(t).gt.0.0d0) then + liczba=t + jj = mod(liczba,nbin1) + write (iout,'(f6.3,e20.10," ent")') dmin+(jj+0.5d0)*delta, + & hfin_ent(t) + if (histfile) write (ihist,'(f6.3,e20.10," ent")') + & dmin+(jj+0.5d0)*delta, + & hfin_ent(t) + endif + enddo + if (histfile) close(ihist) + endif + +#ifdef ZSCORE +! Write data for zscore + if (nslice.eq.1) then + zscname=prefix(:ilen(prefix))//".zsc" + else + zscname=prefix(:ilen(prefix))//"_slice_"//licz2//".zsc" + endif +#if defined(AIX) || defined(PGI) + open (izsc,file=prefix(:ilen(prefix))//'.zsc',position='append') +#else + open (izsc,file=prefix(:ilen(prefix))//'.zsc',access='append') +#endif + write (izsc,'("NQ=",i1," NPARM=",i1)') nQ,nParmSet + do iparm=1,nParmSet + write (izsc,'("NT=",i1)') nT_h(iparm) + do ib=1,nT_h(iparm) + write (izsc,'("TEMP=",f6.1," NR=",i2," SNK=",$)') + & 1.0d0/(beta_h(ib,iparm)*1.987D-3),nR(ib,iparm) + jj = min0(nR(ib,iparm),7) + write (izsc,'(i8,$)') (snk(i,ib,iparm,islice),i=1,jj) + write (izsc,'(a1,$)') (" ",i=22+8*jj+1,79) + write (izsc,'("&")') + if (nR(ib,iparm).gt.7) then + do ii=8,nR(ib,iparm),9 + jj = min0(nR(ib,iparm),ii+8) + write (izsc,'(i8,$)') (snk(i,ib,iparm,islice),i=ii,jj) + write (izsc,'(a1,$') (" ",i=(jj-ii+1)*8+1,79) + write (izsc,'("&")') + enddo + endif + write (izsc,'("FI=",$)') + jj=min0(nR(ib,iparm),7) + write (izsc,'(f10.5,$)') (fi(i,ib,iparm),i=1,jj) + write (izsc,'(a1,$)') (" ",i=3+10*jj+1,79) + write (izsc,'("&")') + if (nR(ib,iparm).gt.7) then + do ii=8,nR(ib,iparm),9 + jj = min0(nR(ib,iparm),ii+8) + write (izsc,'(f10.5,$)') (fi(i,ib,iparm),i=ii,jj) + if (jj.eq.nR(ib,iparm)) then + write (izsc,*) + else + write (izsc,'(a1,$)') (" ",i=10*(jj-ii+1)+1,79) + write (izsc,'(t80,"&")') + endif + enddo + endif + do i=1,nR(ib,iparm) + write (izsc,'("KH=",$)') + write (izsc,'(f7.2,$)') (Kh(j,i,ib,iparm),j=1,nQ) + write (izsc,'(" Q0=",$)') + write (izsc,'(f7.5,$)') (q0(j,i,ib,iparm),j=1,nQ) + write (izsc,*) + enddo + enddo + enddo + close(izsc) +#endif +#ifdef MPI + endif +#endif + + return + + end diff --git a/source/wham/src-NEWSC/wham_multparm.F b/source/wham/src-NEWSC/wham_multparm.F new file mode 100755 index 0000000..003b6b4 --- /dev/null +++ b/source/wham/src-NEWSC/wham_multparm.F @@ -0,0 +1,277 @@ + program WHAM_multparm +c Creation/update of the database of conformations + implicit none +#ifndef ISNAN + external proc_proc +#endif +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" +#ifdef MPI + include "mpif.h" + integer IERROR,ERRCODE + include "COMMON.MPI" +#endif + include "COMMON.IOUNITS" + include "COMMON.FREE" + include "COMMON.CONTROL" + include "COMMON.ALLPARM" + include "COMMON.PROT" + double precision rr,x(max_paropt) + integer idumm + integer i,ipar,islice +#ifdef MPI + call MPI_Init( IERROR ) + call MPI_Comm_rank( MPI_COMM_WORLD, me, IERROR ) + call MPI_Comm_size( MPI_COMM_WORLD, nprocs, IERROR ) + Master = 0 + if (ierror.gt.0) then + write(iout,*) "SEVERE ERROR - Can't initialize MPI." + call mpi_finalize(ierror) + stop + endif + if (nprocs.gt.MaxProcs+1) then + write (2,*) "Error - too many processors", + & nprocs,MaxProcs+1 + write (2,*) "Increase MaxProcs and recompile" + call MPI_Finalize(IERROR) + stop + endif +#endif +c NaNQ initialization +#ifndef ISNAN + i=-1 + rr=dacos(100.0d0) +#ifdef WINPGI + idumm=proc_proc(rr,i) +#else + call proc_proc(rr,i) +#endif +#endif + call initialize + call openunits + call cinfo + call read_general_data(*10) + call flush(iout) + call molread(*10) + call flush(iout) +#ifdef MPI + write (iout,*) "Calling proc_groups" + call proc_groups + write (iout,*) "proc_groups exited" + call flush(iout) +#endif +#ifdef SCALREP + write (iout,*) "1,4 SCSC repulsive interactions sacled down by 10" +#endif + do ipar=1,nParmSet + write (iout,*) "Calling parmread",ipar + call parmread(ipar,*10) + if (.not.separate_parset) then + call store_parm(ipar) + write (iout,*) "Finished storing parameters",ipar + else if (ipar.eq.myparm) then + call store_parm(1) + write (iout,*) "Finished storing parameters",ipar + endif + call flush(iout) + enddo + call read_efree(*10) + write (iout,*) "Finished READ_EFREE" + call flush(iout) + call read_protein_data(*10) + write (iout,*) "Finished READ_PROTEIN_DATA" + call flush(iout) + if (indpdb.gt.0) then + call promienie + call read_compar + call read_ref_structure(*10) + call proc_cont + call fragment_list + endif + write (iout,*) "Begin read_database" + call flush(iout) + call read_database(*10) + write (iout,*) "Finished read_database" + call flush(iout) + if (separate_parset) nparmset=1 + do islice=1,nslice + if (ntot(islice).gt.0) then +#ifdef MPI + call work_partition(islice,.true.) + write (iout,*) "work_partition OK" + call flush(iout) +#endif + call enecalc(islice,*10) + write (iout,*) "enecalc OK" + call flush(iout) + write (iout,*) "Calling WHAM_calc" + call flush(iout) + call WHAM_CALC(islice,*10) + write (iout,*) "wham_calc OK" + call flush(iout) + call write_dbase(islice,*10) + write (iout,*) "write_dbase OK" + call flush(iout) + if (ensembles.gt.0) then + call make_ensembles(islice,*10) + write (iout,*) "make_ensembles OK" + call flush(iout) + endif + endif + enddo +#ifdef MPI + call MPI_Finalize( IERROR ) +#endif + stop + 10 write (iout,*) "Error termination of the program" + call MPI_Finalize( IERROR ) + stop + end +c------------------------------------------------------------------------------ +#ifdef MPI + subroutine proc_groups +C Split the processors into the Master and Workers group, if needed. + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" + include "mpif.h" + include "COMMON.IOUNITS" + include "COMMON.MPI" + include "COMMON.FREE" + integer n,chunk,i,j,ii,remainder + integer kolor,key,ierror,errcode + logical lprint + lprint=.true. +C +C Split the communicator if independent runs for different parameter +C sets will be performed. +C + if (nparmset.eq.1 .or. .not.separate_parset) then + WHAM_COMM = MPI_COMM_WORLD + else if (separate_parset) then + if (nprocs.lt.nparmset) then + write (iout,*) + & "*** Cannot split parameter sets for fewer processors than sets", + & nprocs,nparmset + call MPI_Finalize(ierror) + stop + endif + write (iout,*) "nparmset",nparmset + nprocs = nprocs/nparmset + kolor = me/nprocs + key = mod(me,nprocs) + write (iout,*) "My old rank",me," kolor",kolor," key",key + call MPI_Comm_split(MPI_COMM_WORLD,kolor,key,WHAM_COMM,ierror) + call MPI_Comm_size(WHAM_COMM,nprocs,ierror) + call MPI_Comm_rank(WHAM_COMM,me,ierror) + write (iout,*) "My new rank",me," comm size",nprocs + write (iout,*) "MPI_COMM_WORLD",MPI_COMM_WORLD, + & " WHAM_COMM",WHAM_COMM + myparm=kolor+1 + write (iout,*) "My parameter set is",myparm + call flush(iout) + else + myparm=nparmset + endif + Me1 = Me + Nprocs1 = Nprocs + return + end +c------------------------------------------------------------------------------ + subroutine work_partition(islice,lprint) +c Split the conformations between processors + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" + include "mpif.h" + include "COMMON.IOUNITS" + include "COMMON.MPI" + include "COMMON.PROT" + integer islice + integer n,chunk,i,j,ii,remainder + integer kolor,key,ierror,errcode + logical lprint +C +C Divide conformations between processors; the first and +C the last conformation to handle by ith processor is stored in +C indstart(i) and indend(i), respectively. +C +C First try to assign equal number of conformations to each processor. +C + n=ntot(islice) + write (iout,*) "n=",n + indstart(0)=1 + chunk = N/nprocs1 + scount(0) = chunk +c print *,"i",0," indstart",indstart(0)," scount", +c & scount(0) + do i=1,nprocs1-1 + indstart(i)=chunk+indstart(i-1) + scount(i)=scount(i-1) +c print *,"i",i," indstart",indstart(i)," scount", +c & scount(i) + enddo +C +C Determine how many conformations remained yet unassigned. +C + remainder=N-(indstart(nprocs1-1) + & +scount(nprocs1-1)-1) +c print *,"remainder",remainder +C +C Assign the remainder conformations to consecutive processors, starting +C from the lowest rank; this continues until the list is exhausted. +C + if (remainder .gt. 0) then + do i=1,remainder + scount(i-1) = scount(i-1) + 1 + indstart(i) = indstart(i) + i + enddo + do i=remainder+1,nprocs1-1 + indstart(i) = indstart(i) + remainder + enddo + endif + + indstart(nprocs1)=N+1 + scount(nprocs1)=0 + + do i=0,NProcs1 + indend(i)=indstart(i)+scount(i)-1 + idispl(i)=indstart(i)-1 + enddo + + N=0 + do i=0,Nprocs1-1 + N=N+indend(i)-indstart(i)+1 + enddo + +c print *,"N",n," NTOT",ntot(islice) + if (N.ne.ntot(islice)) then + write (iout,*) "!!! Checksum error on processor",me, + & " slice",islice + call flush(iout) + call MPI_Abort( MPI_COMM_WORLD, Ierror, Errcode ) + endif + + if (lprint) then + write (iout,*) "Partition of work between processors" + do i=0,nprocs1-1 + write (iout,'(a,i5,a,i7,a,i7,a,i7)') + & "Processor",i," indstart",indstart(i), + & " indend",indend(i)," count",scount(i) + enddo + endif + return + end +#endif +#ifdef AIX + subroutine flush(iu) + call flush_(iu) + return + end +#endif diff --git a/source/wham/src-NEWSC/xdrf/Makefile b/source/wham/src-NEWSC/xdrf/Makefile new file mode 100644 index 0000000..f03276e --- /dev/null +++ b/source/wham/src-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 = 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/wham/src-NEWSC/xdrf/ftocstr.c b/source/wham/src-NEWSC/xdrf/ftocstr.c new file mode 100644 index 0000000..ed2113f --- /dev/null +++ b/source/wham/src-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/wham/src-NEWSC/xdrf/libxdrf.m4 b/source/wham/src-NEWSC/xdrf/libxdrf.m4 new file mode 100644 index 0000000..aecb5b5 --- /dev/null +++ b/source/wham/src-NEWSC/xdrf/libxdrf.m4 @@ -0,0 +1,1233 @@ +/*____________________________________________________________________________ + | + | 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 +#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 = "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/wham/src-NEWSC/xdrf/libxdrf.m4.org b/source/wham/src-NEWSC/xdrf/libxdrf.m4.org new file mode 100644 index 0000000..b14b374 --- /dev/null +++ b/source/wham/src-NEWSC/xdrf/libxdrf.m4.org @@ -0,0 +1,1230 @@ +/*____________________________________________________________________________ + | + | 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 +#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; + 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+"; + lmode = XDR_ENCODE; + } else { + type = "r"; + lmode = XDR_DECODE; + } + xdrfiles[xdrid] = fopen(filename, type); + 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/wham/src-NEWSC/xdrf/underscore.m4 b/source/wham/src-NEWSC/xdrf/underscore.m4 new file mode 100644 index 0000000..4d620a0 --- /dev/null +++ b/source/wham/src-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/wham/src-NEWSC/xdrf/xdrf.h b/source/wham/src-NEWSC/xdrf/xdrf.h new file mode 100644 index 0000000..dedf5a2 --- /dev/null +++ b/source/wham/src-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/wham/src-NEWSC/xread.F b/source/wham/src-NEWSC/xread.F new file mode 100755 index 0000000..ac35de1 --- /dev/null +++ b/source/wham/src-NEWSC/xread.F @@ -0,0 +1,187 @@ + subroutine xread(nazwa,ii,jj,kk,ll,mm,iR,ib,iparm) + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" + integer MaxTraj + parameter (MaxTraj=2050) +#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 + integer i,j,k,l,ii,jj(maxslice),kk(maxslice),ll(maxslice), + & mm(maxslice) + integer iscor,islice,islice1,slice + 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(0:maxprocs-1) + integer iparm,ib,iib,ir,nprop,nthr + double precision etot,time,ts(maxslice),te(maxslice) + integer is(maxslice),ie(maxslice),itraj,ntraj,it,iset + integer nstep(0:MaxTraj-1) + logical lerr + + call set_slices(is,ie,ts,te,iR,ib,iparm) + do i=1,nQ + prop(i)=0.0d0 + enddo + do i=0,MaxTraj-1 + nstep(i)=0 + enddo + ntraj=0 + it=0 + islice1=1 + call opentmp(islice1,ientout,bprotfile_temp) + do while (.true.) + if (replica(iparm)) then + if (hamil_rep .or. umbrella(iparm)) then + read (ientin,*,end=1112,err=1112) time,eini, + & etot,temp,nss,(ihpb(j),jhpb(j),j=1,nss), + & nprop,(prop(j),j=1,nprop),iset + else + read (ientin,*,end=1112,err=1112) time,eini, + & etot,temp,nss,(ihpb(j),jhpb(j),j=1,nss), + & nprop,(prop(j),j=1,nprop) + endif + temp=1.0d0/(temp*1.987D-3) +c write (iout,*) time,eini,etot,nss, +c & (ihpb(j),jhpb(j),j=1,nss),(prop(j),j=1,nprop) +c call flush(iout) + do i=1,nT_h(iparm) + if (beta_h(i,iparm).eq.temp) 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/(temp*1.987D-3), + & " does not match any of the list" + write (iout,*) + & 1.0d0/(temp*1.987D-3), + & (1.0d0/(beta_h(i,iparm)*1.987D-3),i=1,nT_h(iparm)) + call flush(iout) + call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE) + endif + else + read (ientin,*,end=1112,err=1112) time,eini, + & etot,nss,(ihpb(j),jhpb(j),j=1,nss), + & nprop,(prop(j),j=1,nprop) + iib = ib + endif + itraj=mod(it,totraj(iR,iparm)) +c write (*,*) "ii",ii," itraj",itraj +c call flush(iout) + it=it+1 + if (itraj.gt.ntraj) ntraj=itraj + nstep(itraj)=nstep(itraj)+1 + islice=slice(nstep(itraj),time,is,ie,ts,te) + read (ientin,'(8f10.5)',end=1112,err=1112) + & ((csingle(l,k),l=1,3),k=1,nres), + & ((csingle(l,k+nres),l=1,3),k=nnt,nct) + efree=0.0d0 + if (islice.gt.0 .and. islice.le.nslice) then + ii=ii+1 + kk(islice)=kk(islice)+1 + mm(islice)=mm(islice)+1 + if (mod(nstep(itraj),isampl(iparm)).eq.0) then + jj(islice)=jj(islice)+1 + if (hamil_rep) then + snk(iR,iib,iset,islice)=snk(iR,iib,iset,islice)+1 + else if (umbrella(iparm)) then + snk(iset,iib,iparm,islice)=snk(iset,iib,iparm,islice)+1 + else + snk(iR,iib,iparm,islice)=snk(iR,iib,iparm,islice)+1 + endif + ll(islice)=ll(islice)+1 +c write (iout,*) ii,kk,jj,ll,eini,(prop(j),j=1,nprop) +#ifdef DEBUG +c write (iout,*) "Writing conformation, record",ll(islice) +c write (iout,*) "ib",ib," iib",iib + if (replica(iparm)) then + write (iout,*) "TEMP",1.0d0/(temp*1.987D-3) + write (iout,*) "TEMP list" + write (iout,*) + & (1.0d0/(beta_h(i,iparm)*1.987D-3),i=1,nT_h(iparm)) + endif + call flush(iout) +#endif +c 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 +c call flush(iout) + 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)) +c call flush(iout) + islice1=islice + endif + write(ientout,rec=ll(islice)) + & ((csingle(l,k),l=1,3),k=1,nres), + & ((csingle(l,k+nres),l=1,3),k=nnt,nct), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & eini,efree,rmsdev,(prop(i),i=1,nQ),iR,iib,iparm +#ifdef DEBUG + do i=1,2*nres + do j=1,3 + c(j,i)=csingle(j,i) + enddo + enddo + 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)') (prop(j),j=1,nQ) + write (iout,'(16i5)') iscor + call flush(iout) +#endif + endif + endif + enddo + 1112 continue + close(ientout) + 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)) + write (iout,*) mm(islice)," conformations read so far, slice", + & islice + write (iout,*) ll(islice)," conformations stored so far, slice", + & islice + call flush(iout) + return + end -- 1.7.9.5

    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