1 SUBROUTINE LUCIA_NORT(I_DO_NONORT_MCSCF, 2 & JCMBSPC,E_FINAL,CONV_F,ERROR_NORM_FINAL,INI_NORT, 3 & IVBGNSP,IVBGNSP_PREV) 4* 5* Perform Nonorthogonal CI calculation 6* 7 INCLUDE 'wrkspc.inc' 8 INCLUDE 'crun.inc' 9 INCLUDE 'lucinp.inc' 10 INCLUDE 'orbinp.inc' 11 INCLUDE 'vb.inc' 12 INCLUDE 'cstate.inc' 13 INCLUDE 'cprnt.inc' 14 INCLUDE 'spinfo.inc' 15 INCLUDE 'glbbas.inc' 16 INCLUDE 'csm.inc' 17 INCLUDE 'cintfo.inc' 18 INCLUDE 'intform.inc' 19 INCLUDE 'fragmol.inc' 20 INCLUDE 'cgas.inc' 21 INCLUDE 'cecore.inc' 22 LOGICAL CONV_F, CONV_NORTCI 23* 24 IPRVB = 10 25 NTEST = 1000 26 NTEST = MAX(IPRVB, NTEST) 27* 28 WRITE(6,*) ' *************************************** ' 29 WRITE(6,*) ' * * ' 30 WRITE(6,*) ' * Nonorthogonal section entered * ' 31 WRITE(6,*) ' * * ' 32 WRITE(6,*) ' * Jeppe Olsen * ' 33 WRITE(6,*) ' * * ' 34 WRITE(6,*) ' * Version of June 2013 ( 0.96) * ' 35 WRITE(6,*) ' *************************************** ' 36* 37 WRITE(6,*) ' TEST: INI_NORT, IRESTR = ', INI_NORT, IRESTR 38 WRITE(6,*) ' TEST: IVBGNSP, IVBGNSP_PREV = ', 39 & IVBGNSP, IVBGNSP_PREV 40* 41 IF(IVBGNSP.NE.0) THEN 42*. Copy general space to reference VB space 43 NORBVBSPC = NOBPT(NORTCIX_SCVB_SPACE) 44 CALL ICOPVE(VB_GNSPC_MIN(1,IVBGNSP),VB_REFSPC_MIN(1),NORBVBSPC) 45 CALL ICOPVE(VB_GNSPC_MAX(1,IVBGNSP),VB_REFSPC_MAX(1),NORBVBSPC) 46 END IF 47* 48 IF(NTEST.GE.0) THEN 49 WRITE(6,*) ' Information on nonorthogonal calculation: ' 50 WRITE(6,*) ' ==========================================' 51 WRITE(6,*) 52* 53 IF(NORT_MET.EQ.1) THEN 54 WRITE(6,'(5X,A)') 55 & ' Non-orthogonal wave function will be expanded in CI space' 56 ELSE IF( NORT_MET.EQ.2) THEN 57 WRITE(6,'(5X,A)') 58 & ' Non-orthogonal wave function will be expanded configurations' 59 ELSE 60 WRITE(6,*) ' Currently unknown NORT_MET = ', NORT_MET 61 STOP ' Currently unknown NORT_MET ' 62 END IF 63* 64 WRITE(6,'(5X,A,I3)') 65 & ' Orbital space for non-orthogonal calculation:', 66 & NORTCIX_SCVB_SPACE 67 WRITE(6,'(5X,A,I3)') 68 & ' Allowed excitation level from Spin-coupled valence space', 69 & NORTCI_SCVB_EXCIT 70 WRITE(6,'(5X,A,I3)') 71 & ' Spanning CI-space:', JCMBSPC 72* 73 WRITE(6,'(5X,A)') 74 &' Min and max accumulated occupation in valence ref CI space: ' 75 NORBVBSPC = NOBPT(NORTCIX_SCVB_SPACE) 76 DO IORB = 1, NORBVBSPC 77 WRITE(6,'(10X,2I3)') VB_REFSPC_MIN(IORB),VB_REFSPC_MAX(IORB) 78 END DO 79 END IF !NTEST is large enough for printing 80* 81 IF(NTEST.GE.10) THEN 82 IF(INI_NORT.EQ.1) THEN 83C WRITE(6,*) ' INI_MO_TP, INI_MO_ORT = ', INI_MO_TP, INI_MO_ORT 84 WRITE(6,*) 85 WRITE(6,*) ' ======================= ' 86 WRITE(6,*) ' Initial set of orbitals ' 87 WRITE(6,*) ' ======================= ' 88 WRITE(6,*) 89* 90 IF(INI_MO_TP.EQ.1) THEN 91 WRITE(6,'(4X,A)') ' Atomic orbitals will be used ' 92 ELSE IF (INI_MO_TP.EQ.2) THEN 93 WRITE(6,'(4X,A)') 94 & ' Input MOs in VB space rotated to give diagonal block' 95 ELSE IF (INI_MO_TP.EQ.3) THEN 96 WRITE(6,'(4X,A)') 97 & ' Initial MO orbitals from SIRIFC will be used' 98 ELSE IF (INI_MO_TP.EQ.4) THEN 99 WRITE(6,'(4X,A)') 100 & ' Constructed from fragment orbitals' 101 END IF 102 WRITE(6,'(4X,A)') 103 & ' Orbitals in inactive and secondary space will be ort.' 104 WRITE(6,'(4X,A)') ' Orbitals in GAS orbital spaces(.ne. VB ): ' 105 IF(INI_MO_ORT.EQ.0) THEN 106 WRITE(6,'(6X,A)') ' No orthogonalization ' 107 ELSE IF (INI_MO_ORT.EQ.1) THEN 108 WRITE(6,'(6X,A)') ' Orthogonalized' 109 END IF 110 WRITE(6,'(4X,A)') ' Orbitals in VB orbital space: ' 111 IF(INI_ORT_VBGAS.EQ.0) THEN 112 WRITE(6,'(6X,A)') ' No orthogonalization ' 113 ELSE IF (INI_ORT_VBGAS.EQ.1) THEN 114 WRITE(6,'(6X,A)') ' Orthogonalized' 115 END IF 116* 117 IF(INI_MO_TP.EQ.4) THEN 118 WRITE(6,*) ' Distribution of orbitals from fragments:' 119 DO IFRAG = 1, NFRAG_MOL 120 NSMOB_L = NSMOB_FRAG(IFRAG) 121 WRITE(6,'(A,I3)') ' For fragment ', IFRAG 122 WRITE(6,*) ' ====================' 123 WRITE(6,*) ' Number of orbitals per GAS (row) and sym (col) ' 124 CALL IWRTMA 125 & (N_GS_SM_BAS_FRAG(0,1,IFRAG),NGAS+2,NSMOB_L,MXPNGAS+1,MXPOBS) 126 END DO 127 END IF ! End if INI_MO_TP.eq.4 128 ELSE 129 WRITE(6,*) ' Start from orbitals in place ' 130 END IF 131* 132 IF(IRESTR.EQ.0) THEN 133 WRITE(6,*) 134 WRITE(6,*) ' ======================= ' 135 WRITE(6,*) ' Initial configuration: ' 136 WRITE(6,*) ' ======================= ' 137 WRITE(6,*) 138 IF(I_HAVE_INI_CONF.EQ.0) THEN 139 WRITE(6,'(5X,A)') ' None given ' 140 ELSE 141 WRITE(6,'(5X,A)') ' In compressed form ' 142 CALL IWRTMA(INI_CONF,1,NOB_INI_CONF,1,NOB_INI_CONF) 143 END IF 144 ELSE 145 WRITE(6,*) ' Restarted calculation ' 146 END IF 147* 148 END IF ! NTEST is large enough for testoutput 149* 150* Some general info on configuration expansions 151* 152*. First orbital and number of electrons in VB orbital space 153 IB_VBOBSPC= NINOB + 1 154 DO IOBSPC = 1, NORTCIX_SCVB_SPACE-1 155 IB_VBOBSPC = IB_VBOBSPC + NOBPT(IOBSPC) 156 END DO 157 NORBVBSPC = NOBPT(NORTCIX_SCVB_SPACE) 158 IF(NTEST.GE.10) 159 &WRITE(6,*) ' Dimension and offset for orbitals in VB-space', 160 & NORBVBSPC,IB_VBOBSPC 161*. Number of electrons 162 NELEC = VB_REFSPC_MIN(NORBVBSPC) 163 IF(NTEST.GE.10) WRITE(6,*) ' Test: NELEC = ', NELEC 164*. Save for communication with configuration routines 165 IB_ORB_CONF = IB_VBOBSPC 166 N_ORB_CONF = NORBVBSPC 167 N_EL_CONF = NELEC 168* 169*. Check number of electrons in initial configuration 170* 171 IF(I_HAVE_INI_CONF.EQ.1) THEN 172 NEL_INI = NEL_IN_COMPACT_CONF(INI_CONF,NOB_INI_CONF) 173 IF(NEL_INI.NE.NELEC) THEN 174 WRITE(6,*) 175 & ' Incorrect number of electrons in initial configuration' 176 WRITE(6,*) ' Actual and required number of electrons ', 177 & NEL_INI, NELEC 178 STOP 179 & ' Incorrect number of electrons in initial configuration' 180 END IF 181 END IF 182* 183* ========================================================= 184* information about prototype configurations in CI space 185* ========================================================= 186* 187* 188*. Max. and min. number of open orbitals- based only number of orbitals 189* and electrons 190*. And the prototype information 191* 192* ====================================== 193* The various min-max occupation spaces 194* ====================================== 195* 196* Space 1: The reference space for |0> 197 ICSPC_CNF = 1 198 CALL ICOPVE(VB_REFSPC_MIN,IOCC_MIN_GN(1,ICSPC_CNF),NORBVBSPC) 199 CALL ICOPVE(VB_REFSPC_MAX,IOCC_MAX_GN(1,ICSPC_CNF),NORBVBSPC) 200*. Space 2: Space where Hamiltonian vector will be calculated, currently 201* also reference space 202 ISSPC_CNF = 2 203 CALL ICOPVE(VB_REFSPC_MIN,IOCC_MIN_GN(1,ISSPC_CNF),NORBVBSPC) 204 CALL ICOPVE(VB_REFSPC_MAX,IOCC_MAX_GN(1,ISSPC_CNF),NORBVBSPC) 205*. Space 3: Intermediate space where |0> is expanded in biothonormal basis, 206*. Must interact with final space (2) through a given level of excit 207 IMSPC_CNF = 3 208*. For atmost two-body operators 209 IF(NORT_M.EQ.1) THEN 210 NEXCIT = 2 211 NEXCIT = NELEC 212*. I have been having some errors with orb gradient when reordering 213*. orbitals, so I have increased this in the aboce 214 WRITE(6,*) ' IMPORTANT: NEXCIT raised to NELEC for test' 215 ELSE 216 NEXCIT = 2 217 END IF 218 CALL MINMAX_EXCIT( 219 & IOCC_MIN_GN(1,ISSPC_CNF),IOCC_MAX_GN(1,ISSPC_CNF),NEXCIT, 220 & IOCC_MIN_GN(1,IMSPC_CNF),IOCC_MAX_GN(1,IMSPC_CNF), 221 & NORBVBSPC) 222 NVBCISPC = 3 223 NVBCNSPC = NVBCISPC 224 IB_INTM_SPC = NVBCISPC + 1 225 226 IF(NORT_MET.EQ.2) THEN 227*. The bioorthogonal C vector will be obtained as a 228*. sequence of one-orbital transformations. Generate spaces for these 229 N_INTM_SPC = N_ORB_CONF 230*.Is there enough space for pointers 231 IF(NVBCISPC+N_INTM_SPC.GE.MXPICI) THEN 232 WRITE(6,*) ' Too many intermediate MAXMIN spaces required' 233 WRITE(6,*) ' Needed number of spaces ', N_ORB_CONF 234 WRITE(6,*) ' Present number of spaces ', MXPICI - NVBCISPC 235 WRITE(6,*) ' Increase MXPICI and recompile ' 236 STOP ' Too many intermediate MAXMIN spaces required' 237 END IF 238*. Generate the various MAXMIN spaces and their dimensions 239C MINMAX_FOR_ORBTRA(MIN_IN,MAX_IN,MIN_OUT,MAX_OUT, 240C & MIN_INTM,MAX_INTM,MIN_INTMS,MAX_INTMS,ISYM,IDODIM) 241 IDODIM = 1 242 WRITE(6,*) ' ICSPC_CNF, IOCC_MIN_GN(1,ICSPC_CNF) = ', 243 & ICSPC_CNF, IOCC_MIN_GN(1,ICSPC_CNF) 244 WRITE(6,*) 245 & ' Configuration information for orbital transformation' 246 WRITE(6,*) 247 & ' ====================================================' 248 CALL MINMAX_FOR_ORBTRA( 249 & IOCC_MIN_GN(1,ICSPC_CNF), 250 & IOCC_MAX_GN(1,ICSPC_CNF), 251 & IOCC_MIN_GN(1,IMSPC_CNF), 252 & IOCC_MAX_GN(1,IMSPC_CNF), 253 & IOCC_MIN_GN(1,IB_INTM_SPC), 254 & IOCC_MAX_GN(1,IB_INTM_SPC), 255 & ISYM,IDODIM,NCONF_GN(IB_INTM_SPC), 256 & NCSF_GN(IB_INTM_SPC), 257 & NSD_GN(IB_INTM_SPC)) 258*. In and out spaces for the orbital transformation 259 DO IORB = 1, N_ORB_CONF 260 IF(IORB.EQ.1) THEN 261 IORBTRA_SPC_IN(IORB) = ICSPC_CNF 262 ELSE 263 IORBTRA_SPC_IN(IORB) = IORBTRA_SPC_OUT(IORB-1) 264 END IF 265 IF(IORB.LT.N_ORB_CONF) THEN 266 IORBTRA_SPC_OUT(IORB) = IB_INTM_SPC - 1 + IORB 267 ELSE 268 IORBTRA_SPC_OUT(IORB) = IMSPC_CNF 269 END IF 270 END DO 271* 272 IF(NTEST.GE.100) THEN 273 WRITE(6,*) ' In and out spaces for the orbital trans ' 274 WRITE(6,*) ' ======================================= ' 275 WRITE(6,*) 276 WRITE(6,*) ' Orbital Inspace Outspace ' 277 WRITE(6,*) ' =========================' 278 DO IORB = 1, N_ORB_CONF 279 WRITE(6,'(3(I3,4X))') 280 & IORB, IORBTRA_SPC_IN(IORB), IORBTRA_SPC_OUT(IORB) 281 END DO 282 END IF 283* 284 NVBCNSPC = NVBCNSPC+N_INTM_SPC 285* 286*. Largest number of CSFs of given sym in a CI space 287* 288 END IF! NORT_MET = 2 289* 290* ================================================== 291* Generate configurations for the active CN spaces 292* ================================================== 293* 294 NCSF_MNMX_MAX = 0 295 DO ISPC = 1, NVBCNSPC 296 IF(NTEST.GE.100) THEN 297 WRITE(6,*) 298 WRITE(6,*) ' ========================================' 299 WRITE(6,*) ' Information about MINMAX space= ', ISPC 300 WRITE(6,*) ' ========================================' 301 WRITE(6,*) 302 END IF 303* 304 CALL GEN_CONF_FOR_MINMAX_SPC( 305 & IOCC_MIN_GN(1,ISPC),IOCC_MAX_GN(1,ISPC), 306 & NORBVBSPC, IREFSM,IB_VBOBSPC,ISPC) 307*. Configurations are returned in WORK(KICONF_OCC_GN(IREFSM,ISPC)) 308*. Number of SD's .. 309C NPARA_FOR_MINMAX_SPC(NCONF_OP,NCSF,NSD,NCMB) 310 CALL NPARA_FOR_MINMAX_SPC(NCONF_PER_OPEN_GN(1,IREFSM,ISPC), 311 & NCSF,NSD,NCMB,NCNF) 312 NSD_PER_SYM_GN(IREFSM,ISPC) = NSD 313 NCSF_PER_SYM_GN(IREFSM,ISPC) = NCSF 314 NCONF_PER_SYM_GN(IREFSM,ISPC) = NCNF 315* 316 NCSF_MNMX_MAX = MAX(NCSF_MNMX_MAX,NCSF) 317* 318 IF(NORT_MET.EQ.1) THEN 319* 320* ======================================================= 321*. Generate mapping of SD's from configuration order to 322*. standard string order 323* ======================================================= 324* 325*. Obtain information about reexpansion in CI space 326* Reorder array for determinants, index and sign 327 CALL MEMMAN(KSDREO_I_GN(IREFSM,ISPC),NSD,'ADDL ',1,'SDREOI') 328*. Offsets for determinants with a given numbner of open orbitals 329*. The code below is a but confusing, I am not sure of its use.. 330 IZERO = 0 331 CALL ISETVC(IB_SD_OPEN_GN(1,ISPC),IZERO,MAXOP+1) 332 IB = 1 333 DO IOPEN = MINOP, MAXOP 334 IB_SD_OPEN_GN(IOPEN+1,ISPC) = IB 335 IF(MOD(IOPEN-MS2,2).EQ.0) THEN 336 IB = IB + 337 & NCONF_PER_OPEN_GN(IOPEN+1,IREFSM,ISPC)*NPCMCNF(IOPEN+1) 338 END IF 339 END DO 340 341*. Reorder array for determinants, index and sign 342 CALL MEMMAN(KSDREO_I_GN(IREFSM,ISPC),NSD,'ADDL ',1,'SDREOI') 343*. And then the reordering 344C CNFORD2(ISM,ICTSDT,ICONF_OCC,NCONF_PER_OP, 345C & IDFTP,ICONF_ORBSPC) 346 CALL CNFORD2(IREFSM,WORK(KSDREO_I_GN(IREFSM,ISPC)), 347 & WORK(KICONF_OCC_GN(IREFSM,ISPC)), 348 & NCONF_PER_OPEN_GN(1,IREFSM,ISPC), 349 & WORK(KDFTP),NORTCIX_SCVB_SPACE, 350 & JCMBSPC) 351 ENDIF ! End if NORTCI = 1 352 END DO ! End of loop over CI spaces 353* 354 WRITE(6,*) ' Largest number of CSF''s in a space ', 355 & NCSF_MNMX_MAX 356* 357* ============================================================= 358* Generate atom orbitals and integrals over these orbitals 359* ============================================================== 360* 361* At the moment: It is assumed that integrals have been 362* delivered in an orthogonal basis defined by C(MOAO) in WORK(KMOAOIN). 363* Obtain matrix for transforming from MO's to AO's 364* and backtransform integrals.... 365* 366* IN MOAOIN we actually have the actual expansion of the set of non-orthoginal 367* orbitals that we will use. Save this, and read in original copy of C(MOAO) 368 LENC = LEN_BLMAT(NSMOB,NTOOBS,NTOOBS,0) 369 CALL COPVEC(WORK(KMOAOIN),WORK(KMOAO_ACT),LENC) 370 CALL GET_CMOAO_ENV(WORK(KMOAOIN)) 371* 372*. Allocate space for H in AO basis 373 LEN1E = NTOOB **2 374 IF(NTEST.GE.1000) 375 &WRITE(6,*) ' NTOOB, LEN1E = ', NTOOB, LEN1E 376 CALL MEMMAN(KLHAO,LEN1E,'ADDL ',2,'H_AO ') 377*. Allocate space for inverse of C(MOAO) 378 CALL MEMMAN(KLCAOMO,LEN1E,'ADDL ',2,'CAOMO ') 379*. Obtain AO integrals SAO 380 XDUM = 2810.1979 381 CALL GET_HSAO(XDUM,WORK(KSAO),0,1) 382C GETHSAO(HAO,SAO,IGET_HAO,IGET_SAO) 383*. Obtain SAO in expanded (unpacked form) 384C? WRITE(6,*) ' LEN1E = ', LEN1E 385 CALL MEMMAN(KLSAOE,LEN1E,'ADDL ',2,'S_AO_E') 386C TRIPAK_AO_MAT(AUTPAK,APAK,IWAY) 387* 388 CALL TRIPAK_AO_MAT(WORK(KLSAOE),WORK(KSAO),2) 389 IF(NTEST.GE.1000) THEN 390 WRITE(6,*) ' SAOE: ' 391 CALL APRBLM2(WORK(KLSAOE),NTOOBS,NTOOBS,NSMOB,0) 392 WRITE(6,*) ' MOAOIN: ' 393 CALL APRBLM2(WORK(KMOAOIN),NTOOBS,NTOOBS,NSMOB,0) 394 END IF 395 396*. CMOAO(T) * SAO - it is assumed that CMOAO is in KMOAOIN 397 CALL MULT_BLOC_MAT(WORK(KLCAOMO),WORK(KMOAOIN),WORK(KLSAOE), 398 & NSMOB,NTOOBS,NTOOBS,NTOOBS,NTOOBS,NTOOBS,NTOOBS,1) 399 IF(NTEST.GE.1000) THEN 400 WRITE(6,*) ' C(AOMO) matrix: ' 401 CALL WRTVH1(WORK(KLCAOMO),1,NTOOBS,NTOOBS,NSMOB,0) 402 END IF 403*. And clean up 404 CALL COPVEC(WORK(KMOAO_ACT),WORK(KMOAOIN),LENC) 405*. 406* 407*.The two-electron integrals in the AO basis - only done in initial NORT 408* 409 IF(INI_NORT.EQ.1) THEN 410* 411 IF(NOMOFL.EQ.1) THEN 412 WRITE(6,*) 413 & ' Lucia is trying to make a MO=>AO transformation of integrals' 414 WRITE(6,*) 415 & ' But there is no AO=> MO transformation present' 416 STOP ' NORTCI: NO AO => MO transformation matrix present' 417 END IF 418* 419 IF(NTEST.GE.10) WRITE(6,*) ' Integral transformation:' 420*. Input integrals in place for integral transformation 421 KINT2 = KINT_2EMO 422 CALL COPVEC(WORK(KH),WORK(KINT1O), NINT1) 423*. Flag type of integral list to be obtained: Pt complete list of integrals 424 IE2LIST_A = IE2LIST_FULL 425 IOCOBTP_A = 1 426 INTSM_A = 1 427 KKCMO_I = KLCAOMO 428 KKCMO_J = KLCAOMO 429 KKCMO_K = KLCAOMO 430 KKCMO_L = KLCAOMO 431 IH1FORM = 1 432 IH2FORM = 1 433 CALL TRAINT 434*. Move integrals in AO basis to KINT_2EMO (sorry for the name..) 435 IE2ARR_F = IE2LIST_I(IE2LIST_IB(IE2LIST_FULL)) 436 NINT2_F = NINT2_G(IE2ARR_F) 437 KINT2_F = KINT2_A(IE2ARR_F) 438 CALL COPVEC(WORK(KINT2_F),WORK(KINT_2EMO),NINT2_F) 439C? WRITE(6,*) ' NINT2_F = ', NINT2_F 440C? WRITE(6,*) ' Integrals transformed to KINT_2EMO' 441C? CALL WRTMAT(WORK(KINT_2EMO),1,NINT2_F,1,NINT2_F) 442*. one-electron AO integrals to KINT1O 443 CALL COPVEC(WORK(KINT1),WORK(KINT1O),NINT1) 444* 445* End of generation of integrals over atomic orbitals: We have now in KINT_2EMO the 446* two-electron integrals over AO's and in KINT1O, the one-electron integrals in the AP basis. 447 ELSE 448 WRITE(6,*) ' AO integrals assumed in place ' 449 END IF 450* 451* ====================================== 452*. Obtain initial set of orbitals 453* ====================================== 454* 455* Two steps : 1) Obtain a set of (nonorthogonal) initial orbitals 456* 2) Perform (partial) orthonormalization to obtain 457* Final initial orbitals 458* 459*. 1: Generate/Read in the initial orbitals 460* Generate set of (nonorthogonal) initial orbitals 461* 462 IF(INI_NORT.EQ.1) THEN 463 CALL GET_INIMO(WORK(KMOAOUT)) 464C GET_INIMO(CMO_INI) 465 ELSE 466 WRITE(6,*) ' Starting from MOAOUT orbitals ' 467 END IF 468* 469*. Obtain, if required, supersymmetry of MO's 470* 471 IF(I_USE_SUPSYM.EQ.1) THEN 472*. Supersymmetry of orbital in MOAOUT 473 WRITE(6,*) ' Supersymmetry of orbitals in MOAOUT: ' 474 CALL SUPSYM_FROM_CMOAO(WORK(KMOAOUT),WORK(KISUPSYM_FOR_BAS), 475 & WORK(KMO_ACT_SUPSYM)) 476*. Obtain reorder array going from correct order to actual order 477 CALL REO_2SUPSYM_ORDERS(WORK(KMO_OCC_SUPSYM), 478 & WORK(KMO_ACT_SUPSYM),WORK(KIREO_INI_OCC)) 479*. Reorder to obtain the occ order of supersymmetry 480 CALL REO_CMOAO(WORK(KMOAOUT),WORK(KMOAO_ACT), 481 & WORK(KIREO_INI_OCC),1,2) 482*. Check that we now have correct supersymmetry (Jeppe has been messing up...) 483 CALL SUPSYM_FROM_CMOAO(WORK(KMOAOUT),WORK(KISUPSYM_FOR_BAS), 484 & WORK(KMO_ACT_SUPSYM)) 485 CALL ICOPVE(WORK(KMO_ACT_SUPSYM), WORK(KMO_SUPSYM), NTOOB) 486 IDENT = IS_I1_EQ_I2(WORK(KMO_OCC_SUPSYM), 487 & WORK(KMO_SUPSYM),NTOOB) 488 IF(IDENT.EQ.0) THEN 489 WRITE(6,*) ' Error: Reordered orbitals are not in occ order' 490 WRITE(6,*) ' Obtained symmetry of reordered orbitals ' 491 CALL IWRTMA3(WORK(KMO_SUPSYM),1,NTOOB,1,NTOOB) 492 WRITE(6,*) ' Required order ' 493 CALL IWRTMA3(WORK(KMO_OCC_SUPSYM),1,NTOOB,1,NTOOB) 494 STOP ' Error: Jeppe is STILL messing supersymmetry up!!! ' 495 END IF 496 497 498 499 END IF 500 501 IF(NTEST.GE.100) THEN 502 WRITE(6,*) ' Expansion of initial MOs in AOs ' 503 WRITE(6,*) ' ================================' 504 CALL APRBLM2(WORK(KMOAOUT),NTOOBS,NTOOBS,NSMOB,0) 505 END IF 506*. Calculate metric over MO's in KLCMOAO2).. 507 CALL GET_SMO(WORK(KMOAOUT),WORK(KLSAOE),0) 508 IF(NTEST.GE.10) THEN 509 WRITE(6,*) ' Metric in final initial orbitals ... ' 510 WRITE(6,*) ' ====================================' 511 CALL APRBLM2(WORK(KLSAOE),NTOOBS,NTOOBS,NSMOB,0) 512 END IF 513*. Obtain CBIO: expansion of orbitals in MO's, CBIO2: expansion 514* of orbitals in AO's orbitals 515 CALL GET_CBIO(WORK(KMOAOUT),WORK(KCBIO),WORK(KCBIO2)) 516* 517* ======================================================================= 518* Bioorthogonal integral transformation with indices corresponding to 519* annihilation indices being in bioorthonormal basis 520* ======================================================================= 521* 522 IF(NTEST.GE.10) THEN 523 WRITE(6,*) ' Bioorthogonal integral transformation ' 524 END IF 525 IE2LIST_A = IE2LIST_FULL_BIO 526 IOCOBTP_A = 1 527 INTSM_A = 1 528 CALL PREPARE_2EI_LIST 529*. Two forms 1: Operator acts on bioorthonormal expansion 530* creation operators are in bio, annihilation are in orig, 531* integral indices converse 532* 2: Operator acts on origonal expansion 533*. 534 I_STRINGS_BIO_OR_ORIG = 1 535 IF(I_STRINGS_BIO_OR_ORIG.EQ.1) THEN 536 KKCMO_I = KMOAOUT 537 KKCMO_J = KCBIO2 538 KKCMO_K = KMOAOUT 539 KKCMO_L = KCBIO2 540 ELSE 541 KKCMO_I = KCBIO2 542 KKCMO_J = KMOAOUT 543 KKCMO_K = KCBIO2 544 KKCMO_L = KMOAOUT 545 END IF 546C DO_ORBTRA(IDOTRA,IDOFI,IDOFA,IE2LIST_IN,IOCOBTP_IN,INTSM_IN) 547 CALL DO_ORBTRA(1,1,0,IE2LIST_FULL_BIO,IOCOBTP_A,INTSM_A) 548 CALL FLAG_ACT_INTLIST(IE2LIST_FULL_BIO) 549* 550 IF(NTEST.GE.1000) THEN 551 WRITE(6,*) ' one-electron integrals in biobase' 552 WRITE(6,*) ' =================================' 553 CALL APRBLM2(WORK(KINT1),NTOOBS,NTOOBS,NSMOB,0) 554 END IF 555*. Transfer the inactive Fock-matrix to feeder matrix for integral fetchers 556 NINT1_F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 557 CALL COPVEC(WORK(KFI),WORK(KINT1),NINT1_F) 558* 559 IPRNTL = IPRDIA 560 CALL NORTCALC(IREFSM,JCMBSPC,ICSPC_CNF,I_DO_NONORT_MCSCF,IPRNTL, 561 & E_FINAL,ERROR_NORM_FINAL,CONV_F,IVBGNSP_PREV) 562 563 RETURN 564 END 565 SUBROUTINE NORTCALC(ISM,ISPC_GAS,ISPC_CNF,I_DO_NONORT_MCSCF, 566 & IPRNT, 567 & E_FINAL,VN_NORTCI,CONV_NORTCI,IVBGNSP_PREV) 568* 569* CI optimization in GAS space number ISPC for symmetry ISM 570* 571* Information about the number of SD, CSF's is assumed to have 572* been determined outside this routine 573* 574* 575* Jeppe Olsen, June 2011 576* 577*. Last modifications; Jeppe 2013; Analytic orbital Hessian and more 578* 579 INCLUDE 'wrkspc.inc' 580 LOGICAL CONVER_NORTCI, CONVER_NORTMC 581 INCLUDE 'cicisp.inc' 582 INCLUDE 'orbinp.inc' 583 INCLUDE 'clunit.inc' 584 INCLUDE 'csm.inc' 585 INCLUDE 'cstate.inc' 586 INCLUDE 'crun.inc' 587 INCLUDE 'strinp.inc' 588 INCLUDE 'stinf.inc' 589 INCLUDE 'strbas.inc' 590 INCLUDE 'glbbas.inc' 591 INCLUDE 'cprnt.inc' 592 INCLUDE 'oper.inc' 593 INCLUDE 'gasstr.inc' 594 INCLUDE 'cgas.inc' 595 INCLUDE 'lucinp.inc' 596 INCLUDE 'intform.inc' 597 INCLUDE 'comjep.inc' 598 INCLUDE 'cc_exc.inc' 599 INCLUDE 'cintfo.inc' 600 INCLUDE 'spinfo.inc' 601 INCLUDE 'cands.inc' 602 INCLUDE 'vb.inc' 603*. Common block for communicating with sigma 604 COMMON/SCRFILES_MATVEC/LUSCR1,LUSCR2,LUSCR3, 605 & LUCBIO_SAVE, LUHCBIO_SAVE,LUC_SAVE 606*. Common block for transferring info to finite difference routines. 607 COMMON/EVB_TRANS/KLIOOEXC_A, KLKAPPA_A, 608 & KLIOOEXC_S,KLKAPPA_S, 609 & KL_C,KL_VEC2,KL_VEC3, 610 & KLOOEXC 611* 612 INCLUDE 'cecore.inc' 613 COMMON/CMXCJ/MXCJ,MAXK1_MX,LSCMAX_MX 614* 615 COMMON/H_OCC_CONS/IH_OCC_CONS 616* 617 REAL*8 INPRDD, INPROD 618* 619 EXTERNAL SIGMA_NORTCI, PRECOND_NORTCI, E_VB_FROM_KAPPA_WRAP 620* 621 622 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'NORTCI') 623 NTEST = 10 624 NTEST = MAX(NTEST,IPRNT) 625* 626 IF(NORT_MET.GE.3) THEN 627 WRITE(6,*) ' Currently unknown NORT_MET = ', NORT_MET 628 STOP ' Currently unknown NORT_MET ' 629 END IF 630* 631 IF(NTEST.GT.1) THEN 632 WRITE(6,*) 633 WRITE(6,*) ' =======================================' 634 WRITE(6,*) ' Control has been transferred to NORTCI' 635 WRITE(6,*) ' =======================================' 636 WRITE(6,*) 637 IF(NORT_MET.EQ.1) THEN 638 WRITE(6,'(5X,A)') 639 & ' Non-orthogonal wave function will be expanded in CI space' 640 ELSE IF (NORT_MET.EQ.2) THEN 641 WRITE(6,'(5X,A)') 642 & ' Initial suite of non-orthogonal configuration codes ' 643 ELSE 644 WRITE(6,*) ' Currently unknown NORT_MET = ', NORT_MET 645 STOP ' Currently unknown NORT_MET ' 646 END IF 647* 648 IF(I_DO_NONORT_MCSCF.EQ.1) THEN 649 WRITE(6,*) ' I will also do MCSCF.... ' 650 WRITE(6,*) ' =========================' 651 END IF 652* 653 WRITE(6,'(5X,A,I3)') 654 & ' Configuration space', ISPC_CNF 655 WRITE(6,'(5X,A,I3)') 656 & ' Spanning CI-space:', ISPC_GAS 657 WRITE(6,'(5X,A,I3)') 658 & ' Orbital space containing non-orthogonal orbitals ', 659 & NORTCIX_SCVB_SPACE 660 WRITE(6,'(5X,A,I3)') 661 & ' Allowed excitation level from Spin-coupled valence space', 662 & NORTCI_SCVB_EXCIT 663 WRITE(6,*) ' Orbital Min. occ Max. occ ' 664 WRITE(6,*) ' ==========================' 665 DO IORB = 1, NOBPT(NORTCIX_SCVB_SPACE) 666 WRITE(6,'(3X,I4,2I3)') 667 & IORB, IOCC_MIN_GN(IORB,ISPC_CNF), IOCC_MAX_GN(IORB,ISPC_CNF) 668 END DO 669 END IF 670* 671*. Prepare for integral handling for complete array 672*. (needed for codes where integrals are accessed individually) 673 IE2ARRAY_A = IE2LIST_I(IE2LIST_IB(IE2LIST_FULL_BIO)) 674 I12S_A = I12S_G(IE2ARRAY_A) 675 I34S_A = I34S_G(IE2ARRAY_A) 676 I1234S_A = I1234S_G(IE2ARRAY_A) 677 IOCOBTP_A = IOCOBTP_G(IE2ARRAY_A) 678 KINT2_LA = KINT2_A(IE2ARRAY_A) 679 KPINT2_LA = KPINT2_A(IE2ARRAY_A) 680* 681*. Number of dets, csf's and configs in CI expansion 682* 683 NDET = NSD_PER_SYM_GN(ISM,ISPC_CNF) 684 NCSF = NCSF_PER_SYM_GN(ISM,ISPC_CNF) 685 NCONF = NCONF_PER_SYM_GN(ISM,ISPC_CNF) 686 687 IF(IPRNT.GT.1) THEN 688 WRITE(6,'(A,I9)') 689 & ' Number of determinants/combinations ',NDET 690 WRITE(6,'(A,I9)') 691 & ' Number of CSFs ',NCSF 692 WRITE(6,'(A,I9)') 693 & ' Number of Confs ',NCONF 694 END IF 695*.Transfer to CANDS 696 ICSM = ISM 697 ISSM = ISM 698*. Complete operator 699 I12 = 2 700* 701 ICSPC_CN = ICSPC_CNF 702 ISSPC_CN = ISSPC_CNF 703 IMSPC_CN = IMSPC_CNF 704* 705 IF(NORT_MET.EQ.1) THEN 706* 707*.Initial version with standard CI behind the scene 708* 709*. allocate memory for this 710 ICSPC = ISPC_GAS 711 ISSPC = ISPC_GAS 712 IMSPC = ISPC_GAS 713* 714 WRITE(6,*) ' NORTCI: ICSPC_CNF,ISSPC_CNF,IMSPC_CNF', 715 & ICSPC_CNF,ISSPC_CNF,IMSPC_CNF 716 WRITE(6,*) ' NORTCI: ICSPC_CN,ISSPC_CN,IMSPC_CN', 717 & ICSPC_CN,ISSPC_CN,IMSPC_CN 718* 719 CALL GET_3BLKS(KVEC1,KVEC2,KVEC3) 720 KVEC1P = KVEC1 721 KVEC2P = KVEC2 722 END IF ! if NORT_MET = 1 723 IF(NORT_MET.EQ.2) THEN 724* We will use a number of different spaces, vectors should be 725* able to store max space 726 END IF 727* 728* 729* Set up complete H and S for test 730* 731 I_DO_COMHAM = 0 732 IF(I_DO_COMHAM .EQ. 1) THEN 733 CALL COMHAM_HS_GEN(SIGMA_NORTCI,NCSF) 734C COMHAM_HS_GEN(MSTV,NDIM) 735 STOP ' Enforced stop after COMHAM_HS_GEN ' 736 END IF 737* 738*. CI diagonal - if required 739* 740*. Not yet implemented 741* 742 WRITE(6,*) ' Diagonal in Non-orthogonal CI not yet implemented' 743* 744 I_DO_PRECOND = 0 745 IPREC_FORM = 0 746 I_ER_CONV = 2 747 THRES_R = SQRT(THRES_E) 748 SHIFT = 0.0D0 749* 750 MAXITL = MAXIT 751 MAXVECL = MXCIV 752* 753*. Allocate space for iterative solver: 754*. Four scratch vectors 755C CALL MEMMAN(KL_VEC1,NCSF,'ADDL ',2,'EXTVC1') 756C CALL MEMMAN(KL_VEC2,NCSF,'ADDL ',2,'EXTVC2') 757C CALL MEMMAN(KL_VEC3,NCSF,'ADDL ',2,'EXTVC3') 758*. Increased for CONF approach 759 CALL MEMMAN(KL_VEC1,NCSF_MNMX_MAX,'ADDL ',2,'EXTVC1') 760 CALL MEMMAN(KL_VEC2,NCSF_MNMX_MAX,'ADDL ',2,'EXTVC2') 761 CALL MEMMAN(KL_VEC3,NCSF_MNMX_MAX,'ADDL ',2,'EXTVC3') 762*. Space for subsspace matrices 763 CALL MEMMAN(KL_RNRM,MAXITL*NROOT,'ADDL ',2,'RNRM ') 764 CALL MEMMAN(KL_EIG ,MAXITL*NROOT,'ADDL ',2,'EIG ') 765 CALL MEMMAN(KL_FINEIG,NROOT,'ADDL ',2,'FINEIG') 766 CALL MEMMAN(KL_APROJ,MAXVECL**2,'ADDL ',2,'APROJ ') 767 CALL MEMMAN(KL_SPROJ,MAXVECL**2,'ADDL ',2,'SPROJ ') 768 CALL MEMMAN(KL_AVEC ,MAXVECL**2,'ADDL ',2,'AVEC ') 769 LLWORK = 5*MAXVECL**2 + 2*MAXVECL 770 CALL MEMMAN(KL_WORK ,LLWORK ,'ADDL ',2,'WORK ') 771 CALL MEMMAN(KL_AVEC ,MAXVECL**2,'ADDL ',2,'AVECP ') 772 CALL MEMMAN(KL_AVECP,MAXVECL**2,'ADDL ',2,'AVECP ') 773*. And a matrix over active orbitals 774 CALL MEMMAN(KL_MACT,NACOB**2,'ADDL ',2,'M_ACT ') 775* 776*. Initial approximation to CI-vector 777* 778 IF(IRESTR.EQ.0) THEN 779C INI_CSFEXP(CINI) 780 CALL INI_CSFEXP(WORK(KL_VEC1)) 781*. and transfer initial guess to DISC 782 CALL VEC_TO_DISC(WORK(KL_VEC1),NCSF,1,-1,LUSC54) 783 ELSE 784 WRITE(6,*) ' Restart from previous CI vector ' 785*. Expand from previous to current cnf-space 786 NCSF_PREV = NVB_CSF(IVBGNSP_PREV) 787 WRITE(6,*) 'IVBGNSP_PREV, NCSF_PREV = ', 788 & IVBGNSP_PREV, NCSF_PREV 789 CALL VEC_FROM_DISC(WORK(KL_VEC1),NCSF_PREV,1,-1,LUSC54) 790C EXP_CNFSPC(CIVECIN,CIVECUT,ICONF_OCC,NCONF_FOR_OPEN, 791C & MINOCC_IN,MAXOC_IN,NOBCNF) 792 IF(IVBGNSP_PREV.EQ.0) THEN 793 CALL EXP_CNFSPC(WORK(KL_VEC1), WORK(KL_VEC2), 794 & WORK(KICONF_OCC_GN(ICSM,ISPC_CNF)), 795 & NCONF_PER_OPEN_GN(1,ICSM,ISPC_CNF), 796 & VB_REFSPCO_MIN, VB_REFSPCO_MAX, 797 & NACOB) 798 ELSE 799 CALL EXP_CNFSPC(WORK(KL_VEC1), WORK(KL_VEC2), 800 & WORK(KICONF_OCC_GN(ICSM,ISPC_CNF)), 801 & NCONF_PER_OPEN_GN(1,ICSM,ISPC_CNF), 802 & VB_GNSPC_MIN(1,IVBGNSP_PREV),VB_GNSPC_MAX(1,IVBGNSP_PREV), 803 & NACOB) 804 END IF ! Test of VBGNSP_PREV 805 CALL VEC_TO_DISC(WORK(KL_VEC2),NCSF,1,-1,LUSC54) 806 END IF 807*. And diagonalize 808 NTESTL = 10000 809 SHIFT = 0.0D0 810 CALL MINGENEIG(SIGMA_NORTCI,PRECOND_NORTCI, 811 & IPREC_FORM,THRES_E,THRES_R,I_ER_CONV, 812 & WORK(KL_VEC1),WORK(KL_VEC2),WORK(KL_VEC3), 813 & LUSC54, LUSC37, 814 & WORK(KL_RNRM),WORK(KL_EIG),WORK(KL_FINEIG),MAXITL, 815 & NCSF,LUSC38,LUSC39,LUSC40,LUSC53,LUSC51,LUSC52, 816 & NROOT,MAXVECL,NROOT,WORK(KL_APROJ), 817 & WORK(KL_AVEC),WORK(KL_SPROJ),WORK(KL_WORK), 818 & NTESTL,SHIFT,WORK(KL_AVECP),I_DO_PRECOND, 819 & CONV_NORTCI,E_NORTCI,VN_NORTCI) 820 E_FINAL = E_NORTCI 821* 822 IF(I_DO_NONORT_MCSCF.EQ.0) CONV_F = CONV_NORTCI 823* 824 WRITE(6,*) ' Final energy in non-orthogonal CI ', E_NORTCI 825 WRITE(6,*) ' Final residual norm in non-orthogonal CI', 826 & VN_NORTCI 827 IF(NTEST.GE.10000) THEN 828 WRITE(6,*) ' Final approximation to eigenvector from MINGENEIG' 829 CALL WRTMAT(WORK(KL_VEC1),1,NCSF,1,NCSF) 830 END IF 831* 832* Analyze the CI- coefficients of the resulting wave function 833* 834C ANACSF(CIVEC,ICONF_OCC,NCONF_FOR_OPEN,IPROCS,THRES, 835C & MAXTRM,IOUT) 836 MAXTRM = 1000 837 THRES = 0.03 838 IOUT = 6 839*. The analyzer assumes full set of active electrons, adjust for this 840 NACTEL = NACTEL - 2*(IB_ORB_CONF-NINOB-1) 841 CALL ANACSF(WORK(KL_VEC1),WORK(KICONF_OCC_GN(ICSM,ISPC_CNF)), 842 & NCONF_PER_OPEN_GN(1,ICSM,ISPC_CNF), 843 & WORK(KCFTP),THRES, MAXTRM,IOUT) 844 NACTEL = NACTEL + 2*(IB_ORB_CONF-NINOB-1) 845*. Density etc not implemented for NORT_MET = 2, so 846 IF(NORT_MET.EQ.2) GOTO 9999 847* 848* And construct density matrix 849* 850 XDUM = 0.0D0 851 CALL VB_DENSI(WORK(KRHO1),XDUM,1,WORK(KL_VEC1),WORK(KL_VEC2), 852 & WORK(KL_VEC3)) 853*. Obtain natural orbitals and natural occupation numbers 854*. 1: Metric over active orbitals 855C SACT(SACT,C) 856 CALL GET_SACT(WORK(KL_MACT),WORK(KMOAOUT)) 857*. 2: and diagonalize using metric of active orbitals 858C NONORT_NATORB(SACT,RHO1) 859 CALL NONORT_NATORB(WORK(KL_MACT),WORK(KRHO1)) 860* 861 IF(I_DO_NONORT_MCSCF.EQ.1) THEN 862 IREFSPC_MCSCF = ISPC_GAS 863* 864 IF(NORT_MET.NE.1) THEN 865 WRITE(6,*) ' MCSCF works only for NORT_MET = 1' 866 STOP ' MCSCF works only for NORT_MET = 1' 867 END IF 868*. Allowed number of micro and macro's 869 870 WRITE(6,*) ' MCSCF part entered ' 871 WRITE(6,*) ' ===================' 872 WRITE(6,*) ' Allowed number of macroiterations ', MAXIT_MAC 873 WRITE(6,*) ' Allowed number of microiterations ', MAXIT_MIC 874* 875* ==================== 876* Generate excitations 877* ==================== 878* 879* Two types: 880* Interspace excitations: only antisymmtric conformal operators 881* Active-Active exciations: both symmetric and antisymmetric operators 882* 883* For historical reasons, there is a flag for eliminating the 884* interspace excitations 885* 886*. Number of excitations 887* ====================== 888* 889* 890 INCLUDE_ONLY_TOTSYM_SUPSYM = 1 891 IF(I_USE_SUPSYM.EQ.1.AND.INCLUDE_ONLY_TOTSYM_SUPSYM.EQ.1) THEN 892 I_RESTRICT_SUPSYM = 1 893 ELSE 894 I_RESTRICT_SUPSYM = 0 895 END IF 896 I_DO_INTER_EXC = 1 897* 898*. Number of internal excitations in active space 899C ORB_EXCIT_INT_SPACE(IORBSPC,ITOTSYM,NOOEXC,IOOEXC,NUMONLY) 900 CALL ORB_EXCIT_INT_SPACE 901 & (NORTCIX_SCVB_SPACE,1,NOOEXC_AA,IDUM,1,1, 902 & I_RESTRICT_SUPSYM,WORK(KMO_SUPSYM)) 903*.Number of interspace excitations 904 IF(I_DO_INTER_EXC.EQ.1) THEN 905*. Number of interspace excitations 906*. Nonredundant type-type excitations 907 CALL MEMMAN(KLTTACT,(NGAS+2)**2,'ADDL ',1,'TTACT ') 908 CALL NONRED_TT_EXC(WORK(KLTTACT),IREFSPC_MCSCF,0) 909*. Nonredundant interspace orbital excitations 910 KLOOEXC = 1 911 KLOOEXCC= 1 912*. Number of interspace excitations 913 CALL NONRED_OO_EXC2(NOOEXC_IS,WORK(KLOOEXC),WORK(KLOOEXCC), 914 & 1,WORK(KLTTACT),I_RESTRICT_SUPSYM,WORK(KMO_SUPSYM), 915 & N_INTER_EXC,N_INTRA_EXC,1) 916 END IF 917*. Number of symmetric rotations 918 NOOEXC_S = NOOEXC_AA 919*. Number of antisymmetric rotations 920 NOOEXC_A = NOOEXC_IS + NOOEXC_AA 921*. The total number of excitations 922 NOOEXC = NOOEXC_S + NOOEXC_A 923* 924*. Allocate space 925* ====================== 926* 927*. Separate arrays are set up for all and symmetric excitations(??) 928*. 929*. For all excitations 930 CALL MEMMAN(KLOOEXC,NTOOB*NTOOB,'ADDL ',1,'OOEXC ') 931 CALL MEMMAN(KLOOEXCC,2*NOOEXC,'ADDL ',1,'OOEXCC') 932*. For the symmetric excitations 933 CALL MEMMAN(KLOOEXCC_S,2*NOOEXC_S,'ADDL ',1,'OOEXCS') 934*. Allow these parameters to be known outside 935 KIOOEXC = KLOOEXC 936 KIOOEXCC = KLOOEXCC 937* 938*. And the excitations: The active- active are added twice.. 939* ====================== 940* 941 IF(I_DO_INTER_EXC.EQ. 1) THEN 942*. The interspace excitations 943 CALL NONRED_OO_EXC2(NOOEXC_IS,WORK(KLOOEXC),WORK(KLOOEXCC), 944 & 1,WORK(KLTTACT),I_RESTRICT_SUPSYM,WORK(KMO_SUPSYM), 945 & N_INTER_EXC,N_INTRA_EXC,2) 946 END IF 947*. The internal excitations 948 CALL ORB_EXCIT_INT_SPACE(NORTCIX_SCVB_SPACE,1,NOOEXC_S, 949 & WORK(KLOOEXCC),0,NOOEXC_IS+1, 950 & I_RESTRICT_SUPSYM,WORK(KMO_SUPSYM)) 951 CALL ORB_EXCIT_INT_SPACE(NORTCIX_SCVB_SPACE,1,NOOEXC_S, 952 & WORK(KLOOEXCC),0,NOOEXC_IS+NOOEXC_S+1, 953 & I_RESTRICT_SUPSYM,WORK(KMO_SUPSYM)) 954*. Save also the internal excitations in KLOOEXCC_S 955 CALL ICOPVE3(WORK(KLOOEXCC),NOOEXC_IS*2+1, 956 & WORK(KLOOEXCC_S),1,2*NOOEXC_S) 957C ICOPVE3(IIN,IOFFIN,IOUT,IOFFOUT,NDIM) 958 WRITE(6,*) ' NOOEXC after ORB_EXCIT.. ', NOOEXC 959C PRINT_ORBEXC_LIST(IOOEXC,NOOEXC_A,NOOEXC_S) 960 WRITE(6,*) ' The list of orbital excitations' 961 CALL PRINT_ORBEXC_LIST(WORK(KLOOEXCC),NOOEXC_A,NOOEXC_S) 962 WRITE(6,*) ' The list of symmetric excitations' 963 CALL PRINT_ORBEXC_LIST(WORK(KLOOEXCC_S),0,NOOEXC_S) 964* 965* Allocate space for gradient, kappa, Hessian, etc 966* ================================================ 967* 968 WRITE(6,*) ' NOOEXC before MEMMAN ', NOOEXC 969 CALL MEMMAN(KLE1,NOOEXC,'ADDL ',2,'E1_MC ') 970 CALL MEMMAN(KLKAPPA,NOOEXC,'ADDL ',2,'LKAPPA') 971 CALL MEMMAN(KLE2SC,NOOEXC,'ADDL ',2,'E2SC ') 972*. Memory for orbital-Hessian - if required 973 LE2 = NOOEXC*(NOOEXC+1)/2 974 CALL MEMMAN(KLE2,LE2,'ADDL ',2,'E2P_MC') 975*. For eigenvectors of orbhessian 976 LE2F = NOOEXC**2 977 CALL MEMMAN(KLE2F,LE2F,'ADDL ',2,'E2_MC ') 978*. and eigenvalues, scratch, kappa 979 CALL MEMMAN(KLE2VL,NOOEXC,'ADDL ',2,'EIGVAL') 980*. Space for two one-bodydensity matrices 981 CALL MEMMAN(KLS,NTOOB**2,'ADDL ',2,'SMO ') 982*. KMOAOIN will be used for storing MO's that should be transformed 983 I_STRINGS_BIO_OR_ORIG = 1 984 IF(I_STRINGS_BIO_OR_ORIG.EQ.1) THEN 985 KKCMO_I = KMOAOIN 986 KKCMO_J = KCBIO2 987 KKCMO_K = KMOAOIN 988 KKCMO_L = KCBIO2 989 ELSE 990 KKCMO_I = KCBIO2 991 KKCMO_J = KMOAOIN 992 KKCMO_K = KCBIO2 993 KKCMO_L = KMOAOIN 994 END IF 995* 996 LEN1_F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 997 LEN1_A = NDIM_1EL_MAT(1,NACOBS,NACOBS,NSMOB,0) 998 CALL COPVEC(WORK(KMOAOUT),WORK(KMOAOIN),LEN1_F) 999*. For summary 1000 NITEM = 6 1001 CALL MEMMAN(KL_SUMMARY,NITEM*MAXIT_MAC,'ADDL ',2,'SUMMAR') 1002* 1003*. Finished with the preparations 1004* 1005 CONVER_NORTMC = .FALSE. 1006 XKAP_THRES = 1.0D-6 1007 STEP_MAX = 0.75D0 1008* 1009 DO IMAC = 1, MAXIT_MAC 1010 NMAC = IMAC 1011 WRITE(6,*) ' Output from Macroiteration', IMAC 1012 WRITE(6,*) ' ==================================' 1013 INIMIC = 1 1014 DO IMIC = 1, MAXIT_MIC 1015 WRITE(6,*) ' Output from Microiteration', IMIC 1016 WRITE(6,*) ' ==================================' 1017* 1018*. The current expansion of the AOs is in KMOAOIN. Obtain the 1019* bioorbitals 1020 CALL GET_CBIO(WORK(KMOAOIN),WORK(KCBIO),WORK(KCBIO2)) 1021 IF(NTEST.GE.100) THEN 1022 WRITE(6,*) 1023 & ' Current set of orbitals' 1024 CALL APRBLM2(WORK(KMOAOIN),NTOOBS,NTOOBS,NSMOB,0) 1025 END IF 1026 IF(NTEST.GE.1000) THEN 1027 WRITE(6,*) ' Current set of bioorbitals ' 1028 CALL APRBLM2(WORK(KCBIO),NTOOBS,NTOOBS,NSMOB,0) 1029 END IF 1030* 1031 IF(NTEST.GE.100) THEN 1032* Calculate and print metric 1033 CALL GET_SMO(WORK(KMOAOIN),WORK(KLS),0) 1034 WRITE(6,*) ' Metric in Current MO basis ' 1035 CALL APRBLM2(WORK(KLS),NTOOBS,NTOOBS,NSMOB,0) 1036 END IF 1037* 1038* ===================================================== 1039* Integral transformation to current set of orbitals 1040* ===================================================== 1041* 1042 IF(NTEST.GE.10) THEN 1043 WRITE(6,*) 1044 & ' Bioorthogonal integral transformation ' 1045 END IF 1046 IOCOBTP_A = 1 1047 INTSM_A = 1 1048 CALL FLAG_ACT_INTLIST(IE2LIST_FULL_BIO) 1049 CALL DO_ORBTRA(1,1,0,IE2LIST_FULL_BIO, 1050 & IOCOBTP_A,INTSM_A) 1051* 1052 1053* 1054 IF(NTEST.GE.1000) THEN 1055 WRITE(6,*) ' one-electron integrals in biobase' 1056 WRITE(6,*) ' =================================' 1057 CALL APRBLM2(WORK(KINT1),NTOOBS,NTOOBS,NSMOB,0) 1058 END IF 1059 NINT1_F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 1060 CALL COPVEC(WORK(KFI),WORK(KINT1),NINT1_F) 1061* 1062* ============================== 1063*. Perform CI in current basis in first Micro of each macro 1064* ============================== 1065* 1066 IF(IMIC.EQ.1) THEN 1067 IF(NTEST.GE.1000) WRITE(6,*) ' CI optimization ' 1068 CALL MINGENEIG(SIGMA_NORTCI,PRECOND_NORTCI, 1069 & IPREC_FORM,THRES_E,THRES_R,I_ER_CONV, 1070 & WORK(KL_VEC1),WORK(KL_VEC2),WORK(KL_VEC3), 1071 & LUSC54, LUSC37, 1072 & WORK(KL_RNRM),WORK(KL_EIG),WORK(KL_FINEIG),MAXITL, 1073 & NCSF,LUSC38,LUSC39,LUSC40,LUSC53,LUSC51,LUSC52, 1074 & NROOT,MAXVECL,NROOT,WORK(KL_APROJ), 1075 & WORK(KL_AVEC),WORK(KL_SPROJ),WORK(KL_WORK), 1076 & NTESTL,SHIFT,WORK(KL_AVECP),I_DO_PRECOND, 1077 & CONV_NORTCI,E_NORTCI,VN_NORTCI) 1078 WORK(KL_SUMMARY-1+(IMAC-1)*NITEM + 1) = E_NORTCI 1079 IF(IMAC.EQ.1) THEN 1080 DELTA = 0.0D0 1081 ELSE 1082 DELTA = E_NORTCI - WORK(KL_SUMMARY-1+(IMAC-2)*NITEM + 1) 1083 END IF 1084 WORK(KL_SUMMARY-1+(IMAC-1)*NITEM + 2) = DELTA 1085*. Preliminary final energy 1086 E_FINAL = E_NORTCI 1087* 1088 IF(NTEST.GE.10000) THEN 1089 WRITE(6,*) 1090 & ' Final approximation to eigenvector from MINGENEIG' 1091 CALL WRTMAT(WORK(KL_VEC1),1,NCSF,1,NCSF) 1092 END IF 1093* 1094* And construct the one- and two-body density matrices 1095* 1096 CALL VB_DENSI(WORK(KRHO1),WORK(KRHO2),2,WORK(KL_VEC1), 1097 & WORK(KL_VEC2),WORK(KL_VEC3)) 1098*. Construct Active Fock-matrix 1099 CALL DO_ORBTRA(1,1,1,IE2LIST_FULL_BIO, 1100 & IOCOBTP_A,INTSM_A) 1101 END IF !micit = 1 1102* 1103* ===================================== 1104*. Construct Gradient at current point 1105* ===================================== 1106* 1107*. The Fock-matrices for biorthogonal expansion 1108C FOCK_MAT_NORT(F1,F2,I12,FI,FA) 1109 CALL FOCK_MAT_NORT(WORK(KF),WORK(KF2),2,WORK(KFI),WORK(KFA)) 1110*. And the interspace gradient 1111C E1_FROM_F_NORT(E1,F1,F2,IOPSM,IOOEXC,IOOEXCC, 1112C & NOOEXC,NTOOB,NTOOBS,NSMOB,IBSO,IREOST) 1113 CALL E1_FROM_F_NORT(WORK(KLE1),WORK(KF),WORK(KF2),1, 1114 & WORK(KLOOEXC),WORK(KLOOEXCC),NOOEXC_A,NTOOB, 1115 & NTOOBS,NSMOB,IBSO,IREOST) 1116*. And add the active-active gradient 1117* The interspace excitations 1118C VB_GRAD_ORBVBSPC(NOOEXC,IOOEXC,E1,C,VEC1_CSF,VEC2_CSF) 1119 IF(NTEST.GE.1000) 1120 & WRITE(6,*) ' Active-active gradient will be calculated ' 1121 CALL VB_GRAD_ORBVBSPC(NOOEXC_S,WORK(KLOOEXCC_S), 1122 & WORK(KLE1+NOOEXC_IS), 1123 & WORK(KL_VEC1),WORK(KL_VEC2),WORK(KL_VEC3)) 1124 IF(NTEST.GE.0) WRITE(6,*) ' Gradient calculated ' 1125 IF(NTEST.GE.1000) THEN 1126 WRITE(6,*) ' Gradient vector ' 1127 CALL WRTMAT(WORK(KLE1),1,NOOEXC,1,NOOEXC) 1128 END IF 1129 E1NORM = INPROD(WORK(KLE1),WORK(KLE1),NOOEXC) 1130 WORK(KL_SUMMARY-1+(IMAC-1)*NITEM + 3) = E1NORM 1131C STOP ' Enforced stop ' 1132* 1133 I_DO_DIFTEST = 0 1134 IF(I_DO_DIFTEST.EQ.1) THEN 1135*. Finite difference test of gradient at Kappa = 0 1136 KLIOOEXC_A = KIOOEXCC 1137 KLIOOEXC_S = KLOOEXCC_S 1138 KLKAPPA_A = KLKAPPA 1139 KLKAPPA_S = KLKAPPA+NOOEXC_A 1140 KL_C = KL_VEC1 1141* 1142C COMMON/EVB_TRANS/KLIOOEXC_A, KLKAPPA_A, 1143C & KLIOOEXC_S,KLKAPPA_S, 1144C & KL_C,KL_VEC2,KL_VEC3 1145 ZERO = 0.0D0 1146 CALL SETVEC(WORK(KLKAPPA),ZERO,NOOEXC) 1147 CALL MEMMAN(KLE1_EXTRA,NOOEXC,'ADDL ',2,'E1_EXT') 1148 CALL GENERIC_GRAD_FROM_F(WORK(KLE1_EXTRA),NOOEXC, 1149 & E_VB_FROM_KAPPA_WRAP, WORK(KLKAPPA)) 1150* 1151*. Clean up: recalculate integrals corresponding to MO's in MOAOIN 1152* 1153 IF(I_STRINGS_BIO_OR_ORIG.EQ.1) THEN 1154 KKCMO_I = KMOAOIN 1155 KKCMO_J = KCBIO2 1156 KKCMO_K = KMOAOIN 1157 KKCMO_L = KCBIO2 1158 ELSE 1159 KKCMO_I = KCBIO2 1160 KKCMO_J = KMOAOIN 1161 KKCMO_K = KCBIO2 1162 KKCMO_L = KMOAOIN 1163 END IF 1164 IF(NTEST.GE.10) THEN 1165 WRITE(6,*) 1166 & ' Bioorthogonal integral transformation ' 1167 END IF 1168 CALL TRAINT 1169 CALL FLAG_ACT_INTLIST(IE2LIST_FULL_BIO) 1170 STOP ' Enforced stop after FD calc of gradient' 1171 END IF ! Finite Difference test 1172* 1173 IF(IMIC.EQ.1) THEN 1174* 1175*. Obtain new orbital Hessian 1176* 1177*. Complete orbital Hessian 1178 IE2FORM = 1 1179*. Prepare for finite difference calc of Hessian 1180 KLIOOEXC_A = KIOOEXCC 1181 KLIOOEXC_S = KLOOEXCC_S 1182 KLKAPPA_A = KLKAPPA 1183 KLKAPPA_S = KLKAPPA+NOOEXC_A 1184 KL_C = KL_VEC1 1185* 1186*. IE2FORM Is not active at the moment 1187 IE2FORM = 1 1188 CALL ORBHES_VB(WORK(KLE2),IE2FORM) 1189* 1190*. Diagonalize to determine lowest eigenvalue 1191* 1192*. Outpack to complete form 1193 CALL TRIPAK(WORK(KLE2F),WORK(KLE2),2,NOOEXC,NOOEXC) 1194C TRIPAK(AUTPAK,APAK,IWAY,MATDIM,NDIM) 1195*. Lowest eigenvalue 1196C DIAG_SYMMAT_EISPACK(A,EIGVAL,SCRVEC,NDIM,IRETURN) 1197 CALL DIAG_SYMMAT_EISPACK(WORK(KLE2F),WORK(KLE2VL), 1198 & WORK(KLE2SC),NOOEXC,IRETURN) 1199 IF(IRETURN.NE.0) THEN 1200 WRITE(6,*) 1201 & ' Problem with diagonalizing E2, IRETURN = ', IRETURN 1202 END IF 1203 IF(IPRNT.GE.1000) THEN 1204 WRITE(6,*) ' Eigenvalues: ' 1205 CALL WRTMAT(WORK(KLE2VL),1,NOOEXC,1,NOOEXC) 1206 END IF 1207 IF(NTEST.GE.1000) THEN 1208 WRITE(6,*) ' Eigenvectors of Hessian ' 1209 CALL WRTMAT(WORK(KLE2F),NOOEXC,NOOEXC, 1210 & NOOEXC,NOOEXC) 1211 END IF 1212*. Lowest eigenvalue 1213C XMNMX(VEC,NDIM,MINMAX) 1214 E2VL_MN = XMNMX(WORK(KLE2VL),NOOEXC,1) 1215 IF(NTEST.GE.2) 1216 & WRITE(6,*) ' Lowest eigenvalue of E2(orb) = ', E2VL_MN 1217 END IF !imic = 1 1218*. Transform gradient to diagonal basis 1219 IF(NTEST.GE.1000) THEN 1220 WRITE(6,*) ' Gradient in original basis before MATVCC' 1221 CALL WRTMAT(WORK(KLE1),1,NOOEXC,1,NOOEXC) 1222 END IF 1223 CALL MATVCC(WORK(KLE2F),WORK(KLE1),WORK(KLE2SC), 1224 & NOOEXC,NOOEXC,1) 1225 CALL COPVEC(WORK(KLE2SC),WORK(KLE1),NOOEXC) 1226*. Solve shifted NR equations with step control 1227 666 CONTINUE 1228 TOLER = 1.1D0 1229* SOLVE_SHFT_NR_IN_DIAG_BASIS( 1230* & E1,E2,NDIM,STEP_MAX,TOLERANCE,X,ALPHA)A 1231 CALL SOLVE_SHFT_NR_IN_DIAG_BASIS(WORK(KLE1),WORK(KLE2VL), 1232 & NOOEXC,STEP_MAX,TOLER,WORK(KLKAPPA),ALPHA,DELTA_E_PRED) 1233 XNORM_STEP = 1234 & SQRT(INPROD(WORK(KLKAPPA),WORK(KLKAPPA),NOOEXC)) 1235 WORK(KL_SUMMARY-1+(IMAC-1)*NITEM + 4) = XNORM_STEP 1236 IF(NTEST.GE.2) WRITE(6,*) ' Norm of step = ', XNORM_STEP 1237*. transform step to original basis 1238 CALL MATVCC(WORK(KLE2F),WORK(KLKAPPA),WORK(KLE2SC), 1239 & NOOEXC,NOOEXC,0) 1240 CALL COPVEC(WORK(KLE2SC),WORK(KLKAPPA),NOOEXC) 1241 IF(NTEST.GE.1000) THEN 1242 WRITE(6,*) ' Kappa in original basis ' 1243 CALL WRTMAT(WORK(KLKAPPA),1,NOOEXC,1,NOOEXC) 1244 END IF 1245*. Energy for new step: 1246 ENEW = E_VB_FROM_KAPPA_WRAP(WORK(KLKAPPA)) 1247 WRITE(6,*) ' Energy at new iteration point ', ENEW 1248*. Preliminary E_FINAL .. 1249 E_FINAL = ENEW 1250 THRESD = 1.0D-7 1251 IF(ENEW.GT.E_NORTCI+THRES) THEN 1252*. Step was to large, Decrease steplength and recalculate step 1253 STEP_MAX = STEP_MAX/2.0D0 1254 GOTO 666 1255 END IF 1256 1257* 1258*. Obtain New MO coefficients in MOAOUT: MOAOIN* Exp(-Kappa_A S) Exp(-Kappa_S S) 1259* 1260C NEWMO_FROM_KAPPA_NORT( 1261C & NOOEXC_A,IOOEXC_A,KAPPA_A, 1262C & NOOEXC_S,IOOEXC_S,KAPPA_S,CMOAO_IN,CMOAO_OUT) 1263 CALL NEWMO_FROM_KAPPA_NORT( 1264 & NOOEXC_A,WORK(KIOOEXCC),WORK(KLKAPPA), 1265 & NOOEXC_S,WORK(KLIOOEXC_S),WORK(KLKAPPA+NOOEXC_A), 1266 & WORK(KMOAOIN),WORK(KMOAOUT)) 1267*. And copy to KMOAOIN for next round 1268 CALL COPVEC(WORK(KMOAOUT),WORK(KMOAOIN),LEN1_F) 1269* 1270 IF(IPRNT.GE.100) THEN 1271 WRITE(6,*) ' Updated MOAO-coefficients' 1272 CALL APRBLM2(WORK(KMOAOUT),NTOOBS,NTOOBS,NSMOB,0) 1273 END IF 1274 IF(XNORM_STEP.LT.XKAP_THRES) THEN 1275 CONVER_NORTMC = .TRUE. 1276 GOTO 1001 1277 END IF 1278* 1279 END DO ! End of loop over microiterations 1280 END DO ! End of loop over macroiterations 1281 1001 CONTINUE 1282* 1283 IF(CONVER_NORTMC) THEN 1284 WRITE(6,*) ' Convergence was obtained in ', NMAC , ' iterations' 1285 ELSE 1286 WRITE(6,*) ' Convergence was not obtained ' 1287 END IF 1288* 1289 WRITE(6,*) ' Final energy = ', E_FINAL 1290* 1291 IF(IPRNT.GE.2) THEN 1292 WRITE(6,*) ' Optimized MOAO-coefficients:' 1293 WRITE(6,*) ' ============================' 1294 CALL PRINT_CMOAO(WORK(KMOAOUT)) 1295 END IF 1296* 1297* And construct the final density matrices 1298* 1299 CALL VB_DENSI(WORK(KRHO1),WORK(KRHO2),1,WORK(KL_VEC1), 1300 & WORK(KL_VEC2),WORK(KL_VEC3)) 1301*. Obtain natural orbitals and natural occupation numbers 1302*. 1: Metric over active orbitals 1303C SACT(SACT,C) 1304 CALL GET_SACT(WORK(KL_MACT),WORK(KMOAOUT)) 1305*. 2: and diagonalize using metric of active orbitals 1306C NONORT_NATORB(SACT,RHO1) 1307 CALL NONORT_NATORB(WORK(KL_MACT),WORK(KRHO1)) 1308* 1309* Analyze the CI- coefficients of the resulting wave function 1310* 1311C ANACSF(CIVEC,ICONF_OCC,NCONF_FOR_OPEN,IPROCS,THRES, 1312C & MAXTRM,IOUT) 1313 MAXTRM = 1000 1314 THRES = 0.03 1315 IOUT = 6 1316 NACTEL = NACTEL - 2*(IB_ORB_CONF-NINOB-1) 1317 CALL ANACSF(WORK(KL_VEC1),WORK(KICONF_OCC_GN(ICSM,ISPC_CNF)), 1318 & NCONF_PER_OPEN_GN(1,ICSM,ISPC_CNF), 1319 & WORK(KCFTP),THRES, MAXTRM,IOUT) 1320 NACTEL = NACTEL + 2*(IB_ORB_CONF-NINOB-1) 1321* 1322 WRITE(6,*) ' =======================' 1323 WRITE(6,*) ' Summary of convergence ' 1324 WRITE(6,*) ' =======================' 1325 WRITE(6,*) 1326 WRITE(6,*) 1327 &' Iter Energy Delta E E1-norm Step ' 1328 WRITE(6,*) 1329 &' ====================================================' 1330 DO IMAC = 1, NMAC 1331 II = KL_SUMMARY + (IMAC-1)*NITEM-1 1332 WRITE(6,'(2X, I3, 1X, F18.10,1X, E10.3, E10.3, E10.3)') 1333 & IMAC, WORK(II+1),WORK(II+2),WORK(II+3), WORK(II+4) 1334 END DO 1335* 1336 END IF ! I do MCSCF 1337* 1338 9999 CONTINUE 1339* 1340* 1341 CALL MEMMAN(IDUMMY,IDUMMY,'FLUSM ',IDUM,'NORTCI') 1342 RETURN 1343 END 1344 SUBROUTINE SIGMA_NORTCI(C,HC,SC,IDOHC,IDOSC) 1345* 1346* Routine for sigma-generation, nonorthogonal CI, using biortogonal 1347* approach. Integrals in biobasis assumed in place 1348* 1349* Initial version, Jeppe Olsen June 2011 1350* 1351 INCLUDE 'implicit.inc' 1352 INCLUDE 'mxpdim.inc' 1353 INCLUDE 'wrkspc-static.inc' 1354 INCLUDE 'crun.inc' 1355 INCLUDE 'cstate.inc' 1356 INCLUDE 'cands.inc' 1357 INCLUDE 'cicisp.inc' 1358 INCLUDE 'orbinp.inc' 1359 INCLUDE 'glbbas.inc' 1360 INCLUDE 'spinfo.inc' 1361 INCLUDE 'cintfo.inc' 1362 INCLUDE 'oper.inc' 1363 INCLUDE 'cecore.inc' 1364 INCLUDE 'intform.inc' 1365 INCLUDE 'lucinp.inc' 1366 INCLUDE 'vb.inc' 1367*. Two local scratch files 1368 COMMON/SCRFILES_MATVEC/LUSCR1,LUSCR2,LUSCR3, 1369 & LUCBIO_SAVE, LUHCBIO_SAVE,LUC_SAVE 1370*. Input: C in CSF basis, configuration space ICSPC_CN 1371*. Output: Sigma CSF basis, configuration space ISSPC_CN 1372*. Output files 1373 DIMENSION HC(*), SC(*) 1374* 1375 DIMENSION C(*) 1376* 1377 IDUM = 0 1378 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'NOCISI') 1379* 1380 NTEST = 00 1381 IF(NTEST.GE.10) THEN 1382 WRITE(6,*) 1383 WRITE(6,*) ' Output from SIGMA_NORTCI' 1384 WRITE(6,*) ' ========================' 1385 WRITE(6,*) 1386 IF(IDOHC.EQ.1) WRITE(6,*) ' HC will be calculated ' 1387 IF(IDOSC.EQ.1) WRITE(6,*) ' SC will be calculated' 1388 WRITE(6,*) 1389 WRITE(6,*) ' CI and MINMAX space for C ', ICSPC,ICSPC_CN 1390 WRITE(6,*) ' CI and MINMAX space for S ', ISSPC,ISSPC_CN 1391 WRITE(6,*) ' CI and MINMAX space, Intermediate ', IMSPC,IMSPC_CN 1392* 1393 IF(NORT_MET.EQ.1) THEN 1394 WRITE(6,*) 'Approach based on reexpansion in GASpace ' 1395 ELSE IF (NORT_MET.EQ.2) THEN 1396 WRITE(6,*) ' Approach using initial configuration routines' 1397 END IF 1398* 1399 END IF 1400*. This routine does all the CSF-SD transformation explicitly, 1401*. so fool inner routines, especially MV7, to believe that we 1402*. are working with SD's 1403 NOCSF_SAVE = NOCSF 1404 NOCSF = 1 1405* 1406 NCSF_CSPC_CNF = NCSF_PER_SYM_GN(ICSM,ICSPC_CN) 1407 IF(NTEST.GE.100) THEN 1408 WRITE(6,*) ' Input vector in CSF basis ' 1409 CALL WRTMAT(C,1,NCSF_CSPC_CNF,1,NCSF_CSPC_CNF) 1410 END IF 1411* 1412 IF(NORT_MET.EQ.1) THEN 1413* 1414* Initial version, with standard FCI behind the screen (and you are pt 1415* behind the screen...) 1416* The route 1417* 1418* 1) Obtain Input state in biortogonal basis in space IMSPC_CN - 1419* in Slater determinants 1420* 2) Obtain Hamiltonian times input state in bioorthogonal basis 1421* 1422* In the initial version step 1 consists of 1423* 1.1) Transform C from CSF to SD in CI ICSPC_CN 1424* 1.2) Expand C in SD from from SPACE ICSPC_CN to space ICSPC 1425* 1.3) Calculate biortogonal C-vector 1426* in CI space IMSPC 1427* 1.4) Contract bioorthogonal C-vector from space IMSPC to IMSPC_CN 1428* whereas step 2 consists of 1429* 2.1) Expand Bioorthogonal C-vector from space IMSPC_CN to IMSPC 1430* 2.2) calculate biorthogonal sigma-vector in space ISSPC 1431* 2.2) Contract bioothogonal sigma-vector to space ISSPC_CN 1432* 2.3) Transform sigma-vector from SD to CSF-basis 1433* 1434* The SC-vector is obtained from step 1.4 1435* 1436 ICSPC_ORIG = ICSPC 1437 ISSPC_ORIG = ISSPC 1438 IMSPC_ORIG = IMSPC 1439 ICSM_ORIG = ICSM 1440 ISSM_ORIG = ISSM 1441* 1442*. The CI space are actually assumed to be identical 1443 1444* ========= 1445*. Step 1 1446* ========= 1447* 1448* 1.1) Transform C from CSF to SD in CI ICSPC_CN 1449* 1450* Allocate space for output CI vector in SD basis in config basis 1451* 1452 NSD_CSPC_CNF = NSD_PER_SYM_GN(ICSM,ICSPC_CN) 1453* 1454 NSD = NSD_CSPC_CNF 1455 NCSF = NCSF_CSPC_CNF 1456* 1457 CALL MEMMAN(KLC_SD,NSD_CSPC_CNF,'ADDL ',2,'C_SD ') 1458 CALL MEMMAN(KLVCI ,NSD_CSPC_CNF,'ADDL ',2,'VCI ') 1459*. Expand Input C vector from CSD to SD form 1460 CALL COPVEC(C,WORK(KLVCI),NCSF_CSPC_CNF) 1461C CSDTVCM(CSFVEC,DETVEC,IWAY,ICOPY,ISYM,ICSPC,IMAXMIN_OR_GAS) 1462 XDUM = 0.0D0 1463 CALL CSDTVCM(WORK(KLVCI),WORK(KLC_SD),XDUM,1,0,ICSM,ICSPC_CN,1) 1464* 1465* 1.2) Expand C in SD from SPACE ICSPC_CN to space ICSPC 1466* 1467*.Obtain number and length of blocks of expansion 1468 CALL MEMMAN(KLBLK,MXNTTS,'ADDL ',1,'LBLKCI') 1469C LBLOCK_FOR_CIXP(LBLOCK,NBLOCK,ICISPC,ISYM) 1470 CALL LBLOCK_FOR_CIXP(WORK(KLBLK),NBLOCK_C,ICSPC,ICSM) 1471C SCA_VEC_TO_BLKV_DISC(VEC,ISCA,NELMNT,LUOUT,NBLOCK,LBLOCK,VECBLK,IREW) 1472 IF(NTEST.GE.10) WRITE(6,*) ' I will CALL SCA_VEC ... ' 1473 CALL SCA_VEC_TO_BLKV_DISC(WORK(KLC_SD), 1474 & WORK(KSDREO_I_GN(ICSM,ICSPC_CN)), 1475 & NSD_CSPC_CNF,LUSCR1,NBLOCK_C,WORK(KLBLK),WORK(KVEC1P),1) 1476 IF(NTEST.GE.10) WRITE(6,*) ' Home from SCAVEC .... ' 1477 IF(NTEST.GE.1000) THEN 1478 WRITE(6,*) ' Input C-vector in GAS space form ' 1479 CALL WRTVCD(WORK(KVEC1P),LUSCR1,1,-1) 1480 END IF 1481* 1482* 1.3) Calculate biortogonal C-vector in CI space IMSPC 1483* 1484*. Expand CI vector to space IMSPC 1485 CALL EXPCIV(ICSM,ICSPC,LUSCR1,IMSPC,LUSCR2,-1,LUSCR3,1,1,IDC, 1486 & NTEST) 1487C EXPCIV(ISM,ISPCIN,LUIN,ISPCUT,LUUT,LBLK,LUSCR,NROOT,ICOPY,IDC,NTESTG) 1488 IF(NTEST.GE.10) WRITE(6,*) ' Back from EXPCIV I' 1489*. And then do the transformation defined by KCBIO 1490*. Save one-electron integrals 1491 IF(IH1FORM.EQ.1) THEN 1492 IPACK_H1 = 1 1493 ELSE 1494 IPACK_H1 = 0 1495 END IF 1496C NDIM_1EL_MAT(IHSM,NRPSM,NCPSM,NSM,IPACK) 1497 LEN_H1 = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,IPACK_H1) 1498 CALL MEMMAN(KLH1SAVE,NTOOB**2,'ADDL ',2,'H1SAVE') 1499 CALL COPVEC(WORK(KINT1),WORK(KLH1SAVE),LEN_H1) 1500*. Ecore is now adays included in MV7( called in TRACI) --hide it 1501 ECORE_SAVE = ECORE 1502 ECORE = 0.0D0 1503* 1504 IF(LUC_SAVE.NE.0) THEN 1505C? WRITE(6,*) ' C in orig base will be saved in unit ', LUC_SAVE 1506 CALL COPVCD(LUSCR1,LUC_SAVE,WORK(KVEC1P),1,-1) 1507 END IF 1508 CALL REWINO(LUSCR2) 1509*. biotransform and save result in LUSCR2 1510 IF(NTEST.GE.1000) WRITE(6,*) ' Traci will be called ' 1511 CALL TRACI(WORK(KCBIO),LUSCR1,LUSCR2,IMSPC,ICSM, 1512 & WORK(KVEC1P),WORK(KVEC2P)) 1513 IF(NTEST.GE.1000) WRITE(6,*) ' Home from Traci ' 1514 IF(NTEST.GE.1000) THEN 1515 WRITE(6,*) ' C in biobase, SD expansion ' 1516 CALL WRTVCD(WORK(KVEC1P),LUSCR2,1,-1) 1517 END IF 1518C TRACI(X,LUCIN,LUCOUT,IXSPC,IXSM,VEC1,VEC2) 1519 ECORE = ECORE_SAVE 1520 CALL COPVEC(WORK(KLH1SAVE),WORK(KINT1),LEN_H1) 1521 IF(NTEST.GE.1000) WRITE(6,*) ' Back from TRACI ' 1522 CALL LBLOCK_FOR_CIXP(WORK(KLBLK),NBLOCK_M,IMSPC,ICSM) 1523* 1524 IF(LUCBIO_SAVE.NE.0) THEN 1525C? WRITE(6,*) ' C in biobase will be saved in unit ', LUCBIO_SAVE 1526 CALL COPVCD(LUSCR2,LUCBIO_SAVE,WORK(KVEC1P),1,-1) 1527 END IF 1528 IF(IDOSC.EQ.1) THEN 1529* Obtain the metric vector = <i!0> in space ICSPC_CNF 1530 CALL GAT_VEC_FROM_BLKV_DISC(WORK(KLC_SD), 1531 & WORK(KSDREO_I_GN(ICSM,ICSPC_CN)), 1532 & NSD_CSPC_CNF,LUSCR2,NBLOCK_M,WORK(KLBLK),WORK(KVEC1P),1) 1533 IF(NTEST.GE.10) WRITE(6,*) ' Back from GAT_VEC ' 1534*. And transform to CSF basis 1535C CSDTVCM(CSFVEC,DETVEC,IWAY,ICOPY,ISYM,ISPC,IMAXMIN_OR_GAS) 1536 XDUM = 0.0D0 1537 CALL CSDTVCM(WORK(KLVCI),WORK(KLC_SD),XDUM,2,0,ICSM,ICSPC_CN,1) 1538 CALL COPVEC(WORK(KLVCI),SC,NCSF) 1539 IF(NTEST.GE.10) THEN 1540 WRITE(6,*) ' Back from CSDTVCM ' 1541 END IF 1542 END IF 1543 IF(IDOHC.EQ.1) THEN 1544*. Obtain the transformed vector for the determinants of space IMSPC_CN 1545 CALL LBLOCK_FOR_CIXP(WORK(KLBLK),NBLOCK_M,IMSPC,ICSM) 1546 NSD_MSPC_CNF = NSD_PER_SYM_GN(ICSM,IMSPC_CN) 1547 CALL MEMMAN(KLCM_SD,NSD_MSPC_CNF,'ADDL ',2,'CM_SD ') 1548 CALL GAT_VEC_FROM_BLKV_DISC(WORK(KLCM_SD), 1549 & WORK(KSDREO_I_GN(ICSM,IMSPC_CN)), 1550 & NSD_MSPC_CNF,LUSCR2,NBLOCK_M,WORK(KLBLK),WORK(KVEC1P),1) 1551C GAT_VEC_FRM_BLKV_DISC(VEC,ISCA,NELMNT,LUIN,NBLOCK,LBLOCK,VECBLK,IREW) 1552 IF(NTEST.GE.1000) THEN 1553 WRITE(6,*) ' Biotransformed C in Intermediate CN space ' 1554 CALL WRTMAT(WORK(KLCM_SD),1,NSD_MSPC_CNF,1,NSD_MSPC_CNF) 1555 WRITE(6,*) ' SIGMA_NORTCI speaking, end of step 1: ' 1556 END IF 1557 END IF 1558* 1559* ====== 1560* Step 2 1561* ====== 1562* 1563 IF(IDOHC.EQ.1) THEN 1564* 2.1) Expand Bioorthogonal C-vector from space IMSPC_CN to IMSPC 1565 CALL SCA_VEC_TO_BLKV_DISC(WORK(KLCM_SD), 1566 & WORK(KSDREO_I_GN(ICSM,IMSPC_CN)), 1567 & NSD_MSPC_CNF,LUSCR1,NBLOCK_M,WORK(KLBLK),WORK(KVEC1P),1) 1568* 2.2) calculate biorthogonal sigma-vector in space ISSPC 1569* 1570 ICSPC = IMSPC_ORIG 1571 ISSPC = ISSPC_ORIG 1572 I12 = 2 1573 XDUM = 3006.1956D0 1574 CALL MV7(WORK(KVEC1P),WORK(KVEC2P),LUSCR1,LUSCR2,XDUM,XDUM) 1575 IF(NTEST.GE.1000) THEN 1576 WRITE(6,*) ' HC in Biobase ' 1577 CALL WRTVCD(WORK(KVEC1P),LUSCR2,1,-1) 1578 END IF 1579 IF(LUHCBIO_SAVE.NE.0) THEN 1580C? WRITE(6,*) ' HC in biobase will be saved in unit ', LUHCBIO_SAVE 1581 CALL COPVCD(LUSCR2,LUHCBIO_SAVE,WORK(KVEC1P),1,-1) 1582 END IF 1583* 2.2) Contract biothogonal sigma-vector to space ISSPC_CN 1584 CALL LBLOCK_FOR_CIXP(WORK(KLBLK),NBLOCK_S,ISSPC,ISSM) 1585 NSD_SSPC_CNF = NSD_PER_SYM_GN(ISSM,ISSPC_CN) 1586 CALL MEMMAN(KLSS_SD,NSD_SSPC_CNF,'ADDL ',2,'SS_SD ') 1587 CALL GAT_VEC_FROM_BLKV_DISC(WORK(KLSS_SD), 1588 & WORK(KSDREO_I_GN(ISSM,ISSPC_CN)), 1589 & NSD_SSPC_CNF,LUSCR2,NBLOCK_S,WORK(KLBLK),WORK(KVEC1P),1) 1590* 2.3) Transform sigma-vector from SD to CSF-basis 1591 XDUM = 0.0D0 1592 CALL CSDTVCM(WORK(KLVCI),WORK(KLSS_SD),XDUM,2,0,ISSM,ISSPC_CN,1) 1593C CSDTVCM(CSFVEC,DETVEC,IWAY,ICOPY,ISYM,ISPC,IMAXMIN_OR_GAS) 1594 CALL COPVEC(WORK(KLVCI),HC,NCSF) 1595 END IF 1596* 1597 ELSE IF (NORT_MET.EQ.2) THEN 1598* 1599* 1:. Perform Bioorthogonal transformation of C from space ISPC_CN to 1600* space IMSPC_CN. It is required that the spaces for for the individual steps 1601* have been defined in IORBTRA_SPC_IN, IORBTRA_SPC_OUT 1602*. Pt evrything is in CORE 1603* 1604* 1605 ICISTR = 1 1606 IF(NTEST.GE.10) 1607 & WRITE(6,*) 1608 & ' TRACI_CONF will be called to perform orbital transformation' 1609 LUC = 0 1610 LUS = 0 1611*. TRACI_CONF modifies input vector, so 1612 NCSF_C = NCSF_PER_SYM_GN(ICSM,ICSPC_CN) 1613 NCSF_S = NCSF_PER_SYM_GN(ISSM,ISSPC_CN) 1614 NCSF_CS = MAX(NCSF_C,NCSF_S) 1615 CALL MEMMAN(KLC_CSF,NCSF_MNMX_MAX,'ADDL ',2,'C_CSF ') 1616 WRITE(6,*) ' TEST: ICSM, ICSPC_CN, NCSF_C = ', 1617 & ICSM, ICSPC_CN, NCSF_C 1618*. 1619*. Obtained transformed vector in C_CSF 1620 CALL COPVEC(C,SC,NCSF_C) 1621 IF(NTEST.GE.1000) THEN 1622 WRITE(6,*) ' Input C vector (CSF basis) ' 1623 CALL WRTMAT(C, NCSCF_C, 1, NCSCF_C, 1) 1624 WRITE(6,*) 1625 END IF 1626 CALL TRACI_CONF(SC,WORK(KLC_CSF),LUC,LUS) 1627C TRACI_CONF(C,S,LUC,LUHC) 1628 IF(NTEST.GE.1000) THEN 1629 NCSF_M = NCSF_PER_SYM_GN(ISSM,IMSPC_CNF) 1630 WRITE(6,*) ' IMSPC_CNF, NCSF_M = ', IMSPC_CNF, NCSF_M 1631 CALL WRTMAT(WORK(KLC_CSF),1,NCSF_M,1,NCSF_M) 1632 END IF 1633*. Extract metric in initial space 1634 IF(NTEST.GE.10) WRITE(6,*) 1635 & ' REF_CNFVEC will be called to get metric times initial vector' 1636C REF_CNFVEC(VECIN,ISPCIN,VECOUT,ISPCOUT,ISYM) 1637 CALL REF_CNFVEC(WORK(KLC_CSF),IMSPC_CN,SC,ICSPC_CN,ICSM) 1638 IF(NTEST.GE.10) WRITE(6,*) ' Returned from REF_CNFVEC' 1639*. And then do the Sigma from M space to S space 1640 IF(IDOHC.EQ.1) THEN 1641 ICSPC_CN_SAVE = ICSPC_CN 1642 ISSPC_CN_SAVE = ISSPC_CN 1643 ICSPC_CN = IMSPC_CN 1644 ISSPC_CN = ISSPC_CN 1645 LUC = 0 1646 LUHC = 0 1647 CALL SIGMA_CONF(WORK(KLC_CSF),HC,LUC,LUHC) 1648 IF(NTEST.GE.1000) WRITE(6,*) ' Home from SIGMA_CONF' 1649*. And restore 1650 ICSPC_CN = ICSPC_CN_SAVE 1651 ISSPC_CN = ISSPC_CN_SAVE 1652 END IF !DOHC = 1 1653 END IF! switch between different algorithms 1654* 1655C? WRITE(6,*) ' TEST, NTEST = ', NTEST 1656 IF(NTEST.GE.100) THEN 1657 NCSF_SSPC_CNF = NCSF_PER_SYM_GN(ISSM,ISSPC_CN) 1658* 1659 WRITE(6,*) ' Final vectors from SIGMA_NORTCI ' 1660 WRITE(6,*) ' ================================' 1661 IF(IDOSC.EQ.1) THEN 1662 WRITE(6,*) ' Metric times C vector: ' 1663 CALL WRTMAT(SC,1,NCSF_SSPC_CNF,1,NCSF_SSPC_CNF) 1664 END IF 1665* 1666 IF(IDOHC.EQ.1) THEN 1667 WRITE(6,*) ' Hamiltonian times C vector: ' 1668 CALL WRTMAT(HC,1,NCSF_SSPC_CNF,1,NCSF_SSPC_CNF) 1669 END IF 1670 END IF 1671*. And clean up 1672 NOCSF = NOCSF_SAVE 1673* 1674 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'NOCISI') 1675 WRITE(6,*) ' Returning from SIGMA_NORTCI' 1676COLD STOP ' Enforced stop at end of SIGMA_NORTCI' 1677 RETURN 1678 END 1679 SUBROUTINE SCA_VEC_TO_BLKV_DISC(VEC,ISCA,NELMNT,LUOUT,NBLOCK, 1680 & LBLOCK,VECBLK,IREW) 1681* A vector is given in compact as elements and scatter array. 1682* Write this vector to disc, FILE LUOUT, in blocked form as defined by LBLOCK. 1683* Vecblk shoul be able to hold largest block 1684* 1685*. Jeppe Olsen, June 2011 1686* 1687 INCLUDE 'implicit.inc' 1688 DIMENSION VEC(NELMNT), VECBLK(*) 1689 INTEGER LBLOCK(NBLOCK), ISCA(NELMNT) 1690* 1691 NTEST = 0 1692 IF(NTEST.GE.10) THEN 1693 WRITE(6,*) ' Output from SCA_VEC_TO_BLKV_DISC ' 1694 WRITE(6,*) ' LUOUT, IREW = ', LUOUT, IREW 1695 END IF 1696 IF(NTEST.GE.1000) THEN 1697 WRITE(6,*) ' ISCA: ' 1698 CALL IWRTMA(ISCA,1,NELMNT,1,NELMNT) 1699 WRITE(6,*) ' LBLOCK: ' 1700 CALL IWRTMA(LBLOCK,1,NBLOCK,1,NBLOCK) 1701 WRITE(6,*) ' Input vector: ' 1702 CALL WRTMAT(VEC,1,NELMNT,1,NELMNT) 1703 END IF 1704* 1705 IF(IREW.EQ.1) THEN 1706 CALL REWINO(LUOUT) 1707 END IF 1708* 1709 IB_BL = 1 1710 DO IBLOCK = 1, NBLOCK 1711 LEN_BL = LBLOCK(IBLOCK) 1712 IF(NTEST.GE.1000) THEN 1713 WRITE(6,*) ' IBLOCK, LEN_BLK = ', IBLOCK, LEN_BL 1714 END IF 1715* 1716 ZERO = 0.0D0 1717 CALL SETVEC(VECBLK,ZERO,LEN_BL) 1718* 1719*. Find and copy elements in input vector that are in block IBLOCK 1720 DO IELMNT = 1, NELMNT 1721 JSCA = ISCA(IELMNT) 1722 JSCA_ABS = IABS(JSCA) 1723 IF(NTEST.GE.10000) WRITE(6,*) ' IELMNT, JSCA, JSCA_ABS =', 1724 & IELMNT, JSCA, JSCA_ABS 1725 IF(IB_BL.LE.JSCA_ABS.AND.JSCA_ABS.LE.IB_BL+LEN_BL-1) THEN 1726* Element is in block 1727 IF(NTEST.GE.10000) THEN 1728 WRITE(6,*) ' Element in block, IELMNT, JSCA', IELMNT,JSCA 1729 WRITE(6,*) ' Output address = ', JSCA_ABS-IB_BL + 1 1730 END IF 1731 IF(JSCA.GT.0) THEN 1732 VECBLK(JSCA_ABS-IB_BL + 1) = VEC(IELMNT) 1733 ELSE 1734 VECBLK(JSCA_ABS-IB_BL + 1) =-VEC(IELMNT) 1735 END IF 1736 END IF 1737 END DO 1738*. Write block to disc 1739 CALL ITODS(LEN_BL,1,-1,LUOUT) 1740 CALL TODSCP(VECBLK,LEN_BL,-1,LUOUT) 1741 IB_BL = IB_BL + LEN_BL 1742 END DO! End of loop over blocks 1743*. Write end of file 1744 CALL ITODS(-1,1,-1,LUOUT) 1745* 1746 RETURN 1747 END 1748 SUBROUTINE GAT_VEC_FROM_BLKV_DISC(VEC,ISCA,NELMNT,LUIN,NBLOCK, 1749 & LBLOCK,VECBLK,IREW) 1750* A vector is given in disc, file LUIN, with block-structure defined by LBLOCK 1751* Obtain elements given by scatter vector ISCA 1752* Vecblk shoul be able to hold largest block 1753* 1754*. Jeppe Olsen, June 2011 1755* 1756 INCLUDE 'implicit.inc' 1757 DIMENSION VEC(NELMNT), VECBLK(*) 1758 INTEGER LBLOCK(NBLOCK), ISCA(NELMNT) 1759* 1760 NTEST = 000 1761 IF(NTEST.GE.10) THEN 1762 WRITE(6,*) ' Output from GAT_VEC_TO_BLKV_DISC ' 1763 WRITE(6,*) ' LUIN, IREW = ', LUIN, IREW 1764 END IF 1765 IF(NTEST.GE.1000) THEN 1766 WRITE(6,*) ' ISCA: ' 1767 CALL IWRTMA(ISCA,1,NELMNT,1,NELMNT) 1768 WRITE(6,*) ' LBLOCK: ' 1769 CALL IWRTMA(LBLOCK,1,NBLOCK,1,NBLOCK) 1770 WRITE(6,*) ' Initial vector on disc ' 1771 CALL WRTVCD(VECBLK,LUIN,1,-1) 1772 END IF 1773* 1774 IF(IREW.EQ.1) THEN 1775 CALL REWINO(LUIN) 1776 END IF 1777* 1778 IB_BL = 1 1779 DO IBLOCK = 1, NBLOCK 1780 LEN_BL = LBLOCK(IBLOCK) 1781*. Obtain block 1782 CALL IFRMDS(LBL,1,-1,LUIN) 1783 IF(LBL.NE.LEN_BL) THEN 1784 WRITE(6,*) 1785 & ' Difference between expected and actual block sizes', 1786 & LEN_BL, LBL 1787 STOP 1788 & ' Difference between expected and actual block sizes' 1789 END IF 1790 NO_ZEROING = 0 1791 CALL FRMDSC2(VECBLK,LBL,-1,LUIN,IMZERO,IAMPACK, 1792 & NO_ZEROING) 1793*. Find and copy elements from input vector that are in block IBLOCK 1794 DO IELMNT = 1, NELMNT 1795 JSCA = ISCA(IELMNT) 1796 JSCA_ABS = IABS(JSCA) 1797 IF(IB_BL.LE.JSCA_ABS.AND.JSCA_ABS.LE.IB_BL+LEN_BL-1) THEN 1798* Element is in block 1799 IF(JSCA.GT.0) THEN 1800 VEC(IELMNT) = VECBLK(JSCA_ABS-IB_BL + 1) 1801 ELSE 1802 VEC(IELMNT) =-VECBLK(JSCA_ABS-IB_BL + 1) 1803 END IF 1804 END IF 1805 END DO 1806 IB_BL = IB_BL + LEN_BL 1807 END DO! End of loop over blocks 1808* 1809 IF(NTEST.GE.100) THEN 1810 WRITE(6,*) ' Vector gathered from DISC ' 1811 CALL WRTMAT(VEC,1,NELMNT,1,NELMN) 1812 END IF 1813* 1814 RETURN 1815 END 1816 SUBROUTINE LBLOCK_FOR_CIXP(LBLOCK,NBLOCK,ICISPC,ISYM) 1817* 1818* Obtain number of blocks and lengths of blocks for CI expansion 1819* in space ICISPC and symmetry ISYM 1820* 1821* Jeppe Olsen, June 2011 1822* 1823 INCLUDE 'implicit.inc' 1824 INCLUDE 'mxpdim.inc' 1825 INCLUDE 'wrkspc-static.inc' 1826 INCLUDE 'gasstr.inc' 1827 INCLUDE 'stinf.inc' 1828 INCLUDE 'cgas.inc' 1829 INCLUDE 'orbinp.inc' 1830 INCLUDE 'cicisp.inc' 1831 INCLUDE 'strbas.inc' 1832 INCLUDE 'cstate.inc' 1833 INCLUDE 'csm.inc' 1834* 1835 NTEST = 000 1836* 1837 IDUM = 0 1838 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'LBLCIX') 1839* 1840* Number of occupation classes 1841* 1842 IATP = 1 1843 IBTP = 2 1844* 1845 NOCTPA = NOCTYP(IATP) 1846 NOCTPB = NOCTYP(IBTP) 1847* 1848 NAEL = NELFTP(IATP) 1849 NBEL = NELFTP(IBTP) 1850 NEL = NAEL + NBEL 1851* 1852 IWAY = 1 1853 CALL OCCLS(1,NOCCLS,IOCCLS,NEL,NGAS, 1854 & IGSOCC(1,1),IGSOCC(1,2),0,0,NOBPT) 1855*. and the occupation classes 1856 CALL MEMMAN(KLOCCLS,NGAS*NOCCLS,'ADDL ',1,'KLOCCL') 1857 CALL MEMMAN(KLBASSPC,NOCCLS,'ADDL ',1,'BASSPC') 1858 IWAY = 2 1859 CALL OCCLS(2,NOCCLS,WORK(KLOCCLS),NEL,NGAS, 1860 & IGSOCC(1,1),IGSOCC(1,2),1,WORK(KLBASSPC),NOBPT) 1861*. Allocate space for largest encountered number of TTSS blocks 1862 NTTS = MXNTTS 1863C WRITE(6,*) ' GASCI : NTTS = ', NTTS 1864*. 1865 CALL MEMMAN(KLCLBT ,NTTS ,'ADDL ',1,'CLBT ') 1866 CALL MEMMAN(KLCLEBT ,NTTS ,'ADDL ',1,'CLEBT ') 1867 CALL MEMMAN(KLCI1BT,NTTS ,'ADDL ',1,'CI1BT ') 1868 CALL MEMMAN(KLCIBT ,8*NTTS,'ADDL ',1,'CIBT ') 1869 CALL MEMMAN(KLC2B , NTTS,'ADDL ',1,'C2BT ') 1870 CALL MEMMAN(KLCIOIO,NOCTPA*NOCTPB,'ADDL ',2,'CIOIO ') 1871 CALL MEMMAN(KLCBLTP,NSMST,'ADDL ',2,'CBLTP ') 1872*. Matrix giving allowed combination of alpha- and beta-strings 1873 CALL IAIBCM(ICISPC,WORK(KLCIOIO)) 1874*. option KSVST not active so 1875 KSVST = 1 1876 CALL ZBLTP(ISMOST(1,ISYM),NSMST,IDC,WORK(KLCBLTP),WORK(KSVST)) 1877*. Blocks of CI vector, using a single batch for complete expansion 1878 ICOMP = 1 1879 ISIMSYM = 1 1880 CALL PART_CIV2(IDC,WORK(KLCBLTP),WORK(KNSTSO(IATP)), 1881 & WORK(KNSTSO(IBTP)), 1882 & NOCTPA,NOCTPB,NSMST,LBLOCK,WORK(KLCIOIO), 1883 & ISMOST(1,ISYM), 1884 & NBATCH,WORK(KLCLBT),WORK(KLCLEBT), 1885 & WORK(KLCI1BT),WORK(KLCIBT),ICOMP,ISIMSYM) 1886*. Number of BLOCKS 1887 NBLOCK = IFRMR(WORK(KLCI1BT),1,NBATCH) 1888 & + IFRMR(WORK(KLCLBT),1,NBATCH) - 1 1889 IF(NTEST.GE.1000) WRITE(6,*) ' Number of blocks ', NBLOCK 1890*. And the lengths of the various blocks 1891* 1892 CALL EXTRROW(WORK(KLCIBT),8,8,NBLOCK,LBLOCK) 1893* 1894 IF(NTEST.GE.100) THEN 1895 WRITE(6,*) ' Info in CI space ', ICISPC, ' with sym ', ISYM 1896 WRITE(6,*) ' ==============================================' 1897 WRITE(6,*) 1898 WRITE(6,*) ' Number of blocks: ', NBLOCK 1899 WRITE(6,*) ' Length of each block: ' 1900 CALL IWRTMA(LBLOCK,1,NBLOCK,1,NBLOCK) 1901 END IF 1902* 1903 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'LBLCIX') 1904* 1905 RETURN 1906 END 1907 SUBROUTINE MINMAX_EXCIT(IOCC_MIN_IN,IOCC_MAX_IN,NEXCIT, 1908 & IOCC_MIN_OUT,IOCC_MAX_OUT,NORB) 1909* 1910* A CI space is defined by accumulated occations IOCC_MIN_IN, IOCC_MAX_IN. 1911* Apply NEXCIT excitations to this space to obtain IOCC_MIN_OUT,IOCC_MAX_OUT 1912* 1913* Jeppe Olsen, June 2011 1914* 1915 INCLUDE 'implicit.inc' 1916*. Input 1917 INTEGER IOCC_MIN_IN(NORB),IOCC_MAX_IN(NORB) 1918*. Output 1919 INTEGER IOCC_MIN_OUT(NORB),IOCC_MAX_OUT(NORB) 1920* 1921 NTEST = 00 1922* 1923 NELEC = IOCC_MIN_IN(NORB) 1924 DO IORB = 1, NORB 1925 IOCC_MIN_OUT(IORB) = 1926 & MAX(0,IOCC_MIN_IN(IORB)-NEXCIT,NELEC-2*(NORB-IORB)) 1927 IOCC_MAX_OUT(IORB) = MIN(2*IORB,NELEC,IOCC_MAX_IN(IORB)+NEXCIT) 1928 END DO 1929* 1930 IF(NTEST.GE.100) THEN 1931 WRITE(6,*) ' Info from MINMAX_EXCIT ' 1932 WRITE(6,*) ' ====================== ' 1933 WRITE(6,*) ' allowed excitation level = ', NEXCIT 1934 WRITE(6,*) ' Input occupation constraints ' 1935 CALL WRT_MINMAX_OCC(IOCC_MIN_IN,IOCC_MAX_IN,NORB) 1936 WRITE(6,*) ' Output occupation constraints ' 1937 CALL WRT_MINMAX_OCC(IOCC_MIN_OUT,IOCC_MAX_OUT,NORB) 1938 END IF 1939* 1940 RETURN 1941 END 1942 SUBROUTINE WRT_MINMAX_OCC(IOCC_MIN,IOCC_MAX,NORB) 1943* 1944* Write min and max accumulated occupation arrays 1945* 1946*. Jeppe Olsen, June 2011 1947* 1948 INCLUDE 'implicit.inc' 1949*. Input 1950 INTEGER IOCC_MIN(NORB),IOCC_MAX(NORB) 1951* 1952 WRITE(6,*) ' Min and Max accumulated occupations: ' 1953 WRITE(6,*) 1954 WRITE(6,*) ' Orbital Min. occ Max. occ ' 1955 WRITE(6,*) ' ==========================' 1956 DO IORB = 1, NORB 1957 WRITE(6,'(3X,I4,2(4X,I4))') 1958 & IORB, IOCC_MIN(IORB), IOCC_MAX(IORB) 1959 END DO 1960* 1961 RETURN 1962 END 1963 SUBROUTINE PRECOND_NORTCI 1964* 1965* Jeppe Olsen, June 2011 1966* 1967 INCLUDE 'implicit.inc' 1968* 1969 WRITE(6,*) ' Dummy PRECOND_NORTCI entered' 1970 STOP ' Dummy PRECOND_NORTCI entered' 1971* 1972 1973 END 1974 SUBROUTINE GET_CBIO(C,CBIOMO,CBIOAO) 1975* A MO-AO transformation matrix, C, to a (non-orthogonal) basis is given. 1976* Obtain the corresponding bioorthogonal transformation matrix CBIOMO 1977* (Bio = > MO's in C) and CBIOAO (Bio => AO'S) 1978* 1979* Jeppe Olsen, July 2011 for the nonorthogonal CI work 1980* 1981 INCLUDE 'implicit.inc' 1982 INCLUDE 'mxpdim.inc' 1983 INCLUDE 'wrkspc-static.inc' 1984 INCLUDE 'orbinp.inc' 1985 INCLUDE 'lucinp.inc' 1986 INCLUDE 'glbbas.inc' 1987*. Input 1988 DIMENSION C(*) 1989*. Output 1990 DIMENSION CBIOMO(*), CBIOAO(*) 1991* 1992 NTEST = 00 1993* 1994 IDUM = 0 1995 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'GET_CB') 1996* 1997C NDIM_1EL_MAT(IHSM,NRPSM,NCPSM,NSM,IPACK) 1998 LEN_M = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 1999 CALL MEMMAN(KLSAOE,LEN_M,'ADDL ',2,'SAO_E ') 2000 CALL MEMMAN(KLMSCR,LEN_M,'ADDL ',2,'MSCR ') 2001 CALL MEMMAN(KLSCR,2*LEN_M,'ADDL ',2,'SCR ') 2002*. Expand SAO 2003 CALL TRIPAK_AO_MAT(WORK(KLSAOE),WORK(KSAO),2) 2004 IF(NTEST.GE.1000) THEN 2005 WRITE(6,*) ' Expanded SAO ' 2006 CALL APRBLM2(WORK(KLSAOE),NTOOBS,NTOOBS,NSMOB,0) 2007 END IF 2008*. Obtain Metric in MO-basis, SMO, in CBIOAO 2009C TRAN_SYM_BLOC_MAT4(AIN,XL,XR,NBLOCK,LX_ROW,LX_COL,AOUT,SCR,ISYM) 2010 CALL TRAN_SYM_BLOC_MAT4(WORK(KLSAOE),C,C,NSMOB,NTOOBS,NTOOBS, 2011 &CBIOAO,WORK(KLSCR),0) 2012C CBIOMO = SMO ** -1 2013 IPROBLEM = 0 2014C INV_BLKMT(A,AINV,SCR,NBLK,LBLK,IPROBLEM) 2015 CALL INV_BLKMT(CBIOAO,CBIOMO,WORK(KLSCR),NSMOB,NTOOBS, 2016 & IPROBLEM) 2017 IF(IPROBLEM.NE.0) THEN 2018 WRITE(6,*) ' Problem inverting matrix C(T) S(AO) ' 2019 STOP ' Problem inverting matrix C(T) S(AO) ' 2020 END IF 2021 IF(NTEST.GE.1000) THEN 2022 WRITE(6,*) ' CBIOMO = SMO ** -1 ' 2023 CALL APRBLM2(CBIOMO,NTOOBS,NTOOBS,NSMOB,0) 2024 END IF 2025* CBIOAO = C * CBIOMO 2026 CALL MULT_BLOC_MAT(CBIOAO,C,CBIOMO, 2027 & NSMOB,NTOOBS,NTOOBS,NTOOBS,NTOOBS,NTOOBS,NTOOBS,0) 2028* 2029* Check: Calculate C(T) S CBIO 2030C TRAN_SYM_BLOC_MAT4(AIN,XL,XR,NBLOCK,LX_ROW,LX_COL,AOUT,SCR,ISYM) 2031 I_DO_CHECK = 0 2032 IF(I_DO_CHECK.EQ.1) THEN 2033 CALL TRAN_SYM_BLOC_MAT4(WORK(KLSAOE),C,CBIOAO,NSMOB,NTOOBS, 2034 & NTOOBS, 2035 & WORK(KLMSCR),WORK(KLSCR),0) 2036 WRITE(6,*) ' C(T) S CBIO ' 2037 CALL APRBLM2(WORK(KLMSCR),NTOOBS,NTOOBS,NSMOB,0) 2038 END IF 2039* 2040 2041 IF(NTEST.GE.100) THEN 2042 WRITE(6,*) 2043 WRITE(6,*) ' Bioorthogonal MOAO expansion matrix ' 2044 WRITE(6,*) ' =================================== ' 2045 WRITE(6,*) 2046 CALL APRBLM2(CBIOAO,NTOOBS,NTOOBS,NSMOB,0) 2047 WRITE(6,*) 2048 WRITE(6,*) ' Bioorthogonal MOMO expansion matrix ' 2049 WRITE(6,*) ' =================================== ' 2050 WRITE(6,*) 2051 CALL APRBLM2(CBIOMO,NTOOBS,NTOOBS,NSMOB,0) 2052 END IF 2053* 2054 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'GET_CB') 2055 RETURN 2056 END 2057 SUBROUTINE INV_BLKMT(A,AINV,SCR,NBLK,LBLK,IPROBLEM) 2058* 2059* Invert blocked matrix A to give AINV 2060* Problems with inversion is flagged by IPROBLEM.NE. 0 2061* IPROBLEM gives last block with problems 2062* 2063* SCR should at least be twice the size of the largest block 2064* 2065 INCLUDE 'implicit.inc' 2066*. Input 2067 DIMENSION A(*) 2068 INTEGER LBLK(NBLK) 2069*. Output 2070 DIMENSION AINV(*) 2071*Scratch 2072 DIMENSION SCR(*) 2073* 2074 NTEST = 000 2075* 2076 IPROBLEM = 0 2077 DO IBLK = 1, NBLK 2078 IF(IBLK.EQ.1) THEN 2079 IOFF = 1 2080 ELSE 2081 IOFF = IOFF + LBLK(IBLK-1)**2 2082 END IF 2083 LEN_BLK = LBLK(IBLK) 2084 CALL COPVEC(A(IOFF),SCR,LEN_BLK**2) 2085 IF(NTEST.GE.1000) THEN 2086 WRITE(6,*) ' Matrix to be inverted ' 2087 CALL WRTMAT(SCR,LEN_BLK,LEN_BLK,LEN_BLK,LEN_BLK) 2088 END IF 2089C INVMAT(A,B,MATDIM,NDIM,ISING) 2090 CALL INVMAT(SCR,SCR(1+LEN_BLK**2),LEN_BLK,LEN_BLK,ISING) 2091 IF(ISING.NE.0) IPROBLEM = IBLK 2092 CALL COPVEC(SCR,AINV(IOFF),LEN_BLK**2) 2093 END DO 2094* 2095 IF(IPROBLEM.NE.0) THEN 2096 WRITE(6,*) 2097 & ' Problem in INV_BLKMAT, number of last singular block =', 2098 & IPROBLEM 2099 WRITE(6,*) ' Complete input block matrix ' 2100 CALL APRBLM2(A,LBLK,LBLK,NBLK,0) 2101 END IF 2102* 2103 IF(NTEST.GE.100) THEN 2104 WRITE(6,*) ' Inverted block matrix:' 2105 CALL APRBLM2(AINV,LBLK,LBLK,NBLK,0) 2106C APRBLM2(A,LROW,LCOL,NBLK,ISYM) 2107 END IF 2108* 2109 RETURN 2110 END 2111 SUBROUTINE COMHAM_HS_GEN(MSTV,NDIM) 2112* 2113* Set up Complete Hamiltonian matrices using external 2114* routine MSTV 2115* 2116* Jeppe Olsen, July 2011 2117* 2118 INCLUDE 'implicit.inc' 2119 INCLUDE 'mxpdim.inc' 2120 INCLUDE 'clunit.inc' 2121* 2122 PARAMETER(MXLDIM = 200) 2123 DIMENSION H(MXLDIM*MXLDIM), S(MXLDIM*MXLDIM) 2124 DIMENSION VEC1(MXLDIM),VEC2(MXLDIM),VEC3(MXLDIM) 2125 DIMENSION SCR(5*MXLDIM**2+2*MXLDIM), EIGVEC(MXLDIM**2) 2126 COMMON/SCRFILES_MATVEC/LUSCR1,LUSCR2,LUSCR3, 2127 & LUCBIO_SAVE, LUHCBIO_SAVE 2128* 2129 EXTERNAL MSTV 2130* 2131 LUSCR1 = LUSC34 2132 LUSCR2 = LUSC35 2133 LUSCR3 = LUSC36 2134 LUCBIOSAVE = 0 2135 LUHCBIOSAVE = 0 2136* 2137 NTEST = 1000 2138 IF(NDIM.GT.MXLDIM) THEN 2139 WRITE(6,*) 2140 & ' COMHAM_HS_GEN called with larger dimension than allowed ' 2141 WRITE(6,*) ' ALlowed (MXLDIM) and actual (NDIM) dimensions ', 2142 & MXLDIM, NDIM 2143 WRITE(6,*) 'LUCIA suggests that you increase MXLDIM ' 2144 STOP 2145 & ' COMHAM_HS_GEN called with larger dimension than allowed ' 2146 END IF 2147*. Restrict 2148 NDIML = NDIM 2149* 2150 ZERO = 0.0D0 2151 ONE = 1.0D0 2152 DO IVEC = 1, NDIML 2153 CALL SETVEC(VEC1,ZERO,NDIM) 2154 VEC1(IVEC) = ONE 2155 CALL MSTV(VEC1,VEC2,VEC3,1,1) 2156* 2157 IOFF = (IVEC-1)*NDIML+1 2158 CALL COPVEC(VEC2,H(IOFF),NDIML) 2159 CALL COPVEC(VEC3,S(IOFF),NDIML) 2160 END DO 2161* 2162 IF(NTEST.GE.1000) THEN 2163 WRITE(6,*) ' matrices from COMHAM_HS_GEN' 2164 CALL WRTMAT(H,NDIML,NDIML,NDIML,NDIML) 2165 CALL WRTMAT(S,NDIML,NDIML,NDIML,NDIML) 2166 END IF 2167* 2168 I_DO_DIAG = 1 2169 IF(I_DO_DIAG.EQ.1) THEN 2170C GENEIG_WITH_SING_CHECK(A,S,EIGVEC,EIGVAL,NVAR,NSING, 2171C & WORK,IASPACK) 2172 CALL GENEIG_WITH_SING_CHECK(H,S,EIGVEC,VEC1,NDIML, 2173 & NSING,SCR,0) 2174 END IF 2175* 2176 RETURN 2177 END 2178 SUBROUTINE EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT 2179 & (A,AGAS,IGAS,JGAS,I_EX_OR_CP) 2180* 2181* A symmetryblocked (not lower half packed) matrix A over orbitals is given 2182* Extract blocks referring to GASpaCE IGAS, JGAS 2183* 2184* I_EX_OR_CP = 1 => Extract from A to IGAS 2185* I_EX_OR_CP = 1 => Copy from IGAS to A 2186* 2187*. Jeppe Olsen, July 2011 2188* 2189 INCLUDE 'implicit.inc' 2190 INCLUDE 'mxpdim.inc' 2191 INCLUDE 'orbinp.inc' 2192 INCLUDE 'lucinp.inc' 2193*. Specific input or output 2194 DIMENSION A(*), AGAS(*) 2195*. Scratch- for output 2196 DIMENSION IDIM(MXPNGAS), JDIM(MXPNGAS) 2197* 2198 DO ISYM = 1, NSMOB 2199 IF(ISYM.EQ.1) THEN 2200 IOFF_IN = 1 2201 IOFF_OUT = 1 2202 ELSE 2203 IOFF_IN = IOFF_IN + NTOOBS(ISYM-1)**2 2204 IOFF_OUT = 2205 & IOFF_OUT + NOBPTS_GN(IGAS,ISYM-1)*NOBPTS_GN(JGAS,ISYM-1) 2206 END IF 2207* 2208 IIOFF = 1 2209 DO IIGAS = 0, IGAS -1 2210 IIOFF = IIOFF + NOBPTS_GN(IIGAS,ISYM) 2211 END DO 2212* 2213 IJOFF = 1 2214 DO IIGAS = 0, JGAS -1 2215 IJOFF = IJOFF + NOBPTS_GN(IIGAS,ISYM) 2216 END DO 2217* 2218 NI = NOBPTS_GN(IGAS,ISYM) 2219 NJ = NOBPTS_GN(JGAS,ISYM) 2220 NIS = NTOOBS(ISYM) 2221 NJS = NTOOBS(ISYM) 2222 DO J = 1, NJ 2223 DO I = 1, NI 2224 IJ_OUT = IOFF_OUT -1 + (J-1)*NI + I 2225 IJ_IN = IOFF_IN -1 2226 & + (IJOFF+J-1-1)*NIS + IIOFF+I-1 2227 IF(I_EX_OR_CP.EQ.1) THEN 2228 AGAS(IJ_OUT) = A(IJ_IN) 2229 ELSE 2230 A(IJ_IN) = AGAS(IJ_OUT) 2231 END IF 2232 END DO 2233 END DO 2234 END DO ! End of loop over symmetries 2235* 2236 NTEST = 00 2237 IF(NTEST.GE.100) THEN 2238 WRITE(6,*) ' Submatrix with IGAS, JGAS = ', 2239 & IGAS, JGAS 2240 CALL EXTRROW(NOBPTS_GN,IGAS+1,7+MXPR4T,NSMOB,IDIM) 2241 CALL EXTRROW(NOBPTS_GN,JGAS+1,7+MXPR4T,NSMOB,JDIM) 2242C EXTRROW(INMAT,IROW,NROW,NCOL,IOUTVEC) 2243C APRBLM2(A,LROW,LCOL,NBLK,ISYM) 2244 CALL APRBLM2(AGAS,IDIM,JDIM,NSMOB,0) 2245 WRITE(6,*) ' Full matrix ' 2246 CALL APRBLM2(A,NTOOBS,NTOOBS,NSMOB,0) 2247 END IF 2248* 2249 RETURN 2250 END 2251 SUBROUTINE PREPARE_CMOAO_INI 2252 &(INI_MO_TP, CMOAO_OUT,CMOAO_IN,IVBGAS) 2253* 2254* Obtain initial orbitals for Lucia calculation 2255* 2256* INI_MO_TP = 1 => CMOAO_OUT = 1 2257* = 2 => Transform MO's so diagonal block IVBGAS is a unit matrix 2258* = 3 => CMOAO_OUT = CMOAO_IN 2259* = 4 => from fragment MO's 2260* Jeppe Olsen, July 2011 2261* 2262 INCLUDE 'implicit.inc' 2263 INCLUDE 'mxpdim.inc' 2264 INCLUDE 'wrkspc-static.inc' 2265 INCLUDE 'orbinp.inc' 2266 INCLUDE 'lucinp.inc' 2267 INCLUDE 'cgas.inc' 2268*. Input 2269 DIMENSION CMOAO_IN(*) 2270*. Output 2271 DIMENSION CMOAO_OUT(*) 2272*. Local scratch 2273 DIMENSION IDIMV(MXPOBS), IDIMI(MXPOBS) 2274* 2275 IDUM = 0 2276 NTEST = 10 2277* 2278 IF(NTEST.GE.10) 2279 &WRITE(6,*) ' PREPARE..., INI_MO_TP = ', INI_MO_TP 2280* 2281 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'PREPMO') 2282* 2283 IF(INI_MO_TP.EQ.1) THEN 2284* 2285*. CMOAO_OUT = 1 2286* 2287 ONE = 1.0D0 2288 CALL SETDIA_BLM(CMOAO_OUT,ONE,NSMOB,NTOOBS,0) 2289 ELSE IF ( INI_MO_TP.EQ.2) THEN 2290* 2291* Rotate orbitals in GASpace IVBGAS, so the diagonal IVBGAS block 2292* become diagonal- could require pivoting 2293* 2294 LEN1_F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 2295C NDIM_1EL_MAT(IHSM,NRPSM,NCPSM,NSM,IPACK) 2296 CALL MEMMAN(KLMO1,LEN1_F,'ADDL ',2,'MO1 ') 2297 CALL MEMMAN(KLMO2,LEN1_F,'ADDL ',2,'MO2 ') 2298 CALL MEMMAN(KLSCR,2*LEN1_F,'ADDL ',2,'SCR ') 2299* 2300 CALL COPVEC(CMOAO_IN,CMOAO_OUT,LEN1_F) 2301*. Extract block (IVBGAS,IVBGAS) of CMO 2302C EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT 2303C & (A,AGAS,IGAS,JGAS,I_EX_OR_CP) 2304 CALL EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT 2305 & (CMOAO_IN,WORK(KLMO1),IVBGAS,IVBGAS,1) 2306*. Number of orbitals per sym in this space 2307 CALL EXTRROW(NOBPTS_GN,IVBGAS+1,7+MXPR4T,NSMOB,IDIMV) 2308*. Invert block and save in KLMO2 2309C INV_BLKMT(A,AINV,SCR,NBLK,LBLK,IPROBLEM) 2310 CALL INV_BLKMT(WORK(KLMO1),WORK(KLMO2),WORK(KLSCR),NSMOB, 2311 & IDIMV,IPROBLEM) 2312 IF(NTEST.GE.1000) THEN 2313 WRITE(6,*) ' Inverted diagonal GAS block' 2314 CALL APRBLM2(WORK(KLMO2),IDIMV,IDIMV,NSMOB,0) 2315 END IF 2316*. Multiply inverted block on ini MO's in space IVBGAS 2317 DO IGAS = 0, NGAS +1 2318*. Extract block (IGAS,IVBGAS) in KLMO1 2319 CALL EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT 2320 & (CMOAO_IN,WORK(KLMO1),IGAS,IVBGAS,1) 2321*. Dimensions of block IGAS 2322 CALL EXTRROW(NOBPTS_GN,IGAS+1,7+MXPR4T,NSMOB,IDIMI) 2323* CMOAO_IN(IGAS,IVBGAS)*CMOAO_IN(IGAS,IGAS)**(-1) 2324 IF(NTEST.GE.1000) THEN 2325 WRITE(6,*) ' C(IGAS,IVGAS) block ' 2326 CALL APRBLM2(WORK(KLMO1),IDIMI,IDIMV,NSMOB,0) 2327 WRITE(6,*) ' C(IVGAS,IVGAS)** (-1) block' 2328 CALL APRBLM2(WORK(KLMO2),IDIMV,IDIMV,NSMOB,0) 2329 END IF 2330C MULT_BLOC_MAT(C,A,B,NBLOCK,LCROW,LCCOL, 2331C & LAROW,LACOL,LBROW,LBCOL,ITRNSP) 2332 CALL MULT_BLOC_MAT(WORK(KLSCR),WORK(KLMO1),WORK(KLMO2), 2333 & NSMOB,IDIMI,IDIMV, IDIMI,IDIMV,IDIMV,IDIMV,0) 2334 IF(NTEST.GE.1000) THEN 2335 WRITE(6,*) 2336 & ' C(IGAS,IVGAS)*C**(-1)(IVGAS,IVGAS) for IGAS = ', IGAS 2337 CALL APRBLM2(WORK(KLSCR),IDIMI,IDIMV,NSMOB,0) 2338 END IF 2339 2340*. And copy to CMOAO_OUT 2341 CALL EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT 2342 & (CMOAO_OUT,WORK(KLSCR),IGAS,IVBGAS,2) 2343 END DO 2344* 2345 ELSE IF(INI_MO_TP.EQ.3.OR.INI_MO_TP.EQ.5) THEN 2346* 2347* CMOAO_OUT = CMOAO_IN 2348* 2349 LEN1_F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 2350 CALL COPVEC(CMOAO_IN,CMOAO_OUT,LEN1_F) 2351 ELSE IF(INI_MO_TP.EQ.4) THEN 2352* obtain MO's from Fragment AO's 2353 CALL GET_CMO_FROM_FRAGMENTS(CMOAO_OUT) 2354 END IF 2355* 2356 IF(NTEST.GE.100) THEN 2357 WRITE(6,*) ' Output from PREPARE CMOAO_INI_NORTCI' 2358 WRITE(6,*) ' =====================================' 2359 WRITE(6,*) 2360 WRITE(6,*) ' INI_MO_TP = ', INI_MO_TP 2361 END IF 2362 IF(NTEST.GE.100) THEN 2363 WRITE(6,*) ' Output set of MOs ' 2364 CALL APRBLM2(CMOAO_OUT,NTOOBS,NTOOBS,NSMOB,0) 2365 END IF 2366* 2367 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'PREPMO') 2368* 2369 RETURN 2370 END 2371 SUBROUTINE GET_CMO_FROM_FRAGMENTS(CMO) 2372* Obtain MOAO coefficients CMO from fragments as specified by 2373* N_GS_SM_BAS_FRAG 2374* 2375*. Jeppe Olsen, July 2011 2376* 2377 INCLUDE 'implicit.inc' 2378 INCLUDE 'mxpdim.inc' 2379 INCLUDE 'wrkspc-static.inc' 2380 INCLUDE 'cgas.inc' 2381 INCLUDE 'lucinp.inc' 2382 INCLUDE 'fragmol.inc' 2383 INCLUDE 'glbbas.inc' 2384 INCLUDE 'orbinp.inc' 2385*. Molecule to fragment symmetry 2386 INTEGER LSYMEXP(8) 2387*. Output 2388 DIMENSION CMO(*) 2389* 2390 NTEST = 10 2391* 2392* 2393* 1: Check information in fragments with total number of orbitals 2394* and basis functions 2395* 2396* 2397*. Total number of orbitals per symmetry 2398 NERROR = 0 2399 DO ISYM = 1, NSMOB 2400 NNTOOBS = 0 2401*. Loop over equivalent groups of atoms 2402 DO IEQV = 1, NEQVGRP_FRAG 2403 IFRAG = IEQVGRP_FRAG(1,IEQV) 2404 IF(NTEST.GE.1000) THEN 2405 WRITE(6,*) ' IEQV, IFRAG = ', IEQV, IFRAG 2406 WRITE(6,*) ' LEQVGRP_FRAG(IEQV) = ', LEQVGRP_FRAG(IEQV) 2407 END IF 2408 IF(LEQVGRP_FRAG(IEQV).EQ.1) THEN 2409*. No expansion of symmetries 2410 DO JSYM = 1, NSMOB 2411 LSYMEXP(JSYM) = JSYM 2412 END DO 2413 ELSE IF(LEQVGRP_FRAG(IEQV).EQ.2) THEN 2414 IF(NSMOB.EQ.4) THEN 2415*. Assumed expansion from Cs to C2V 2416 LSYMEXP(1) = 1 2417 LSYMEXP(2) = 2 2418 LSYMEXP(3) = 1 2419 LSYMEXP(4) = 2 2420 ELSE IF(NSMOB.EQ.8) THEN 2421*. Assumed expansion from C2V to D2H 2422 LSYMEXP(1) = 1 2423 LSYMEXP(2) = 2 2424 LSYMEXP(3) = 3 2425 LSYMEXP(4) = 4 2426 LSYMEXP(5) = 1 2427 LSYMEXP(6) = 2 2428 LSYMEXP(7) = 3 2429 LSYMEXP(8) = 4 2430 ELSE 2431 WRITE(6,*) ' Combination not programmed(2) ' 2432 WRITE(6,*) ' IEQV, LEQVGRP_FRAG, NSMOB = ', 2433 & IEQV, LEQVGRP_FRAG(IEQV), NSMOB 2434 STOP ' Combination not programmed ' 2435 END IF 2436 ELSE IF(LEQVGRP_FRAG(IEQV).EQ.4) THEN 2437 IF(NSMOB.EQ.8) THEN 2438*. Assumed expansion from CS to D2H 2439 LSYMEXP(1) = 1 2440 LSYMEXP(2) = 2 2441 LSYMEXP(3) = 3 2442 LSYMEXP(4) = 4 2443 LSYMEXP(5) = 1 2444 LSYMEXP(6) = 2 2445 LSYMEXP(7) = 3 2446 LSYMEXP(8) = 4 2447 ELSE 2448 WRITE(6,*) ' Combination not programmed(3) ' 2449 WRITE(6,*) ' LEQVGRP_FRAG, NSMOB = ', LEQVGRP_FRAG, NSMOB 2450 STOP ' Combination not programmed ' 2451 END IF 2452 END IF ! Switch between dimension of equivalence class 2453 NNTOOBS = NNTOOBS + NBAS_FRAG(LSYMEXP(ISYM),IFRAG) 2454 IF(NTEST.GE.1000) WRITE(6,*) ' ISYM, LSYM, IFRAG, NBAS = ', 2455 & ISYM,LSYMEXP(ISYM),IFRAG,NBAS_FRAG(LSYMEXP(ISYM),IFRAG) 2456 END DO ! Loop over equivalent groups of atoms 2457* 2458 IF(NNTOOBS.NE.NTOOBS(ISYM)) THEN 2459 WRITE(6,*) 2460 & ' Number of basisfunctions from fragments is not correct ' 2461 WRITE(6,'(A,3I3)') ' ISYM, NTOOBS, Sum of fragments: ', 2462 & ISYM, NTOOBS(ISYM),NNTOOBS 2463 NERROR = NERROR + 1 2464 END IF 2465 END DO 2466*. Check internal consistency for each fragment 2467 DO IIFRAG = 1, NFRAG_MOL 2468 IFRAG = IFRAG_MOL(IIFRAG) 2469 NSMOB_L = NSMOB_FRAG(IFRAG) 2470 DO ISYM = 1, NSMOB_L 2471 NNTOOBS_FRAG = 0 2472 DO IGAS = 0, NGAS + 1 2473 NNTOOBS_FRAG = 2474 & NNTOOBS_FRAG + N_GS_SM_BAS_FRAG(IGAS,ISYM,IFRAG) 2475 END DO 2476 IF(NNTOOBS_FRAG.NE.NBAS_FRAG(ISYM,IFRAG)) THEN 2477 WRITE(6,*) 2478 & ' Inconsistency between N_GS_SM_BAS_FRAG and NBAS_FRAG' 2479 WRITE(6,'(A,4I3)') 2480 & ' IFRAG, ISYM, Sum over gaspaces and Required ', 2481 & IFRAG, ISYM, NNTOOBS_FRAG, NBAS_FRAG(ISYM,IFRAG) 2482 NERRROR = NERROR + 1 2483 END IF 2484 END DO 2485 END DO 2486*. Check consistency for each GASpace and symmetry 2487 WRITE(6,*) ' Warning: some consistency checks skipped ' 2488 WRITE(6,*) ' Warning: some consistency checks skipped ' 2489 WRITE(6,*) ' Warning: some consistency checks skipped ' 2490 WRITE(6,*) ' Warning: some consistency checks skipped ' 2491 WRITE(6,*) ' Warning: some consistency checks skipped ' 2492 WRITE(6,*) ' Warning: some consistency checks skipped ' 2493 WRITE(6,*) ' Warning: some consistency checks skipped ' 2494CTEMP DO IGAS = 0, NGAS + 1 2495CTEMP DO ISYM = 1, NSMOB 2496CTEMP NNTOOBS_GS_SM = 0 2497CTEMP DO IIFRAG =1, NFRAG_MOL 2498CTEMP IFRAG = IFRAG_MOL(IIFRAG) 2499CTEMP NNTOOBS_GS_SM = 2500CTEMP& NNTOOBS_GS_SM + N_GS_SM_BAS_FRAG(IGAS,ISYM,IFRAG) 2501CTEMP END DO 2502* 2503CTEMP IF(NNTOOBS_GS_SM.NE.NOBPTS_GN(IGAS,ISYM)) THEN 2504CTEMP WRITE(6,*) 2505CTEMP& ' Inconsistency in number of orbitals of given SYM and GAS' 2506CTEMP WRITE(6,'(A,4I4)') ' ISYM, IGAS, Sum over fragments, Total ', 2507CTEMP& ISYM, IGAS, NNTOOBS_GS_SM, NOBPTS_GN(IGAS,ISYM) 2508CTEMP NERROR = NERROR + 1 2509CTEMP END IF 2510CTEMP END DO 2511CTEMP END DO 2512* 2513 IF(NERROR.NE.0) THEN 2514 WRITE(6,*) 2515 & ' Inconsistency between info on fragments and molecule ' 2516C! STOP 2517C! & ' Inconsistency between info on fragments and molecule ' 2518 END IF 2519* 2520* 2: And then set up the CMO matrix from fragment info 2521* 2522 IF(NTEST.GE.100) THEN 2523 WRITE(6,*) ' ================================== ' 2524 WRITE(6,*) ' CMO(FRAGMENTS) => CMO(MOLECULE)(1) ' 2525 WRITE(6,*) ' ================================== ' 2526 END IF 2527* 2528 DO ISYM = 1, NSMOB 2529 IF(NTEST.GE.1000) WRITE(6,*) ' ISYM = ', ISYM 2530 IF(ISYM.EQ.1) THEN 2531 IB_CMOL = 1 2532 ELSE 2533 IB_CMOL = IB_CMOL + NTOOBS(ISYM-1)**2 2534 END IF 2535 NOB_SM = NTOOBS(ISYM) 2536 ZERO = 0.0D0 2537 CALL SETVEC(CMO(IB_CMOL),ZERO,NOB_SM**2) 2538 IOFF_ORB = 1 2539 IOFF_BAS = 1 2540 JMO = 0 2541 DO IGAS = 0, NGAS + 1 2542 IB_BAS_MOL = 1 2543 IF(NTEST.GE.1000) WRITE(6,*) ' IGAS = ', IGAS 2544*. Loop over equivalent set of fragment orbitals 2545 DO IEQV = 1, NEQVGRP_FRAG 2546* First fragment of class 2547 IFRAG = IEQVGRP_FRAG(1,IEQV) 2548 IF(NTEST.GE.1000) 2549 & WRITE(6,*) ' IEQV, IFRAG = ', IEQV, IFRAG 2550* 2551 XL = DBLE(LEQVGRP_FRAG(IEQV)) 2552 SCALE = 1.0D0/SQRT(XL) 2553*. Symmetry in fragment 2554 2555 IF(LEQVGRP_FRAG(IEQV).EQ.1) THEN 2556 ISYML = ISYM 2557 ELSE IF (LEQVGRP_FRAG(IEQV).EQ.2) THEN 2558 IF(NSMOB.EQ.8) THEN 2559 ISYML = ISYM 2560 IF(ISYM.GT.4) ISYML = ISYM-4 2561 ELSE 2562 WRITE(6,*) ' Symmetry reduction not programmed(1) ' 2563 WRITE(6,*) ' ISYM, NSMOB, LEQVGRP_FRAG = ', 2564 & ISYM, NSMOB, LEQVGRP_FRAG(IEQV) 2565 STOP ' Symmetry reduction not programmed ' 2566 END IF 2567 END IF 2568 IF(NTEST.GE.1000) 2569 & WRITE(6,*) ' ISYM,ISYML = ', ISYM,ISYML 2570*. Address of symmetryblock in C for fragment 2571 IB_C_FRAG = 1 2572 DO JSYM = 1, ISYML-1 2573 IB_C_FRAG = IB_C_FRAG + NBAS_FRAG(JSYM,IFRAG)**2 2574 END DO 2575*. Start and number of orbitals in input fragment 2576 IB_OB_FRAG = 1 2577 DO JGAS = 0, IGAS - 1 2578 IB_OB_FRAG = IB_OB_FRAG 2579 & + N_GS_SM_BAS_FRAG(JGAS,ISYML,IFRAG) 2580 END DO 2581 IF(NTEST.GE.1000) WRITE(6,*) ' IB_OB_FRAG = ', 2582 & IB_OB_FRAG 2583 N_OB_GS_SM_FRAG = N_GS_SM_BAS_FRAG(IGAS,ISYML,IFRAG) 2584 N_OB_SM_FRAG = NBAS_FRAG(ISYML,IFRAG) 2585 DO JJMO = 1, N_OB_GS_SM_FRAG 2586 JMO = JMO + 1 2587 IF(NTEST.GE.1000) WRITE(6,*) ' Info for Orbital ', JMO 2588 DO IIMO = 1, N_OB_SM_FRAG 2589 IF(NTEST.GE.1000) WRITE(6,*) ' JJMO, IIMO = ', 2590 & JJMO, IIMO 2591 IF(NTEST.GE.1000) WRITE(6,*) ' IB_BAS_MOL = ', 2592 & IB_BAS_MOL 2593 IADR_OUT = IB_CMOL-1+(JMO-1)*NOB_SM +IB_BAS_MOL-1 + IIMO 2594 IADR_IN = IB_C_FRAG-1 2595 & + (JJMO+IB_OB_FRAG-1-1)*N_OB_SM_FRAG 2596 & + IIMO 2597 IF(NTEST.GE.1000) WRITE(6,*) ' IADR_IN, IADR_OUT ', 2598 & IADR_IN, IADR_OUT 2599 CMO(IADR_OUT) = WORK(KCMOAO_FRAG(IFRAG)-1+IADR_IN)*SCALE 2600 END DO !loop over IIMO 2601 END DO !loop over JJMO 2602*. Start of basis functions for given sym and fragment in molecule 2603 IB_BAS_MOL = IB_BAS_MOL + N_OB_SM_FRAG 2604 IF(NTEST.GE.1000) 2605 & WRITE(6,*) ' IB_BAS_MOL, N_OB_SM_FRAG', 2606 & IB_BAS_MOL, N_OB_SM_FRAG 2607 END DO ! End of loop over fragments 2608 END DO ! End of loop over GAspaces 2609 END DO ! End of loop over Symmetries 2610* 2611 IF(NTEST.GE.100) THEN 2612 WRITE(6,*) 2613 WRITE(6,*) ' CMO matrix from fragments(not orthogonalized) ' 2614 WRITE(6,*) ' ==============================================' 2615 WRITE(6,*) 2616 CALL APRBLM_F7(CMO,NTOOBS,NTOOBS,NSMOB,0) 2617 END IF 2618* 2619COLD STOP ' Jeppe enforced me to stop after CMO ' 2620* 2621 RETURN 2622 END 2623C ORT_ORB(WORK(KLCMOAO1),CMOAO_OUT,INTER_ORT, 2624C & INTERGAS_ORT,INTRAGAS_OUT,IORT_VB) 2625 SUBROUTINE ORT_ORB(CMOAO_IN, CMOAO_OUT, 2626 & INTER_ORT,INTERGAS_ORT, 2627 & INTRAGAS_ORT,IORT_VB) 2628* 2629* Two parts 2630* 1: Inter Gas orthogonaliztion 2631* 2: Intra Gas orthonormalization: 2632* 2633*. The inter gas orthogonalization: CMOAO_IN => CMOAO_OUT 2634* ================================== 2635* INTER_ORT = 1 => All GA Spaces are orthogonalized to inactive and 2636* secondary space 2637* 2638* INTERGAS_ORT = 1 => Gaspaces are orthogonalized to each other 2639* 2640*. The Intra gas orthonormalization: CMOAO_OUT => CMOAO_OUT 2641* ==================================== 2642* INTRAGAS_ORT = 0 => no Intra gas orthogonalization 2643* = 1 => Intra gas orthogonalization using symmetric orthog 2644* = 2 => Intra gas orthogonalization using orthog by diag 2645* IORT_VB = 0 => No orthogonalization of space VB space 2646* = 1 => orthog using method specified by INTRAGAS_ORT 2647* 2648* Note: If INTRAGAS_ORT = 1, then the VB orb space is left untouched, 2649* irrespectively of IORT_VB 2650*. Jeppe Olsen, July 2011 2651* 2652 INCLUDE 'implicit.inc' 2653 INCLUDE 'mxpdim.inc' 2654 INCLUDE 'wrkspc-static.inc' 2655 INCLUDE 'orbinp.inc' 2656 INCLUDE 'cgas.inc' 2657 INCLUDE 'glbbas.inc' 2658 INCLUDE 'lucinp.inc' 2659 INCLUDE 'crun.inc' 2660*. Input 2661 DIMENSION CMOAO_IN(*) 2662*. Output 2663 DIMENSION CMOAO_OUT(*) 2664*. Local scratch 2665 INTEGER IDIM(MXPOBS) 2666* 2667 IDUM = 0 2668 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'ORTOBV') 2669* 2670 NTEST = 00 2671 IF(NTEST.GE.100) THEN 2672 WRITE(6,*) 2673 WRITE(6,*) ' Info from ORT_ORB ' 2674 WRITE(6,*) ' =====================' 2675 WRITE(6,*) 2676 WRITE(6,'(A,2I4)') 2677 & ' INTER_ORT, INTERGAS_ORT = ', 2678 & INTER_ORT, INTERGAS_ORT 2679 WRITE(6,'(A,2I4)') 2680 & ' INTRAGAS_ORT, IORT_VB ', 2681 & INTRAGAS_ORT, IORT_VB 2682 END IF 2683 IF(NTEST.GE.1000) THEN 2684 WRITE(6,*) ' Input CMO coefficients ' 2685 CALL APRBLM2(CMOAO_IN,NTOOBS,NTOOBS,NSMOB,0) 2686 END IF 2687* 2688 IDUM = 0 2689*. Obtain metric over molecular orbitals 2690 LEN_1F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 2691C NDIM_1EL_MAT(IHSM,NRPSM,NCPSM,NSM,IPACK) 2692 CALL MEMMAN(KLSMO,LEN_1F,'ADDL ',2,'SMO ') 2693 CALL MEMMAN(KLCMOAO2,LEN_1F,'ADDL ',2,'MOAO2 ') 2694*. Obtain metric in MO basis in SMO 2695 IPACK_OUT = 0 2696 CALL GET_SMO(CMOAO_IN,WORK(KLSMO),IPACK_OUT) 2697 IF(NTEST.GE.1000) THEN 2698 WRITE(6,*) ' Overlap matrix for initial orbitals ' 2699 CALL APRBLM2(WORK(KLSMO),NTOOBS,NTOOBS,NSMOB,0) 2700 END IF 2701* 2702* ============================== 2703* The intergas orthogonalization 2704* ============================== 2705* 2706*. Resulting MOAO transformation will be saved in CMOAO_OUT 2707 CALL COPVEC(CMOAO_IN,CMOAO_OUT,LEN_1F) 2708 CALL COPVEC(CMOAO_IN,WORK(KLCMOAO2),LEN_1F) 2709C? WRITE(6,*) ' INTRAGAS_ORT after COPVEC(1)', INTRAGAS_ORT 2710* 2711 IF(INTER_ORT.EQ.1) THEN 2712* 2713*. Orthogonalize GAS spaces for inactive 2714* 2715 IF(NINOB.NE.0) THEN 2716 DO IGAS = 1, NGAS+1 2717*. Orthogonalize GAS IGAS to inactive 2718C ORT_GAS_TO_GAS(IGAS,JGAS,SIN,CIN,COUT) 2719 CALL ORT_GAS_TO_GAS(0,IGAS,WORK(KLSMO),WORK(KLCMOAO2), 2720 & CMOAO_OUT) 2721*. Test.. 2722CT CALL ORT_GAS_TO_GAS(IGAS,0,WORK(KLSMO),WORK(KLCMOAO2), 2723CT & CMOAO_OUT) 2724 CALL COPVEC(CMOAO_OUT,WORK(KLCMOAO2),LEN_1F) 2725 CALL COPVEC(CMOAO_OUT,WORK(KLCMOAO2),LEN_1F) 2726*. Update metric 2727 CALL GET_SMO(CMOAO_OUT,WORK(KLSMO),IPACK_OUT) 2728 END DO 2729 END IF 2730* 2731CM IF(NSCOB.NE.0) THEN 2732* 2733*. Orthogonalize Secondary space to GASpaces 2734* 2735CM DO IGAS = 1, NGAS 2736*. Orthogonalize Secondary to GAS IGAS 2737CM CALL ORT_GAS_TO_GAS(IGAS,NGAS+1,WORK(KLSMO),WORK(KLCMOAO2), 2738CM & CMOAO_OUT) 2739CM CALL COPVEC(CMOAO_OUT,WORK(KLCMOAO2),LEN_1F) 2740*. Update metric 2741CM CALL GET_SMO(CMOAO_OUT,WORK(KLSMO),IPACK_OUT) 2742CM END DO 2743CM END IF 2744* 2745C? WRITE(6,*) ' INTRAGAS_ORT after INTER(1)', INTRAGAS_ORT 2746 IF(INTERGAS_ORT.EQ.1) then 2747* Orthogonalize JGAS to IGAS with JGAS > IGAS 2748 IF(NTEST.GE.10000) THEN 2749 WRITE(6,*) ' SMO before GAS GAS orthog' 2750 CALL APRBLM2(WORK(KLSMO),NTOOBS,NTOOBS,NSMOB,0) 2751 WRITE(6,*) ' MOAO2 before GAS GAS orthog ' 2752 CALL APRBLM2(WORK(KLCMOAO2),NTOOBS,NTOOBS,NSMOB,0) 2753 END IF 2754 DO JGAS = 2, NGAS 2755 DO IGAS = 1, JGAS -1 2756 IF(NTEST.GE.1000) THEN 2757 WRITE(6,*) 2758 & ' InterGAS orthogonalization for IGAS, JGAS ', 2759 & IGAS, JGAS 2760 END IF 2761 CALL ORT_GAS_TO_GAS(IGAS,JGAS,WORK(KLSMO),WORK(KLCMOAO2), 2762 & CMOAO_OUT) 2763C ORT_GAS_TO_GAS(IGAS,JGAS,SIN,CIN,COUT) 2764 CALL COPVEC(CMOAO_OUT,WORK(KLCMOAO2),LEN_1F) 2765*. Update metric 2766 CALL GET_SMO(CMOAO_OUT,WORK(KLSMO),IPACK_OUT) 2767 END DO 2768 END DO 2769 END IF ! End if intergas orthogonalization was called 2770* 2771 IF(NSCOB.NE.0) THEN 2772* 2773*. Orthogonalize Secondary space to GASpaces 2774* 2775 DO IGAS = 1, NGAS 2776*. Orthogonalize Secondary to GAS IGAS 2777 CALL ORT_GAS_TO_GAS(IGAS,NGAS+1,WORK(KLSMO),WORK(KLCMOAO2), 2778 & CMOAO_OUT) 2779 CALL COPVEC(CMOAO_OUT,WORK(KLCMOAO2),LEN_1F) 2780*. Update metric 2781 CALL GET_SMO(CMOAO_OUT,WORK(KLSMO),IPACK_OUT) 2782 END DO 2783 END IF 2784 END IF ! End if interspace orthogonalization was called 2785* 2786 IF(NTEST.GE.1000) THEN 2787 WRITE(6,*) ' MOAO transformation matrix after INTERORT' 2788 CALL APRBLM2(CMOAO_OUT,NTOOBS,NTOOBS,NSMB,0) 2789 END IF 2790 2791* 2792* 2793* ============================== 2794* The intragas orthogonalization 2795* ============================== 2796* 2797* 2798 IF(NTEST.GE.1000) 2799 &WRITE(6,*) ' INTRAGAS_ORT after INTERORT', INTRAGAS_ORT 2800 IF(INTRAGAS_ORT .NE.0) THEN 2801*. Space for Metric in MO basis MO-MO transformation, blocks of S and C, 2802*. and scratch 2803 CALL MEMMAN(KLSMO,LEN_1F,'ADDL ',2,'SAOE ') 2804 CALL MEMMAN(KLCMOMO,LEN_1F,'ADDL ',2,'CMOMO ') 2805 CALL MEMMAN(KLSBLK,MXTOB**2,'ADDL ',2,'SBLK ') 2806 CALL MEMMAN(KLCBLK,MXTOB**2,'ADDL ',2,'CBLK ') 2807 LSCR = 2*LEN_1F + 6*MXTOB**2 2808 CALL MEMMAN(KLSCR,LSCR,'ADDL ',2,'SCRORT') 2809*. Initialize MOMO- transformation matrix to 1 2810 ZERO = 0.0D0 2811 CALL SETVEC(WORK(KLCMOMO),ZERO,LEN_1F) 2812 ONE = 1.0D0 2813 CALL SETDIA_BLM(WORK(KLCMOMO),ONE,NSMOB,NTOOBS,0) 2814C SETDIA_BLM(B,VAL,NBLK,LBLK,IPCK) 2815*. Obtain metric in MO basis 2816 IPACK_OUT = 0 2817 CALL GET_SMO(CMOAO_OUT,WORK(KLSMO),IPACK_OUT) 2818*. Loop over gas-spaces 2819 IF(NTEST.GE.1000) THEN 2820 WRITE(6,*) ' Information from GAS-GAS orthog ' 2821 WRITE(6,*) ' Metric in MO basis after INTERGAS part' 2822 CALL APRBLM2(WORK(KLSMO),NTOOBS,NTOOBS,NSMOB,0) 2823 END IF 2824 DO IGAS = 0, NGAS+1 2825*. Number of orbitals per sym of this GASpace 2826 CALL EXTRROW(NOBPTS_GN,IGAS+1,7+MXPR4T,NSMOB,IDIM) 2827 NTOB = IELSUM(IDIM,NSMOB) 2828 IF(NTOB.NE.0) THEN 2829 IF(NTEST.GE.1000) 2830 & WRITE(6,*) ' Orthonormalization of GAS space = ', IGAS 2831*. Extract block (IGAS,IGAS) of S-matrix and save in KLSBLK 2832C EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT(A,AGAS,IGAS,JGAS,I_EX_OR_CP) 2833 CALL EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT 2834 & (WORK(KLSMO),WORK(KLSBLK),IGAS,IGAS,1) 2835*. And obtain transformation matrix giving othogonal basis 2836*. Orthogonalization method defined differently in ORTHGNORM.. 2837 IF(IGAS.NE.NORTCIX_SCVB_SPACE) THEN 2838 IORTMET_L = INTRAGAS_ORT 2839 ELSE 2840 IF(IORT_VB.EQ.0) THEN 2841 IORTMET_L = 0 2842 ELSE 2843 IORTMET_L = INTRAGAS_ORT 2844 END IF 2845 END IF 2846* 2847C? WRITE(6,*) ' IORTMET_L = ', IORTMET_L 2848 IF(IORTMET_L.NE.0) THEN 2849 CALL ORTHNORM_BLKMT(WORK(KLSBLK),WORK(KLCBLK),NSMOB,IDIM, 2850 & WORK(KLSCR),IORTMET_L) 2851C ORTHNORM_BLKMT(S,C,NBLK,LBLK,SCR,IORTMET) 2852*. Copy transformation matrix to complete matrix 2853C EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT(A,AGAS,IGAS,JGAS,I_EX_OR_CP) 2854 CALL EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT 2855 & (WORK(KLCMOMO),WORK(KLCBLK),IGAS,IGAS,2) 2856 END IF ! IORTMET_L .ne. 0 2857 END IF ! transformation should be done 2858 END DO ! loop over GASpaces 2859* 2860 IF(NTEST.GE.1000) THEN 2861 WRITE(6,*) 2862 & ' Intra-gas MO-MO transformation matrix ' 2863 CALL APRBLM2(WORK(KLCMOMO),NTOOBS,NTOOBS,NSMOB,0) 2864 END IF 2865* CMOAO_OUT = "CMOAO_IN " * CMOMO 2866C MULT_BLOC_MAT 2867C (C,A,B,NBLOCK,LCROW,LCCOL,LAROW,LACOL,LBROW,LBCOL,ITRNSP) 2868 CALL COPVEC(CMOAO_OUT,WORK(KLCMOAO2),LEN_1F) 2869 CALL MULT_BLOC_MAT(CMOAO_OUT,WORK(KLCMOAO2),WORK(KLCMOMO), 2870 & NSMOB,NTOOBS,NTOOBS,NTOOBS,NTOOBS,NTOOBS,NTOOBS,0) 2871 END IF ! End if intragas orthogonalization was required. 2872* 2873 IF(NTEST.GE.100) THEN 2874 WRITE(6,*) ' MO-AO transformation matrix ' 2875 CALL APRBLM2(CMOAO_OUT,NTOOBS,NTOOBS,NSMOB,0) 2876 END IF 2877* 2878 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'ORTOBV') 2879* 2880 RETURN 2881 END 2882 SUBROUTINE GET_SMO(CMO,SMO,IPACK_OUT) 2883* 2884*. Obtain Metric, SMO, over a set of orbitals, CMO. 2885*. Metric is given in packed form if IPACK_OUT = 1 2886* 2887*. Jeppe Olsen, July 2011 2888* 2889 INCLUDE 'implicit.inc' 2890 INCLUDE 'mxpdim.inc' 2891 INCLUDE 'wrkspc-static.inc' 2892 INCLUDE 'lucinp.inc' 2893 INCLUDE 'orbinp.inc' 2894 INCLUDE 'glbbas.inc' 2895#include "errquit.fh" 2896#include "mafdecls.fh" 2897#include "global.fh" 2898*. Specific input 2899 DIMENSION CMO(*) 2900*. Output 2901 DIMENSION SMO(*) 2902* 2903 NTEST = 000 2904 IF(NTEST.GE.100) THEN 2905 WRITE(6,*) 2906 WRITE(6,*) ' Info from GET_SMO' 2907 WRITE(6,*) ' =================' 2908 WRITE(6,*) 2909 END IF 2910 IF(NTEST.GE.1000) THEN 2911 WRITE(6,*) ' Input CMO basis ' 2912 CALL APRBLM2(CMO,NTOOBS,NTOOBS,NSMOB,0) 2913 END IF 2914* 2915 IDUM = 0 2916 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'GETSMO') 2917* 2918C NDIM_1EL_MAT(IHSM,NRPSM,NCPSM,NSM,IPACK) 2919 LEN_M = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 2920 CALL MEMMAN(KLSAOE,LEN_M,'ADDL ',2,'SAO_E ') 2921 CALL MEMMAN(KLSCR,2*LEN_M,'ADDL ',2,'SCR ') 2922*. Expand SAO 2923 CALL TRIPAK_AO_MAT(dbl_mb(KLSAOE),dbl_mb(KSAO),2) 2924 IF(NTEST.GE.1000) THEN 2925 WRITE(6,*) ' Expanded SAO ' 2926 CALL APRBLM2(dbl_mb(KLSAOE),NTOOBS,NTOOBS,NSMOB,0) 2927 END IF 2928*. Obtain Metric in MO-basis, SMO = CMO(T) SAO CMO 2929C TRAN_SYM_BLOC_MAT4(AIN,XL,XR,NBLOCK,LX_ROW,LX_COL,AOUT,SCR,ISYM) 2930 CALL TRAN_SYM_BLOC_MAT4(dbl_mb(KLSAOE),CMO,CMO, 2931 & NSMOB,NTOOBS,NTOOBS,SMO,dbl_mb(KLSCR),0) 2932* 2933 IF(IPACK_OUT.EQ.1) THEN 2934*. Pack output matrix 2935 CALL COPVEC(SMO,dbl_mb(KLSAOE),LEN_M) 2936 CALL TRIPAK_AO_MAT(dbl_mb(KLSAOE),SMO,1) 2937 END IF 2938* 2939 IF(NTEST.GE.100) THEN 2940 WRITE(6,*) ' Metric in MO basis ' 2941 CALL APRBLM2(SMO,NTOOBS,NTOOBS,NSMOB,IPACK_OUT) 2942 END IF 2943* 2944 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'GETSMO') 2945* 2946 RETURN 2947 END 2948 SUBROUTINE ORTHNORM_BLKMT(S,C,NBLK,LBLK,SCR,IORTMET) 2949* 2950* Obtain transformation matrix that orthonormalizes basis 2951* defined by blocked metric S 2952* 2953* IMET = 1: Symmetric orthonormalization 2954* IMET = 2: Orthonormalize by diagonalization 2955* 2956*. Jeppe Olsen, July 2011 2957* 2958 INCLUDE 'implicit.inc' 2959*. Input: S is given in packed form 2960 INTEGER LBLK(NBLK) 2961 DIMENSION S(*) 2962*. Output 2963 DIMENSION C(*) 2964*. Scratch: Should atleast be: 2* Dimension of matrix + 6 times largest block 2965 DIMENSION SCR(*) 2966* 2967 NTEST = 00 2968 IF(NTEST.GE.100) THEN 2969 WRITE(6,*) ' Info from ORTHNORM_BLKMT ' 2970 WRITE(6,*) ' =========================' 2971 WRITE(6,*) ' Number of elements per block ' 2972 CALL IWRTMA(LBLK,1,NBLK,1,NBLK) 2973 IF(IORTMET.EQ.1) THEN 2974 WRITE(6,*) ' Symmetric orthogonalization ' 2975 ELSE IF (IORTMET.EQ.2) THEN 2976 WRITE(6,*) ' Orthonormalization by diagonalization of metric' 2977 END IF 2978 WRITE(6,*) ' (IORTMET = ', IORTMET 2979 END IF 2980 IF(NTEST.GE.1000) THEN 2981 WRITE(6,*) ' Input metric: ' 2982 CALL APRBLM2(S,LBLK,LBLK,NBLK,0) 2983 END IF 2984* 2985 LEN_MAT = LEN_BLMAT(NBLK,LBLK,LBLK,0) 2986 IF(IORTMET.EQ.1) THEN 2987*. Obtain S ** (-1/2) 2988 KLSQRT = 1 2989 KLSCR = KLSQRT + LEN_MAT 2990 CALL SQRT_BLMAT(S,NBLK,LBLK,2,SCR(1),C,SCR(KLSCR),0) 2991C SQRT_BLMAT(A,NBLK,LBLK,ITASK,ASQRT,AMSQRT,SCR,ISYM) 2992 ELSE 2993 CALL GET_ON_BASIS_BY_DIAG_BLKMT(S,NBLK,LBLK,C,SCR,1) 2994 END IF 2995* 2996 IF(NTEST.GE.1000) THEN 2997 WRITE(6,*) 2998 WRITE(6,*) 2999 & ' ORTHNORM_BLKMT: Matrix defining orthonormal basis ' 3000 WRITE(6,*) 3001 & ' ===================================================' 3002 WRITE(6,*) 3003 CALL APRBLM2(C,LBLK,LBLK,NBLK,0) 3004 END IF 3005* 3006 RETURN 3007 END 3008 SUBROUTINE GET_ON_BASIS_BY_DIAG_BLKMT(S,NBLK,LBLK,C,SCR,IPACK) 3009* 3010* A blocked metric S is given (lower half packed if IPACK = 1) 3011* Obtain block form of transformation matrix giving the orthonormal basis 3012* that is obtained by diagonalization 3013* S = U(T) Sigma U, C = U Sigma**(-1/2) 3014* 3015*. Jeppe Olsen, July 2011 3016* 3017 INCLUDE 'implicit.inc' 3018*. Input 3019 INTEGER LBLK(NBLK) 3020 DIMENSION S(*) 3021*. Output 3022 DIMENSION C(*) 3023*. Scratch: Should at least be of length L**2 + 2L, where L is dimension 3024* of largest block 3025 DIMENSION SCR(*) 3026* 3027 NTEST = 0 3028* 3029 NSING = 0 3030*. To get rid of compiler warninf 3031 IOFF = 0 3032 DO IBLK = 1, NBLK 3033 IF(IBLK.EQ.1) THEN 3034 IOFF = 1 3035 IOFFS = 1 3036 ELSE 3037 IOFF = IOFF + LBLK(IBLK-1)**2 3038 IF(IPACK.EQ.0) THEN 3039 IOFFS = IOFF 3040 ELSE 3041 IOFFS = IOFFS + LBLK(IBLK-1)*(LBLK(IBLK-1)-1)/2 3042 END IF 3043 END IF 3044* 3045 KLS = 1 3046 KLVEC1 = KLS + LBLK(IBLK)**2 3047 KLVEC2= KLVEC1 + LBLK(IBLK) 3048*. Obtain unpacked, but blocked, matrix in SCR(KLS) 3049 IF(IPACK.EQ.0) THEN 3050 LL = LBLK(IBLK)**2 3051 CALL COPVEC(S(IOFFS),SCR(KLS),LL) 3052 ELSE 3053 CALL TRIPAK_BLKM(SCR(KLS),S,2,LBLK,NBLK) 3054 END IF 3055*. And obtain orthonormal basis 3056 THRES_SINGU = 1.0D-14 3057C GET_ON_BASIS2(S,NVEC,NSING,X,SCRVEC1,SCRVEC2,THRES_SINGU) 3058 CALL GET_ON_BASIS2(SCR(KLS),LBLK(IBLK),NSING_BLK,C(IOFF), 3059 & SCR(KLVEC1),SCR(KLVEC2), THRES_SINGU) 3060 NSING = NSING + NSING_BLK 3061 IF(NSING_BLK.NE.0) THEN 3062 WRITE(6,*) ' Singularities in metric block ', IBLK 3063 WRITE(6,*) ' Number of singularities ', NSING_BLK 3064 END IF 3065 END DO 3066* 3067 IF(NTEST.GE.100) THEN 3068 WRITE(6,*) ' Orthonormalization matrix from diagonalization' 3069 CALL APRBLM2(C,LBLK,LBLK,NBLK,0) 3070 END IF 3071* 3072 IF(NSING.NE.0) THEN 3073 WRITE(6,*) ' Singularities in metric ' 3074 WRITE(6,*) ' Number of singularities in metric ', NSING 3075 STOP ' Singularities in metric ' 3076 END IF 3077* 3078 RETURN 3079 END 3080 FUNCTION LEN_BLMAT(NBLK,LROW,LCOL,IPACK) 3081* 3082* Determine number of elements in packed matrix with NBLK blocks 3083* with dimensions LROW, LCOL. 3084* IPACK = 1 => matrix is packed 3085* 3086* Jeppe Olsen, July 2011 3087* 3088 INCLUDE 'implicit.inc' 3089*. Input 3090 INTEGER LROW(NBLK),LCOL(NBLK) 3091* 3092 LEN = 0 3093 IF(IPACK.EQ.0) THEN 3094 DO IBLK = 1, NBLK 3095 LEN = LEN + LROW(IBLK)*LCOL(IBLK) 3096 END DO 3097 ELSE 3098 DO IBLK = 1, NBLK 3099 LEN = LEN + LROW(IBLK)*(LROW(IBLK)+1)/2 3100 END DO 3101 END IF 3102* 3103 LEN_BLMAT = LEN 3104* 3105 NTEST = 0 3106 IF(NTEST.GE.100) THEN 3107 WRITE(6,*) ' Dimension of block matrix ', LEN 3108 END IF 3109* 3110 RETURN 3111 END 3112 SUBROUTINE ORT_GAS_TO_GAS(IGAS,JGAS,SIN,CIN,COUT) 3113* 3114* Orthogonalize Orbitals in space JGAS to orbitals in space IGAS, i.e. 3115* modify orbitals in space JGAS so they are orthogonal to 3116* orbitals in space IGAS 3117* 3118* Jeppe Olsen, July 2011 3119* 3120 INCLUDE 'implicit.inc' 3121 INCLUDE 'mxpdim.inc' 3122 INCLUDE 'orbinp.inc' 3123 INCLUDE 'cgas.inc' 3124 INCLUDE 'lucinp.inc' 3125 INCLUDE 'wrkspc-static.inc' 3126*. Specific Input: Expansion of input MO's in AO's 3127 DIMENSION CIN(*),SIN(*) 3128*. Output: Expansion of output MO's in AO's 3129 DIMENSION COUT(*) 3130*. Local scratch 3131 INTEGER IDIM(MXPOBS),JDIM(MXPOBS) 3132* 3133 NTEST = 000 3134 IF(NTEST.GE.100) THEN 3135 WRITE(6,*) ' Info from ORT_GAS_TO_GAS' 3136 WRITE(6,*) ' =======================' 3137 WRITE(6,*) ' IGAS, JGAS = ', IGAS, JGAS 3138 END IF 3139 IF(NTEST.GE.10000) THEN 3140 WRITE(6,*) ' CIN entering ORT_GAS_TO_GAS ' 3141 CALL APRBLM2(CIN,NTOOBS,NTOOBS,NSMOB,0) 3142 END IF 3143* 3144 IDUM = 0 3145 CALL MEMMAN(IDUM,IDUM,'MARK ',2,'ORTGAS') 3146*. A bit of scratch 3147 LSCR = 2 * MXTOB **2 3148C? WRITE(6,*) ' Test: MXTOB = ',MXTOB 3149 CALL MEMMAN(KLSCR,LSCR, 'ADDL ', 2, 'SCRORT') 3150* 3151 CALL MEMMAN(KLSII, MXTOB**2, 'ADDL ',2,'SJJ ') 3152 CALL MEMMAN(KLSIJ, MXTOB**2, 'ADDL ',2,'SJI ') 3153 CALL MEMMAN(KLC, MXTOB**2, 'ADDL ',2,'SJI ') 3154* 3155 MXSOB = IMNMX(NTOOBS,NSMOB,2) 3156 LSCR = MXTOB*MXSOB 3157 CALL MEMMAN(KLCI, LSCR, 'ADDL ',2,'CIMOAO') 3158 CALL MEMMAN(KLCJ, LSCR, 'ADDL ',2,'CJMOAO') 3159 CALL MEMMAN(KLCJT, LSCR, 'ADDL ',2,'CJMOAO') 3160* 3161*. Dimensions of IGAS, JGAS (over symmetries) 3162* 3163 CALL EXTRROW(NOBPTS_GN,IGAS+1,7+MXPR4T,NSMOB,IDIM) 3164 CALL EXTRROW(NOBPTS_GN,JGAS+1,7+MXPR4T,NSMOB,JDIM) 3165 IF(NTEST.GE.1000) THEN 3166 WRITE(6,*) ' Number of orbitals per sym in IGAS = ', IGAS 3167 CALL IWRTMA(IDIM,1,NSMOB,1,NSMOB) 3168 WRITE(6,*) ' Number of orbitals per sym in JGAS = ', JGAS 3169 CALL IWRTMA(JDIM,1,NSMOB,1,NSMOB) 3170 END IF 3171* 3172*. Extract S(IGAS,IGAS),S(IGAS,JGAS) 3173* 3174C EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT(A,AGAS,IGAS,JGAS,I_EX_OR_CP) 3175 CALL EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT(SIN,WORK(KLSII),IGAS,IGAS,1) 3176 CALL EXTR_OR_CP_GAS_BLKS_FROM_ORBMAT(SIN,WORK(KLSIJ),IGAS,JGAS,1) 3177 IF(NTEST.GE.1000) THEN 3178 WRITE(6,*) ' S(IGAS,IGAS) for IGAS = ', IGAS 3179 CALL APRBLM2(WORK(KLSII),IDIM,IDIM,NSMOB,0) 3180 WRITE(6,*) ' S(IGAS,JGAS) for IGAS, JGAS = ', IGAS, JGAS 3181 CALL APRBLM2(WORK(KLSIJ),IDIM,JDIM,NSMOB,0) 3182 END IF 3183* 3184*. Obtain coefficient matrix of I-vectors to obtain orthogonality 3185* 3186C ORT_SPCY_TO_SPCX_BLK(NX,NY,NBLK,SXX,SXY,C,SCR) 3187 CALL ORT_SPCY_TO_SPCX_BLK(IDIM,JDIM,NSMOB, 3188 & WORK(KLSII), WORK(KLSIJ),WORK(KLC),WORK(KLSCR)) 3189* 3190*. Obtain MO-orbitals of space I and J 3191* 3192 CALL EX_OR_CP_MO_FOR_GAS(CIN,WORK(KLCI),IGAS,1) 3193 CALL EX_OR_CP_MO_FOR_GAS(CIN,WORK(KLCJ),JGAS,1) 3194* 3195*. Update MO- coefficients for JGAS 3196* 3197C MULT_BLOC_MAT 3198C (C,A,B,NBLOCK,LCROW,LCCOL,LAROW,LACOL,LBROW,LBCOL,ITRNSP) 3199* C(JGAS) = C(IGAS)*C 3200 CALL MULT_BLOC_MAT(WORK(KLCJT),WORK(KLCI),WORK(KLC),NSMOB, 3201 & NTOOBS,JDIM,NTOOBS,IDIM,IDIM,JDIM,0) 3202 IF(NTEST.GE.1000) THEN 3203 WRITE(6,*) ' Correction to Y_j = sum_k X_k C(k,j) ' 3204 CALL APRBLM2(WORK(KLCJT),NTOOBS,JDIM,NSMOB,0) 3205 END IF 3206 LEN = LEN_BLMAT(NSMOB,JDIM,NTOOBS,0) 3207C LEN_BLMAT(NBLK,LROW,LCOL,IPACK) 3208 ONE = 1.0D0 3209 IF(NTEST.GE.1000) THEN 3210 WRITE(6,*) ' Input block CIN for JGAS = ', JGAS 3211 CALL APRBLM2(WORK(KLCJ),NTOOBS,JDIM,NSMOB,0) 3212 END IF 3213 CALL VECSUM(WORK(KLCJ),WORK(KLCJ),WORK(KLCJT),ONE,ONE,LEN) 3214 IF(NTEST.GE.1000) THEN 3215 WRITE(6,*) ' Updated matrix C(JGAS) ' 3216 CALL APRBLM2(WORK(KLCJ),NTOOBS,JDIM,NSMOB,0) 3217 END IF 3218* 3219*. And transfer to COUT 3220* 3221 LEN_1F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 3222 CALL COPVEC(CIN,COUT,LEN_1F) 3223 CALL EX_OR_CP_MO_FOR_GAS(COUT,WORK(KLCJ),JGAS,2) 3224* 3225 IF(NTEST.GE.100) THEN 3226 WRITE(6,*) 3227 & ' MO expansion after orthogonalization of GAS ', JGAS , ' TO ', 3228 & IGAS 3229 CALL APRBLM2(COUT,NTOOBS,NTOOBS,NSMOB,0) 3230 END IF 3231* 3232 CALL MEMMAN(IDUM,IDUM,'FLUSM ',2,'ORTGAS') 3233* 3234 RETURN 3235 END 3236 SUBROUTINE ORT_SPCY_TO_SPCX_BLK(NX,NY,NBLK,SXX,SXY,C,SCR) 3237* A space X with metric SXX 3238* and a space Y with overlap SXY with X 3239* is given. The space and metrics are divided into NBLK blocks. 3240* 3241* Obtain the matrix C so (Y_ai + sum_k C_ki X_ak) is 3242* orthogonal to space X 3243* 3244* C(IBLK) = -SXX(IBLK)(-1) SXY(IBLK) 3245* 3246*. Jeppe Olsen, July 2011 3247* 3248 INCLUDE 'implicit.inc' 3249*. Input 3250 INTEGER NX(NBLK),NY(NBLK) 3251 DIMENSION SXX(*),SXY(*) 3252*. Output 3253 DIMENSION C(*) 3254*. Scratch: Should be length 2*NXM*NXM where NX is dim of largest block 3255 DIMENSION SCR(*) 3256* 3257 NTEST = 000 3258 IF(NTEST.GE.100) THEN 3259 WRITE(6,*) 3260 WRITE(6,*) ' Info from ORT_SPCY_TO_SPCX_BLK ' 3261 WRITE(6,*) ' ============================== ' 3262 WRITE(6,*) 3263 END IF 3264 IF(NTEST.GE.1000) THEN 3265 WRITE(6,*) ' Input matrix SXX ' 3266 CALL APRBLM2(SXX,NX,NX,NBLK,0) 3267 WRITE(6,*) ' Input matrix SXY ' 3268 CALL APRBLM2(SXY,NX,NY,NBLK,0) 3269 END IF 3270* 3271 NXM = IMNMX(NX,NBLK,2) 3272 KLS = 1 3273 KLSCR = KLS + NXM*NXM 3274* 3275 DO IBLK = 1, NBLK 3276 IF(IBLK.EQ.1) THEN 3277 IOFFXX = 1 3278 IOFFXY = 1 3279 ELSE 3280 IOFFXX = IOFFXX + NX(IBLK-1)**2 3281 IOFFXY = IOFFXY + NX(IBLK-1)*NY(IBLK-1) 3282 END IF 3283 NNX = NX(IBLK) 3284 NNY = NY(IBLK) 3285 IF(NTEST.GE.1000) 3286 & WRITE(6,*) ' IBLK, NNX, NNY = ', IBLK, NNX, NNY 3287*. Obtain SXX(IBLK) (-1) 3288 CALL COPVEC(SXX(IOFFXX),SCR(KLS),NNX**2) 3289 IF(NTEST.GE.1000) THEN 3290 WRITE(6,*) ' BLOCK SXX: ' 3291 CALL WRTMAT(SCR(KLS),NNX,NNX,NNX,NNX) 3292 END IF 3293 ISING = 0 3294 CALL INVMAT(SCR(KLS),SCR(KLSCR),NNX,NNX,ISING) 3295 IF(NTEST.GE.1000) THEN 3296 WRITE(6,*) ' Inverted SXX block' 3297 CALL WRTMAT(SCR(KLS),NNX,NNX,NNX,NNX) 3298 END IF 3299 IF(ISING.GT.0) THEN 3300 WRITE(6,*) ' Problem inverting SXX ' 3301 END IF 3302*. And multiply 3303C MATML7(C,A,B,NCROW,NCCOL,NAROW,NACOL, 3304C & NBROW,NBCOL,FACTORC,FACTORAB,ITRNSP ) 3305 FACTORC = 0.0D0 3306 FACTORAB = -1.0D0 3307 CALL MATML7(C(IOFFXY),SCR(KLS),SXY(IOFFXY), 3308 & NNX,NNY,NNX,NNX,NNX,NNY,FACTORC, FACTORAB,0) 3309 END DO! End of loop over blocks 3310* 3311 IF(NTEST.GE.100) THEN 3312 WRITE(6,*) ' C matrix for space-space orthogonalization ' 3313 CALL APRBLM2(C,NX,NY,NBLK,0) 3314 END IF 3315* 3316 RETURN 3317 END 3318C CALL EX_OR_CP_MO_FOR_GAS(CMO,WORK(KLCI),IGAS,I_EX_OR_CP) 3319 SUBROUTINE EX_OR_CP_MO_FOR_GAS(CMO_TOT, CMO_GAS, IGAS, 3320 & I_EX_OR_CP) 3321* 3322* Extract from or copy to CMO_TOT orbitals belonging to GASpace IGAS 3323* to/from CMO_GAS 3324* 3325*. Jeppe Olsen, July 2011 3326* 3327 INCLUDE 'implicit.inc' 3328 INCLUDE 'mxpdim.inc' 3329 INCLUDE 'orbinp.inc' 3330 INCLUDE 'lucinp.inc' 3331*. Input 3332 DIMENSION CMO_TOT(*) 3333*. Output 3334 DIMENSION CMO_GAS(*) 3335*. Local scratch 3336 DIMENSION IDIM(MXPOBS) 3337* 3338 NTEST = 000 3339 IF(NTEST.GE.100) THEN 3340 WRITE(6,*) ' Info from EX_OR_CP_MO_FOR_GAS' 3341 WRITE(6,*) ' =============================' 3342 WRITE(6,*) ' I_EX_OR_CP = ', I_EX_OR_CP 3343 WRITE(6,*) ' IGAS = ',IGAS 3344 END IF 3345 IF(NTEST.GE.10000) THEN 3346 WRITE(6,*) ' Input complete matrix ' 3347 CALL APRBLM2(CMO_TOT,NTOOBS,NTOOBS,NSMOB,0) 3348 END IF 3349* 3350 DO ISM = 1, NSMOB 3351*. Start of symmetry block 3352 IF(ISM .EQ. 1 ) THEN 3353 IOFF_TOT = 1 3354 IOFF_GAS = 1 3355 ELSE 3356 IOFF_TOT = IOFF_TOT + NTOOBS(ISM-1)**2 3357 IOFF_GAS = IOFF_GAS + NTOOBS(ISM-1)*NOBPTS_GN(IGAS,ISM-1) 3358 END IF 3359*. First orbital in GASpace IGAS in sym ISM - relative to start of sym 3360 IOFF_REL = 1 3361 DO JGAS = 0, IGAS-1 3362 IOFF_REL = IOFF_REL + NOBPTS_GN(JGAS,ISM) 3363 END DO 3364 NOB_GAS = NOBPTS_GN(IGAS,ISM) 3365 NOB_SM = NTOOBS(ISM) 3366 IF(I_EX_OR_CP.EQ.1) THEN 3367 CALL COPVEC(CMO_TOT(IOFF_TOT-1+(IOFF_REL-1)*NOB_SM+1), 3368 & CMO_GAS(IOFF_GAS),NOB_GAS*NOB_SM) 3369 ELSE 3370 CALL COPVEC(CMO_GAS(IOFF_GAS), 3371 & CMO_TOT(IOFF_TOT-1+(IOFF_REL-1)*NOB_SM+1), 3372 & NOB_GAS*NOB_SM) 3373 END IF 3374 END DO 3375* 3376 IF(NTEST.GE.1000) THEN 3377 CALL EXTRROW(NOBPTS_GN,IGAS+1,7+MXPR4T,NSMOB,IDIM) 3378 IF(I_EX_OR_CP.EQ.1) THEN 3379 WRITE(6,*) ' Extracted MO coefficients for IGAS = ', IGAS 3380 CALL APRBLM2(CMO_GAS,NTOOBS,IDIM,NSMOB,0) 3381 ELSE 3382 WRITE(6,*) ' Updated matrix of MO coefficients ' 3383 CALL APRBLM2(CMO_TOT,NTOOBS,NTOOBS,NSMOB,0) 3384 END IF 3385 END IF 3386* 3387 RETURN 3388 END 3389 SUBROUTINE INI_CSFEXP(CINI) 3390* 3391* Obtain initial CI expansion in terms of the CSF expansion CINI 3392* Configuration space is specified as ICSPC_CN 3393* 3394*. Jeppe Olsen, July 2011 3395* 3396 INCLUDE 'implicit.inc' 3397 INCLUDE 'mxpdim.inc' 3398 INCLUDE 'glbbas.inc' 3399 INCLUDE 'cands.inc' 3400 INCLUDE 'crun.inc' 3401 INCLUDE 'spinfo.inc' 3402*. Output 3403 DIMENSION CINI(*) 3404* 3405*. If an initial configuration has been specified use thus 3406* 3407 IDUM = 0 3408 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'INICSF') 3409* 3410 NTEST = 1000 3411 IF(NTEST.GE.10) THEN 3412 WRITE(6,*) ' INI_CSFEXP reporting ' 3413 WRITE(6,*) ' ====================' 3414 WRITE(6,*) ' I_HAVE_INI_CONF = ', I_HAVE_INI_CONF 3415 END IF 3416* 3417 NCSF_TOT = NCSF_PER_SYM_GN(ICSM, ICSPC_CN) 3418*. Initialize by zero 3419 ZERO = 0.0D0 3420 CALL SETVEC(CINI,ZERO,NCSF_TOT) 3421* 3422 IF(I_HAVE_INI_CONF.EQ.1) THEN 3423 WRITE(6,*) ' Initial configuration used as initial guess ' 3424* 3425*. Find address of configuration 3426C ILEX_FOR_CONF_G(ICONF,NOCC_ORB,ICONF_SPC,IDOREO) 3427 ILEX = ILEX_FOR_CONF_G(INI_CONF,NOB_INI_CONF,ICSPC_CN,1) 3428 IF(NTEST.GE.1000) WRITE(6,*) ' Address of config = ', ILEX 3429*. Number of CSF's for this configuration 3430 IOPEN = 2*NOB_INI_CONF-N_EL_CONF 3431*. Address in CSFVEC of first CSF with this number of open orbitals 3432 IB_OPEN = IB_OPEN_CSF(IOPEN+1,ICSM,ICSPC_CN) 3433 IF(NTEST.GE.1000) WRITE(6,*) ' IB_OPEN = ', IB_OPEN 3434*. Address of first configuration with this number of open orbitals 3435 IB_CONF = IB_CONF_REO_GN(IOPEN+1,ICSM,ICSPC_CN) 3436 IF(NTEST.GE.1000) WRITE(6,*) ' IB_CONF = ', IB_CONF 3437*. Address of first CSF belonging to this configuration 3438 IADDR = IB_OPEN + (ILEX-IB_CONF)*NPCSCNF(IOPEN+1) 3439 IF(NTEST.GE.1000) WRITE(6,*) ' IADDR = ', IADDR 3440 3441*. Equal contribution to all CSF's of config 3442 NCSF_CONF = NPCSCNF(IOPEN+1) 3443 XNCSF_CONF = DBLE(NCSF_CONF) 3444C? WRITE(6,*) ' IOPEN, NPCSCNF(IOPEN+1) = ', 3445C? & IOPEN, NPCSCNF(IOPEN+1) 3446 FACTOR = 1.0D0/SQRT(XNCSF_CONF) 3447C? WRITE(6,*) ' XNCSF_CONF, FACTOR = ', 3448C? & XNCSF_CONF, FACTOR 3449 CALL SETVEC(CINI(IADDR),FACTOR,NCSF_CONF) 3450 ELSE 3451*. Set configuration one to 1 3452 IF(NCSF_TOT.GE.7) THEN 3453 CINI(7) = 1.0D0 3454 WRITE(6,*) ' Initial guess set to CSF 7 !!!! ' 3455 ELSE 3456 CINI(1) = 1.0D0 3457 WRITE(6,*) ' Initial guess set to CSF 1 ' 3458 END IF 3459 END IF 3460* 3461 IF(NTEST.GE.1000) THEN 3462 WRITE(6,*) ' Initial CI vector ' 3463 WRITE(6,*) ' =================' 3464 CALL WRTMAT(CINI,1,NCSF_TOT,1,NCSF_TOT) 3465 END IF 3466* 3467 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'INICSF') 3468* 3469 RETURN 3470 END 3471 FUNCTION NEL_IN_COMPACT_CONF(ICONF,NOCOB) 3472* 3473*. Number of electrons in configuration, compact form 3474* 3475* Jeppe Olsen, July 2011 3476* 3477 INCLUDE 'implicit.inc' 3478 INTEGER ICONF(NOCOB) 3479* 3480 NEL = 0 3481 DO IORB = 1, NOCOB 3482 IF(ICONF(IORB).GT.0) THEN 3483 NEL = NEL + 1 3484 ELSE 3485 NEL = NEL + 2 3486 END IF 3487 END DO 3488* 3489 NEL_IN_COMPACT_CONF = NEL 3490* 3491 NTEST = 100 3492 IF(NTEST.GE.100) THEN 3493 WRITE(6,*) ' Output from NEL_IN_COMPACT_CONF ' 3494 WRITE(6,*) ' Configuration: ' 3495 CALL IWRTMA(ICONF,1,NOCOB,1,NOCOB) 3496 WRITE(6,*) ' Number of electrons = ', NEL 3497 END IF 3498* 3499 RETURN 3500 END 3501 SUBROUTINE SIGMA_CONF(C,HC,LUC,LUHC) 3502* 3503* Configuration driven Sigma routine 3504* Jeppe Olsen, July 2011 3505* 3506*. The input and output CI spaces in action are defined by the 3507* ICPSC_CN, ISSPC_CN parameters in cands 3508* 3509* 3510 INCLUDE 'implicit.inc' 3511 INCLUDE 'mxpdim.inc' 3512 INCLUDE 'wrkspc-static.inc' 3513 INCLUDE 'glbbas.inc' 3514 INCLUDE 'cands.inc' 3515 INCLUDE 'crun.inc' 3516 INCLUDE 'spinfo.inc' 3517* 3518 IDUM = 0 3519 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'SIGCNF') 3520* 3521 NTEST = 1000 3522 IF(NTEST.GE.10) THEN 3523 WRITE(6,*) ' Info from SIGMA_CONF ' 3524 WRITE(6,*) ' ===================== ' 3525 WRITE(6,'(A,2I3)') ' Config space and sym for C ', ICSPC_CN,ICSM 3526 WRITE(6,'(A,2I3)') ' Config space and sym for S ', ISSPC_CN,ISSM 3527 END IF 3528*. 3529 NCONF_C = NCONF_PER_SYM_GN(ICSM,ICSPC_CN) 3530 NSD_C = NSD_PER_SYM_GN(ICSM,ICSPC_CN) 3531 NCSF_C = NCSF_PER_SYM_GN(ICSM,ICSPC_CN) 3532* 3533 NCONF_S = NCONF_PER_SYM_GN(ISSM,ISSPC_CN) 3534 NSD_S = NSD_PER_SYM_GN(ISSM,ISSPC_CN) 3535 NCSF_S = NCSF_PER_SYM_GN(ISSM,ISSPC_CN) 3536* 3537 NCONF_MAX = MAX(NCONF_C,NCONF_S) 3538* 3539 IF(NTEST.GE.100) THEN 3540 WRITE(6,'(A,3I8)') ' Number of confs, SDs and CSFs for C ', 3541 & NCONF_C, NSD_C, NCSF_C 3542 WRITE(6,'(A,3I8)') ' Number of confs, SDs and CSFs for S ', 3543 & NCONF_S, NSD_S, NCSF_S 3544 END IF 3545* 3546*. Number of batches for configuration expansions (each batch atmost dim LCSBLK) 3547* ================================================================================ 3548* 3549*. Allowed length of batch: 3550* ========================== 3551*. IF LCSBLK has not been specified, a default batch size is used 3552* 3553 LCSBLK_L = LCSBLK 3554 IF(LCSBLK_L.LE.0) THEN 3555 WRITE(6,*) ' SIGMA_CONF will define length of batch ' 3556 LCSBLK_DEFAULT = 2000000 3557*. Compare with dimension of largest single configuration 3558 LCONF_MAX = IMNMX(NPCSCNF,MAXOP+1,2) 3559 IF(LCONF_MAX.GT.LCSBLK_DEFAULT) LCSBLK_DEFAULT = LCONF_MAX 3560 LCSBLK_L = LCSBLK_DEFAULT 3561 END IF 3562*. If ICISTR = 1, vectors are stored in one batch, so 3563 IF(ICISTR.EQ.1) LCSBLK_L = MAX(NCSF_S,NCSF_S) 3564 3565 IF(NTEST.GE.1000) WRITE(6,*) ' Allowed size of batch ', LCSBLK_L 3566*. Batches of C 3567*. ============== 3568*. One could here either use CSF's or SD's. As memory maybe the defining parameter, 3569* I opt for CSF's and will then expand/contract each configuration when needed. 3570*. Length of each configuration 3571 CALL MEMMAN(KLLCNFEXP,NCONF_MAX,'ADDL ',1,'LCNFEX') 3572*. For C 3573C CONF_EXP_LEN_LIST(ILEN,NCONF_PER_OPEN,NELMNT_PER_OPEN,MAXOP) 3574 CALL CONF_EXP_LEN_LIST(WORK(KLLCNFEXP), 3575 & NCONF_PER_OPEN_GN(1,ICSM,ICSPC_CN),NPCSCNF,MAXOP) 3576C PART_VEC(LBLK,NBLK,MAXSTR,LBAT,NBAT,IONLY_NBAT) 3577 CALL PART_VEC(WORK(KLLCNFEXP),NCONF_C,LCSBLK_L,IDUM,NBAT_C,1) 3578 CALL MEMMAN(KLLBAT_C,NBAT_C,'ADDL ',1,'LBAT_C') 3579 CALL PART_VEC(WORK(KLLCNFEXP),NCONF_C,LCSBLK_L,WORK(KLLBAT_C), 3580 & NBAT_C,0) 3581*. And for Sigma 3582C CONF_EXP_LEN_LIST(ILEN,NCONF_PER_OPEN,NELMNT_PER_OPEN,MAXOP) 3583 CALL CONF_EXP_LEN_LIST(WORK(KLLCNFEXP), 3584 & NCONF_PER_OPEN_GN(1,ISSM,ISSPC_CN),NPCSCNF,MAXOP) 3585C PART_VEC(LBLK,NBLK,MAXSTR,LBAT,NBAT,IONLY_NBAT) 3586 CALL PART_VEC(WORK(KLLCNFEXP),NCONF_S,LCSBLK_L,IDUM,NBAT_S,1) 3587 CALL MEMMAN(KLLBAT_S,NBAT_S,'ADDL ',1,'LBAT_S') 3588 CALL PART_VEC(WORK(KLLCNFEXP),NCONF_S,LCSBLK_L,WORK(KLLBAT_S), 3589 & NBAT_S,0) 3590* 3591 IF(NTEST.GE.1000) THEN 3592 WRITE(6,*) ' Number of batches for C and S ', NBAT_C, NBAT_S 3593 END IF 3594*. Largest number of configurations in a given batch 3595 MAX_CONF_BATCH_C = IMNMX(WORK(KLLBAT_C),NBAT_C,2) 3596 MAX_CONF_BATCH_S = IMNMX(WORK(KLLBAT_S),NBAT_S,2) 3597 MAX_CONF_BATCH = MAX(MAX_CONF_BATCH_C,MAX_CONF_BATCH_S) 3598* 3599 IF(NTEST.GE.100) 3600 &WRITE(6,*) ' Largest number of configs in batch ', MAX_CONF_BATCH 3601 CALL MEMMAN(KLLBLK_BAT_C,MAX_CONF_BATCH ,'ADDL ',2,'LBLBTC') 3602 CALL MEMMAN(KLLBLK_BAT_S,MAX_CONF_BATCH ,'ADDL ',2,'LBLBTS') 3603*. Two vectors for holding expansion in SD of given config 3604 LEN_SD_CONF_MAX = IMNMX(NPDTCNF,MAXOP+1,2) 3605 CALL MEMMAN(KLCONF_SD_C,LEN_SD_CONF_MAX,'ADDL ',2,'CN_SDC') 3606 CALL MEMMAN(KLCONF_SD_S,LEN_SD_CONF_MAX,'ADDL ',2,'CN_SDS') 3607*. Scratch space in routine for evuluating H for configurations (allowing combs) 3608*. Scratch: Length: INTEGER: (NDET_C + NDET_S)*N_EL_CONF + NDET_C + 6*NORB 3609 L_CNHCN = LEN_SD_CONF_MAX*(1+2*N_EL_CONF) + 6*N_ORB_CONF 3610 CALL MEMMAN(KL_CNHCN, L_CNHCN,'ADDL ',1,'LCNHCN') 3611*. Space for two integers arrays for signs 3612 CALL MEMMAN(KLISIGNC,LEN_SD_CONF_MAX,'ADDL ',1,'ISIGNC') 3613 CALL MEMMAN(KLISIGNS,LEN_SD_CONF_MAX,'ADDL ',1,'ISIGNS') 3614* 3615C? WRITE(6,*) ' KDFTP, KL_CNHCN = ', KDFTP, KL_CNHCN 3616C? WRITE(6,*) ' KLLBLK_BAT_C, KLLBLK_BAT_S = ', 3617C? & KLLBLK_BAT_C, KLLBLK_BAT_S 3618C? WRITE(6,*) ' KLCONF_SD_C, KLCONF_SD_S = ', 3619C? & KLCONF_SD_C, KLCONF_SD_S 3620C? WRITE(6,*) ' KLLBAT_C, KLLBAT_S = ', 3621C? & KLLBAT_C, KLLBAT_S 3622* 3623 IADOB = IB_ORB_CONF - 1 3624 CALL SIGMA_CONF_SLAVE(C,HC,LUC,LUHC,ICISTR, 3625 & NCONF_PER_OPEN_GN(1,ICSM,ICSPC_CN), 3626 & NCONF_PER_OPEN_GN(1,ISSM,ISSPC_CN), 3627 & NBAT_C,WORK(KLLBAT_C), 3628 & NBAT_S,WORK(KLLBAT_S), 3629 & WORK(KLLBLK_BAT_C),WORK(KLLBLK_BAT_S), 3630 & WORK(KLCONF_SD_C),WORK(KLCONF_SD_S), 3631 & IADOB,WORK(KDFTP),WORK(KL_CNHCN), 3632 & WORK(KLISIGNC),WORK(KLISIGNS)) 3633* 3634 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'SIGCNF') 3635* 3636 IF(NTEST.GE.100) THEN 3637 WRITE(6,*) ' Final sigma-vector from SIGMA_CONF' 3638 CALL WRTMAT(HC,1,NCSF_S,1,NCSF_S) 3639 END IF 3640 3641 IF(NTEST.GE.1000) WRITE(6,*) ' SIGMA_CONF finished ' 3642 RETURN 3643 END 3644 SUBROUTINE SIGMA_CONF_SLAVE(C,S,LUC,LUS,ICISTR, 3645 & NCONF_PER_OPEN_C,NCONF_PER_OPEN_S, 3646 & NBAT_C,LBAT_C,NBAT_S,LBAT_S, 3647 & LBLK_BAT_C,LBLK_BAT_S, 3648 & CONF_SD_C,CONF_SD_S,IADOB,IPRODT, 3649 & ISCR_CNHCN,ISIGN_C,ISIGN_S) 3650* 3651* Inner (aka slave) routine for direct CI in configuration based methodsø 3652* 3653*. Jeppe Olsen,July 2011 3654* 3655 INCLUDE 'implicit.inc' 3656 INCLUDE 'mxpdim.inc' 3657 INCLUDE 'spinfo.inc' 3658 INCLUDE 'cands.inc' 3659 INCLUDE 'cecore.inc' 3660*. Input 3661*. C-vector or space for batch of C-vector 3662 DIMENSION C(*) 3663*. Info on the two configuration expansions 3664 INTEGER NCONF_PER_OPEN_C(*), NCONF_PER_OPEN_S(*) 3665*. Number of blocks in the batches of C and S 3666 INTEGER LBAT_C(*), LBAT_S(*) 3667*. Scratch for Info on batches of C and S: Length of each block (configuration in batch) 3668 INTEGER LBLK_BAT_C(*),LBLK_BAT_S(*) 3669*. Space for SD expansion of single configurations 3670 DIMENSION CONF_SD_C(*), CONF_SD_S(*) 3671*. Space for signs for phase change for dets of a configurations 3672 INTEGER ISIGN_C(*),ISIGN_S(*) 3673*. CSF info: proto type dets 3674 INTEGER IPRODT(*) 3675 3676*. Output 3677 DIMENSION S(*) 3678*. Scratch transferred through to CNHCN 3679 INTEGER ISCR_CNHCN(*) 3680*. Local scratch 3681 INTEGER IOCC_C(MXPORB),IOCC_S(MXPORB) 3682* 3683 NTEST = 000 3684* 3685 IDUM = 0 3686 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'SIGCNI') 3687*. Initialization of some parameters for controlling loop over configurations 3688 IOPEN_S = 0 3689 INUM_OPS = 0 3690 IOPEN_C = 0 3691 INUM_OPC = 0 3692 IB_CSF_C = 1 3693 IB_CSF_S = 1 3694* 3695 CALL MEMCHK2('INISIG') 3696* 3697*. Loop over batches of S 3698 INI_S = 1 3699 IF(NTEST.GE.1000) WRITE(6,*) ' NBAT_C, NBAT_S = ', 3700 &NBAT_C, NBAT_S 3701 DO IBAT_S = 1, NBAT_S 3702 IF(NTEST.GE.1000) 3703 & WRITE(6,'(A,I3)') ' >>> Start of sigma batch ', IBAT_S 3704* 3705 IF(IBAT_S.EQ.1) THEN 3706 IB_CONF_S = 1 3707 IB_CSF_S = 1 3708 ELSE 3709 IB_CONF_S = IB_CONF_S + LBAT_S(IBAT_S-1) 3710 END IF 3711C? WRITE(6,*) ' LBAT_S(1) = ', LBAT_S(1) 3712 N_CONF_S = LBAT_S(IBAT_S) 3713*. Number of CSF's per config in S-batch 3714C GET_LBLK_CONF_BATCH(ICNF_INI,NCNF,LBLK_BAT,ISYM,ISPC, 3715C & NSD_BAT_TOT,NCSF_BAT_TOT) 3716 CALL GET_LBLK_CONF_BATCH(IB_CONF_S,N_CONF_S,LBLK_BAT_S,ISSM, 3717 & ISSPC_CN,NSD_BAT_TOT_S,NCSF_BAT_TOT_S) 3718 CALL MEMCHK2('AFGTL1') 3719 IF(NTEST.GE.100) THEN 3720 WRITE(6,'(A,2I9)') 3721 & ' Number of CSFs and SDs in S-batch ', NCSF_BAT_TOT_S, 3722 & NSD_BAT_TOT_S 3723 END IF 3724*. Initialize sigma batch 3725 ZERO = 0.0D0 3726C? WRITE(6,*) ' IB_CSF_S, NCSF_BAT_TOT_S = ', 3727C? & IB_CSF_S, NCSF_BAT_TOT_S 3728 CALL SETVEC(S(IB_CSF_S),ZERO,NCSF_BAT_TOT_S) 3729*. Loop over batches of C 3730C IF(ICISTR.NE.1) REWIND LUHC 3731 INI_C = 1 3732*. First time in this batch 3733 ISBAT_FIRST_TIME =1 3734 DO IBAT_C = 1, NBAT_C 3735 IF(NTEST.GE.1000) 3736 & WRITE(6,'(A,I3)') ' >>> Start of C batch ', IBAT_C 3737 CALL MEMCHK2('STCBAT') 3738 IF(IBAT_C.EQ.1) THEN 3739 IB_CONF_C = 1 3740 IB_CSF_C = 1 3741 ELSE 3742 IB_CONF_C = IB_CONF_C + LBAT_C(IBAT_C-1) 3743 END IF 3744 N_CONF_C = LBAT_C(IBAT_C) 3745*. Number of configs per config in S-batch 3746 CALL GET_LBLK_CONF_BATCH(IB_CONF_C,N_CONF_C,LBLK_BAT_C,ICSM, 3747 & ICSPC_CN,NSD_BAT_TOT_C,NCSF_BAT_TOT_C) 3748 IF(NTEST.GE.100) THEN 3749 WRITE(6,'(A,2I9)') 3750 & ' Number of CSFs and SDs in C-batch ', NCSF_BAT_TOT_C, 3751 & NSD_BAT_TOT_C 3752 END IF 3753 CALL MEMCHK2('AFGTLB') 3754*. Read, if required, next batch of C- Each configuration stored in a record by itself 3755 IF(ICISTR.NE.1) THEN 3756 CALL FRMDSCN(C,N_CONF_C,-1,LUC) 3757C FRMDSCN(VEC,NREC,LBLK,LU) 3758 END IF 3759*. And then to the configurations of the C and sigma 3760*. First time in this batch 3761 IF(ISBAT_FIRST_TIME.EQ.1) THEN 3762* Save pointers to start of configuration 3763 IOPEN_S_SAVE = IOPEN_S 3764 INUM_OPS_SAVE = INUM_OPS 3765 IB_CSF_S_SAVE = IB_CSF_S 3766 INI_S_SAVE = INI_S 3767 ELSE 3768 IOPEN_S = IOPEN_S_SAVE 3769 INUM_OPS = INUM_OPS 3770 IB_CSF_S = IB_CSF_S_SAVE 3771 INI_S = INI_S_SAVE 3772 END IF 3773 ISBAT_FIRST_TIME = 0 3774* 3775 ICBAT_FIRST_TIME =1 3776 DO ICONF_S = IB_CONF_S, IB_CONF_S + N_CONF_S -1 3777*. Obtain occupation in IOCC_S and iopen for this sigma-configuration 3778C NEXT_CONF_IN_CONFSPC(IOCC,IOPEN,INUM_OP,INI,ISYM,ISPC,NEW) 3779 IF(NTEST.GE.1000) WRITE(6,*) ' Requesting next S-conf: ' 3780 CALL NEXT_CONF_IN_CONFSPC(IOCC_S,IOPEN_S,INUM_OPS,INI_S, 3781 & ISSM,ISSPC_CN,NEW_S) 3782 INI_S = 0 3783 IOCOB_S = (IOPEN_S + N_EL_CONF)/2 3784*. Signs for going between configuration and interaction order of dets 3785C SIGN_CONF_SD(ICONF,NOB_CONF,IOP,ISGN,IPDET_LIST,ISCR) 3786 CALL SIGN_CONF_SD(IOCC_S,IOCOB_S,IOPEN_S,ISIGN_S,IPRODT, 3787 & ISCR_CNHCN) 3788 CALL MEMCHK2('AFSIGN') 3789* 3790 IF(NTEST.GE.100) THEN 3791 WRITE(6,*) ' Sigma configuration number ', ICONF_S 3792 CALL IWRTMA(IOCC_S,1,IOCOB_S,1,IOCOB_S) 3793 END IF 3794 NCSF_S = NPCSCNF(IOPEN_S+1) 3795 NSD_S = NPDTCNF(IOPEN_S+1) 3796* 3797 ZERO = 0.0D0 3798*. The contribution to a given sigma conf from all C-conf in C-batch 3799* will be stored in CONF_SD_S(1) 3800 CALL SETVEC(CONF_SD_S,ZERO,NSD_S) 3801* 3802 IF( ICBAT_FIRST_TIME .EQ. 1) THEN 3803 IOPEN_C_SAVE = IOPEN_C 3804 INUM_OPC_SAVE = INUM_OPC 3805 IB_CSF_C_SAVE = IB_CSF_C 3806 ELSE 3807 IOPEN_C = IOPEN_C_SAVE 3808 INUM_OPC = INUM_OPC_SAVE 3809 IB_CSF_C = IB_CSF_C_SAVE 3810 END IF 3811 ICBAT_FIRST_TIME = 0 3812 DO ICONF_C = IB_CONF_C, IB_CONF_C + N_CONF_C -1 3813*. Obtain occupation in IOCC_C and iopen for this C-configuration 3814C NEXT_CONF_IN_CONFSPC(IOCC,IOPEN,INUM_OP,INI,ISYM,ISPC,NEW) 3815 IF(NTEST.GE.1000) WRITE(6,*) ' Requesting next C-conf: ' 3816 CALL NEXT_CONF_IN_CONFSPC(IOCC_C,IOPEN_C,INUM_OPC,INI_C, 3817 & ICSM,ICSPC_CN,NEW_C) 3818*. Signs for going between configuration and interaction order of dets 3819C SIGN_CONF_SD(ICONF,NOB_CONF,IOP,ISGN,IPDET_LIST,ISCR) 3820 IOCOB_C = (IOPEN_C + N_EL_CONF)/2 3821 CALL SIGN_CONF_SD(IOCC_C,IOCOB_C,IOPEN_C,ISIGN_C,IPRODT, 3822 & ISCR_CNHCN) 3823 INI_C = 0 3824 IF(NTEST.GE.1000) THEN 3825 WRITE(6,*) ' C configuration number ', ICONF_C 3826 IOCOB_C = (IOPEN_C + N_EL_CONF)/2 3827 CALL IWRTMA(IOCC_C,1,IOCOB_C,1,IOCOB_C) 3828 END IF 3829*. Expand coefficients for configuration from CSF to SD basis 3830 NCSF_C = NPCSCNF(IOPEN_C+1) 3831 NSD_C = NPDTCNF(IOPEN_C+1) 3832C CSDTVC_CONF(C_SD,C_CSF,NOPEN,ISIGN,IAC,IWAY) 3833 CALL CSDTVC_CONF(CONF_SD_C,C(IB_CSF_C),IOPEN_C,ISIGN_C,2,1) 3834 IF(NTEST.GE.1000) THEN 3835 WRITE(6,*) ' C(ICONF_C) in SD' 3836 CALL WRTMAT(CONF_SD_C,1,NSD_C,1,NSD_C) 3837 END IF 3838 IF(NTEST.GE.1000) THEN 3839 WRITE(6,'(A,2I6)') 3840 & ' Info on sigma for ICONF_C, ICONF_S = ', 3841 & ICONF_C, ICONF_S 3842 END IF 3843*. Core energy is pt added in DIHDJ2, so the code below is outcommented 3844C! IF(ICONF_C.EQ.ICONF_S) THEN 3845*. Add core energy 3846C! ONE = 1.0D0 3847C! CALL VECSUM(CONF_SD_S,CONF_SD_S,CONF_SD_C, 3848C! & ONE,ECORE,NSD_C) 3849C! END IF 3850*. Update: S(I) = S(I) + Sum(J) <I!H!J> C(J) 3851C CNHCN_LUCIA(ICNL,IOPL,ICNR,IOPR,C,SIGMA, 3852C & IADOB,IPRODT,I12OP,IORBTRA,IORB,IAB,ISCR) 3853 I12OP = 2 3854 I_DO_ORBTRA = 0 3855 IORB = 0 3856C CNHCN_LUCIA(ICNL,IOPL,ICNR,IOPR,C,CNHCNM,SIGMA, 3857C & IADOB,IPRODT,I12OP,I_DO_ORBTRA,IORBTRA, 3858C & ECORE,ISCR) 3859 CALL CNHCN_LUCIA(IOCC_S,IOPEN_S,IOCC_C,IOPEN_C, 3860 & CONF_SD_C,XDUM,CONF_SD_S,IADOB, 3861 & IPRODT,I12OP,I_DO_ORBTRA,IORB, 3862 & ECORE,2,0,RJ,RK, ISCR_CNHCN) 3863C CNHCN_LUCIA(ICNL,IOPL,ICNR,IOPR,C,CNHCNM,SIGMA, 3864C & IADOB,IPRODT,I12OP,I_DO_ORBTRA,IORBTRA, 3865C & ECORE,IHORS,ISYM,RJ,RK,ISCR) 3866*. Update address of C in action 3867 IB_CSF_C = IB_CSF_C + NCSF_C 3868 IF(NTEST.GE.1000) THEN 3869 WRITE(6,*) ' Updated Sigma(ICONF_S) in SD' 3870 CALL WRTMAT(CONF_SD_S,1,NSD_S,1,NSD_S) 3871 END IF 3872 END DO ! over configs in batch of C 3873*. And transform sigma part to CSF and update sigma vector 3874 CALL CSDTVC_CONF(CONF_SD_S,S(IB_CSF_S),IOPEN_S,ISIGN_S,1,2) 3875 IB_CSF_S = IB_CSF_S + NCSF_S 3876 IF(NTEST.GE.1000) WRITE(6,*) ' End of conf for S-batch ' 3877 END DO ! over configs in batch of S 3878 IF(NTEST.GE.1000) WRITE(6,*) ' End of C-batch ' 3879 END DO ! Over batches of C 3880 IF(NTEST.GE.1000) WRITE(6,*) ' End of S-batch ' 3881 END DO ! over batches of Sigma 3882* 3883 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'SIGCNI') 3884 IF(NTEST.GE.1000) WRITE(6,*) 'SIGMA_CONF_SLAVE finished' 3885 RETURN 3886 END 3887 SUBROUTINE PART_VEC(LBLK,NBLK,MAXSTR,LBAT,NBAT,IONLY_NBAT) 3888* 3889* A vector consists of NBLK BLocks with lengths given by LBLK(IBLK). 3890* Partition the vector into batches of blocks, so each batch has atmost 3891* length MAXSTR. 3892* IF IONLY_NBAT = 1, then only the number of batches is calculated 3893* 3894* Jeppe Olsen, July 2011 3895* 3896 INCLUDE 'implicit.inc' 3897*. Input 3898 INTEGER LBLK(NBLK) 3899*.Output 3900 DIMENSION LBAT(*) 3901* 3902 NBAT = 1 3903 NBLK_B = 0 3904 LBLK_B = 0 3905 DO IBLK = 1, NBLK 3906 IF(LBLK(IBLK)+LBLK_B.LE.MAXSTR) THEN 3907*. Can be included in current batch 3908 NBLK_B = NBLK_B + 1 3909 LBLK_B = LBLK_B + LBLK(IBLK) 3910 ELSE 3911 IF(IONLY_NBAT.EQ.0) LBAT(NBAT) = NBLK_B 3912*. Start new batch 3913 NBAT = NBAT + 1 3914 LBLK_B = LBLK(IBLK) 3915 NBLK_B = 1 3916 END IF 3917 END DO 3918*. Save last Batch 3919 IF(IONLY_NBAT.EQ.0) LBAT(NBAT) = NBLK_B 3920 3921* 3922 NTEST = 00 3923 IF(NTEST.GE.100) THEN 3924 WRITE(6,*) ' Output from PART_VEC ' 3925 WRITE(6,*) ' ==================== ' 3926 WRITE(6,*) ' Largest allowed batchsize ', MAXSTR 3927 WRITE(6,*) ' Number of batches ', NBAT 3928 IF(IONLY_NBAT.EQ.0) THEN 3929 WRITE(6,*) ' Number of blocks in each batch ' 3930 CALL IWRTMA(LBAT,1,NBAT,1,NBAT) 3931 END IF 3932 END IF 3933* 3934 RETURN 3935 END 3936 SUBROUTINE MATVCC2(A,VIN,VOUT,NROW,NCOL,ITRNS,FACIN) 3937* 3938* ITRNS = 0 : VOUT(I) = FACIN*VOUT(I) + A(I,J)*VIN(J) 3939* ITRNS = 1 : VOUT(I) = FACIN*VOUT(I) + A(J,I)*VIN(J) 3940* 3941* NROW, NCOL are rows and column of input matrix (not transposed) 3942 INCLUDE 'implicit.inc' 3943*. Input 3944 DIMENSION A(NROW,NCOL) 3945 DIMENSION VIN(*) 3946*. Output 3947 DIMENSION VOUT(*) 3948* 3949 IF(ITRNS.EQ.0) THEN 3950* 3951 IF(FACIN.EQ.0.0D0) THEN 3952 ZERO = 0.0D0 3953 CALL SETVEC(VOUT,ZERO,NROW) 3954 ELSE 3955 CALL SCALVE(VOUT,FACIN,NROW) 3956 END IF 3957* 3958 DO J = 1, NCOL 3959 VINJ = VIN(J) 3960 DO I = 1, NROW 3961 VOUT(I) = VOUT(I) + A(I,J)*VINJ 3962 END DO 3963 END DO 3964* 3965 ELSE IF( ITRNS.EQ.1) THEN 3966* 3967 DO I = 1, NCOL 3968 IF(FACIN.EQ.0.0D0) THEN 3969 X = 0.0D0 3970 ELSE 3971 X = FACIN*VOUT(I) 3972 END IF 3973* 3974 DO J = 1, NROW 3975 X = X + A(J,I)*VIN(J) 3976 END DO 3977 VOUT(I) = X 3978 END DO 3979 END IF 3980* 3981 NTEST = 000 3982 IF(NTEST.GE.100) THEN 3983 IF(ITRNS.EQ.0) THEN 3984 WRITE(6,*) ' Vectorout = matrix * vectorin (MATVCC) ' 3985 WRITE(6,*) ' Input and output vectors ' 3986 CALL WRTMAT(VIN,1,NCOL,1,NCOL) 3987 CALL WRTMAT(VOUT,1,NROW,1,NROW) 3988 WRITE(6,*) ' Matrix ' 3989 CALL WRTMAT(A,NROW,NCOL,NROW,NCOL) 3990 ELSE 3991 WRITE(6,*) ' Vectorout = matrix(T) * vectorin (MATVCC) ' 3992 WRITE(6,*) ' Input and output vectors ' 3993 CALL WRTMAT(VIN,1,NROW,1,NROW) 3994 CALL WRTMAT(VOUT,1,NCOL,1,NCOL) 3995 WRITE(6,*) ' Matrix (untransposed)' 3996 CALL WRTMAT(A,NROW,NCOL,NROW,NCOL) 3997 END IF 3998 END IF 3999 4000* 4001 RETURN 4002 END 4003 SUBROUTINE ISIGN_TIMES_REAL(ISIGN,VEC,NDIM) 4004* 4005* VEC(I) = ISIGN(I)*VEC(I) 4006* 4007* X X 4008* 4009 INCLUDE 'implicit.inc' 4010*. Input and output 4011 INTEGER ISIGN(*) 4012 DIMENSION VEC(*) 4013* 4014 DO I = 1, NDIM 4015 IF(ISIGN(I).EQ.-1) VEC(I) = -VEC(I) 4016 END DO 4017*. (No NTEST here, as it could identify programmer....) 4018 RETURN 4019 END 4020 SUBROUTINE MINMAX_FOR_ORBTRA(MIN_IN,MAX_IN,MIN_OUT,MAX_OUT, 4021 & MIN_INTM,MAX_INTM,MIN_INTMS,MAX_INTMS,ISYM,IDODIM, 4022 & NCONF_INTM,NCSF_INTM,NSD_INTM) 4023* 4024* Obtain intermediate MINMAX spaces for transforming between 4025* initial (MIN/MAX_IN) and final (MIN/MAX_OUT) spaces. 4026* 4027* Two intermediate spaces are produced 4028* 4029* _INTM: Just overall occupations are considered 4030* _INTMS: Also occupations in each orbital symmetry is 4031* considered 4032* (INTMS arrays not activated yet...) 4033* 4034* IF IDODIM.EQ.1, the number of configs, CSF's and SD's 4035* is calculated for the various spaces and SYM ISYM. 4036* 4037* IP_SPC is the first space in MIN 4038* 4039* 4040* Jeppe Olsen, July 16 2011 (55 years birthday- still programming) 4041* 4042* No distinction is made here of the two operators used to 4043* transform a given orbital. The IORB array should be 4044* used as final space for both operators for this orbital 4045 INCLUDE 'implicit.inc' 4046 INCLUDE 'mxpdim.inc' 4047 INCLUDE 'orbinp.inc' 4048 INCLUDE 'lucinp.inc' 4049 INCLUDE 'spinfo.inc' 4050*. Input 4051 INTEGER MIN_IN(MXPORB), MAX_IN(MXPORB) 4052 INTEGER MIN_OUT(MXPORB), MAX_OUT(MXPORB) 4053*. Output 4054 INTEGER MIN_INTM(MXPORB,N_ORB_CONF), 4055 & MAX_INTM(MXPORB,N_ORB_CONF) 4056 INTEGER MIN_INTMS(MXPORB,N_ORB_CONF), 4057 & MAX_INTMS(MXPORB,N_ORB_CONF) 4058* 4059 INTEGER NCONF_INTM(N_ORB_CONF) 4060 INTEGER NCSF_INTM(N_ORB_CONF) 4061 INTEGER NSD_INTM(N_ORB_CONF) 4062*. Local scratch 4063 INTEGER NOCPSM_IN(MXPOBS,2),NOCPSM_INTM(MXPOBS,2), 4064 & NOCPSM_OUT(MXPOBS,2), NREM(MXPOBS) 4065* 4066* The occupations of the intermediate codes is based on the 4067* following considerations: 4068* In each step of the transformation one orbital is transformed 4069* from initial to final basis. In step IORB, electrons in 4070* orbitals 1 - IORB may this be added, but never removed 4071* Note also that the transformation is symmetry conserving. 4072* So restrictions does not only hold for complete 4073* electron occupations, but also for occupations in each 4074* orbital symmetry 4075* 4076*. Note that MINMAX_INTM(*,*,IORB) refers to the occupations 4077* after orbital IORB has been transformed 4078* 4079 NTEST = 1000 4080 IF(NTEST.GE.1000) THEN 4081 WRITE(6,*) ' Info from MINMAX_FOR_ORBTRA ' 4082 WRITE(6,*) ' ============================ ' 4083 WRITE(6,*) 4084 WRITE(6,*) ' MINMAX for IN: ' 4085 CALL WRT_MINMAX_OCC(MIN_IN,MAX_IN,N_ORB_CONF) 4086 WRITE(6,*) ' MINMAX for OUT: ' 4087 CALL WRT_MINMAX_OCC(MIN_OUT,MAX_OUT,N_ORB_CONF) 4088 END IF 4089* 4090 IZERO = 0 4091* 4092*. Number of electrons per symmetry in IN and OUT 4093* 4094C MINMAX_PER_SYM(MIN_OCC,MAX_OCC,MIN_PER_SYM,MAX_PER_SYM) 4095 CALL MINMAX_PER_SYM(MIN_IN,MAX_IN, 4096 & NOCPSM_IN(1,1),NOCPSM_IN(1,2)) 4097 CALL MINMAX_PER_SYM(MIN_OUT,MAX_OUT, 4098 & NOCPSM_OUT(1,1),NOCPSM_OUT(1,2)) 4099* 4100* 4101* For convenience, during debugging 4102 INUM = -55 4103 DO IORB = 1, N_ORB_CONF-1 4104 CALL ISETVC(MIN_INTM(1,IORB),INUM,N_ORB_CONF) 4105 CALL ISETVC(MAX_INTM(1,IORB),INUM,N_ORB_CONF) 4106 END DO 4107*. Loop over orbitals to be transformed 4108 DO ITORB = 1, N_ORB_CONF 4109 IF(NTEST.GE.100) THEN 4110 WRITE(6,*) ' Orbital to be transformed ', ITORB 4111 END IF 4112 IF(ITORB.EQ.N_ORB_CONF) THEN 4113*. Just copy final list 4114 N = N_ORB_CONF 4115 CALL ICOPVE(MIN_OUT(1),MIN_INTM(1,N),N) 4116 CALL ICOPVE(MAX_OUT(1),MAX_INTM(1,N),N) 4117 ELSE IF(ITORB.EQ.1) THEN 4118*. The number of electrons in orbital 1 cannot be increased 4119 MAX_INTM(1,ITORB) = MAX_IN(1) 4120 MIN_INTM(1,ITORB) = 0 4121*. The accumulated occupation for the remaining orbitals may be decreased by 4122*. the number of electrons in orbital 1 4123 MAX_AC = MAX_IN(1) 4124 MIN_AC = MIN_IN(1) 4125 DO IORB = ITORB+1, N_ORB_CONF 4126 MIN_INTM(IORB,ITORB) = 4127 & MAX(0,MIN_IN(IORB)-MAX_AC) 4128 END DO 4129*. In the untransformed orbitals: Never less in IORB-N_ORB_CONF than in INI 4130 DO IORB = ITORB+1, N_ORB_CONF 4131 MAX_INTM(IORB,ITORB) = MAX_IN(IORB) 4132 END DO 4133 ELSE 4134*. Max in ITORB 4135 MAX_AC = 4136 & MIN((MAX_INTM(ITORB,ITORB-1) - MIN_INTM(ITORB-1,ITORB-1)),2) 4137*. Orbital IORB .le. ITORB: Never more in these orbitals than in the end 4138*. Occupations once created are never annihilated 4139 DO IORB = 1, ITORB-1 4140 MAX_INTM(IORB,ITORB) = MAX_OUT(IORB) 4141 MIN_INTM(IORB,ITORB) = MAX(0,MIN_INTM(IORB,ITORB-1)-MAX_AC) 4142 END DO 4143*. Orbital ITORB: Accumulated in 1 - ITORB can never be more than 4144* in the initial space 4145 MAX_INTM(ITORB,ITORB) = MAX_IN(ITORB) 4146 MIN_INTM(ITORB,ITORB) = MAX(0,MIN_INTM(ITORB,ITORB-1)-MAX_AC) 4147 4148*. Orbital IORB .gt. ITORB: Never less in orbitals IORB- N_ORB_CONF than in INI 4149 DO IORB = ITORB+1, N_ORB_CONF 4150 MAX_INTM(IORB,ITORB) = MAX_IN(IORB) 4151 MIN_INTM(IORB,ITORB) = MAX(0,MIN_INTM(IORB,ITORB-1)-MAX_AC) 4152 END DO 4153 END IF ! switch between orbitals 4154 END DO ! loop over orbitals to be transformed 4155* 4156*. Ensure that the MINMAX arrays are consistent with atmost 4157*. two electrons in each orb 4158* 4159 IZEROSPC = 0 4160 DO ITORB = 1, N_ORB_CONF 4161 CALL CHECK_MINMAX(MIN_INTM(1,ITORB),MAX_INTM(1,ITORB), 4162 & N_ORB_CONF,IZEROSPC) 4163C CHECK_MINMAX(MIN_OCC,MAX_OCC,NORB,IZEROSPC) 4164 IF(IZEROSPC.EQ.1) THEN 4165 WRITE(6,*) ' Vanishing space detected by CHECK_MINMAX' 4166 STOP ' Vanishing space detected by CHECK_MINMAX' 4167 END IF 4168 END DO 4169* 4170* 4171* Test: Set evrything to Max space 4172* 4173 IFUSK = 0 4174 IF(IFUSK .EQ.1) THEN 4175 DO I = 1, 100 4176 WRITE(6,*) ' MINMAX spaces set to largest possible space' 4177 END DO 4178 NELECT = MAX_IN(N_ORB_CONF) 4179 DO ITORB = 1, N_ORB_CONF 4180 DO IORB = 1, N_ORB_CONF 4181 MIN_INTM(IORB,ITORB) = 0 4182 MAX_INTM(IORB,ITORB) = NELECT 4183 END DO 4184 CALL CHECK_MINMAX(MIN_INTM(1,ITORB),MAX_INTM(1,ITORB), 4185 & N_ORB_CONF,IZEROSPC) 4186 END DO 4187 END IF ! FUSK 4188* 4189 IF(IDODIM.EQ.1) THEN 4190 DO IORB = 0, N_ORB_CONF 4191C GET_DIM_MINMAX_SPACE(MIN_OCC,MAX_OCC,NORB,ISYM, 4192 CALL GET_DIM_MINMAX_SPACE(MIN(1,IORB),MAX(1,IORB), 4193 & IREO_MNMX_OB_NO,N_ORB_CONF,ISYM,NCONFL,NCSFL,NSDL) 4194 NCONF_INTM(IORB) = NCONFL 4195 NCSF_INTM(IORB) = NCSFL 4196 NSD_INTM(IORB) = NSDL 4197 END DO 4198 END IF 4199* 4200 IF(NTEST.GE.100) THEN 4201 WRITE(6,*) 4202 WRITE(6,*) ' ========================================' 4203 WRITE(6,*) ' MINMAX arrays for orbital transformation' 4204 WRITE(6,*) ' ========================================' 4205 WRITE(6,*) 4206 DO IORB = 1, N_ORB_CONF 4207 WRITE(6,'(A,I4)') ' After transforming orbital ', IORB 4208 WRITE(6,*) ' ==================================' 4209 WRITE(6,*) 4210 CALL WRT_MINMAX_OCC( 4211 & MIN_INTM(1,IORB),MAX_INTM(1,IORB),N_ORB_CONF) 4212 IF(IDODIM.EQ.1) WRITE(6,'(A,3I9)') 4213 & ' Number Confs, CSFs, SDs ', 4214 & NCONF_INTM(IORB),NCSF_INTM(IORB),NSD_INTM(IORB) 4215 END DO 4216 END IF 4217* 4218 RETURN 4219 END 4220 SUBROUTINE CHECK_MINMAX(MIN_OCC,MAX_OCC,NORB,IZEROSPC) 4221* 4222* Accumulated occupations for configuration space is 4223* given in the form or a min max space. Ensure that the space 4224* is physically reasonable: 4225* 1: each orbital may contain atmost two electrons 4226* 4227* The spaces are corrected to produce the same space as input 4228* Therefore: Min_occ may be increased and max_occ may be decreased 4229* 4230* A vanisning space is flagged by IZEROSPC = 1 4231* 4232*. Jeppe Olsen, July 2011 4233* 4234 INCLUDE 'implicit.inc' 4235*. Input and output 4236 INTEGER MIN_OCC(NORB),MAX_OCC(NORB) 4237* 4238 NTEST = 1000 4239 IF(NTEST.GE.100) THEN 4240 WRITE(6,*) 4241 WRITE(6,*) ' Info from CHECK_MINMAX ' 4242 WRITE(6,*) ' =======================' 4243 WRITE(6,*) 4244 WRITE(6,*) ' MINMAX to be examined ' 4245 CALL WRT_MINMAX_OCC(MIN_OCC,MAX_OCC,NORB) 4246 END IF 4247* 4248 IZEROSPC = 0 4249*. Check that MAX is larger to or equal to MIN 4250 DO IORB = 1, NORB 4251 IF(MIN_OCC(IORB).GT. MAX_OCC(IORB)) IZEROSPC = 1 4252 END DO 4253*. Ensure that lower bounds are non-negative 4254 DO IORB = 1, NORB 4255 IF(MIN_OCC(IORB).LT.0) MIN_OCC(IORB) = 0 4256 END DO 4257*. Upper bound negative => vanishing space 4258 DO IORB = 1, NORB 4259 IF(MAX_OCC(IORB).LT.0) IZEROSPC = 1 4260 END DO 4261*. Upper bound .le. number of electrons 4262 NELEC = MAX_OCC(NORB) 4263 DO IORB = 1, NORB 4264 IF(MAX_OCC(IORB).GT.NELEC) MAX_OCC(IORB) = NELEC 4265 END DO 4266*. Ensure non-decreasing upper and lowe bounds 4267 DO IORB = NORB, 2, -1 4268 IF(MAX_OCC(IORB-1).GT.MAX_OCC(IORB)) 4269 & MAX_OCC(IORB-1) = MAX_OCC(IORB) 4270 END DO 4271 DO IORB = 2, NORB 4272 IF(MIN_OCC(IORB-1).GT.MIN_OCC(IORB)) 4273 & MIN_OCC(IORB) = MIN_OCC(IORB-1) 4274 END DO 4275*. Atmost two electrons may be added in each orbital 4276 DO IORB =1, NORB 4277 IF(MAX_OCC(IORB).GT.2*IORB) MAX_OCC(IORB) = 2*IORB 4278 IF(MIN_OCC(IORB).GT.2*IORB) IZEROSPC = 1 4279 END DO 4280*. Atleast two electrons may be added in each of the remaining orbitals 4281 DO IORB = NORB,1,-1 4282 MAXLEFT = (NORB-IORB)*2 4283 IF(MIN_OCC(IORB).LE.NELEC-MAXLEFT) MIN_OCC(IORB) = NELEC-MAXLEFT 4284 END DO 4285* 4286 IF(NTEST.GE.100.OR.IZEROSPC.EQ.1) THEN 4287 IF(IZEROSPC.EQ.1) THEN 4288 WRITE(6,*) ' CHECK_MINMAX was presented for a vanishing space' 4289 WRITE(6,*) ' Space, perhaps partly cleaned up' 4290 ELSE 4291 WRITE(6,*) ' MINMAX space after shaving by CHECK_MINMAX' 4292 END IF 4293 CALL WRT_MINMAX_OCC(MIN_OCC,MAX_OCC,NORB) 4294 END IF 4295* 4296 RETURN 4297 END 4298 FUNCTION IINPROD(IA,IB,NDIM) 4299* 4300* Inner product of two integer arrays IA, IB 4301* 4302* Jeppe Olsen, July 16, 2011 4303* 4304 INCLUDE 'implicit.inc' 4305 INTEGER IA(NDIM), IB(NDIM) 4306* 4307 IPROD = 0 4308 DO I = 1, NDIM 4309 IPROD = IPROD + IA(I)*IB(I) 4310 END DO 4311* 4312 IINPROD = IPROD 4313* 4314 RETURN 4315 END 4316 SUBROUTINE TRACI_CONF(C,S,LUC,LUHC) 4317* 4318*. Perform orbital transformation in the configuration approach 4319*. Initial version some 40 hours before take of to WATOC 2011 4320* 4321* Note: Routine uses C as scratch so this is modified during calc. 4322* 4323*. The MO-MO transformation matrix is stored in KCBIO 4324*. The spaces defining the in and out spaces are defined by 4325* 4326* ICPSC_CN, ISSPC_CN parameters in cands 4327* 4328* 4329*. Last modification; Jeppe Olsen; June 18, 2013; Allowing inactive orbitals 4330*. and several symmetries(sic) 4331 INCLUDE 'implicit.inc' 4332 REAL*8 INPROD 4333 INCLUDE 'mxpdim.inc' 4334 INCLUDE 'wrkspc-static.inc' 4335 INCLUDE 'glbbas.inc' 4336 INCLUDE 'cands.inc' 4337 INCLUDE 'crun.inc' 4338 INCLUDE 'spinfo.inc' 4339 INCLUDE 'orbinp.inc' 4340 INCLUDE 'vb.inc' 4341 INCLUDE 'lucinp.inc' 4342*. Input and scratch 4343 DIMENSION C(*) 4344*. Output 4345 DIMENSION S(*) 4346*. Local scratch 4347 DIMENSION FUSK(1000) 4348* 4349 IDUM = 0 4350 CALL LUCIAQENTER('TRACNF') 4351 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'TRACNF') 4352* 4353 NTEST = 100 4354 IF(NTEST.GE.100) THEN 4355 WRITE(6,*) ' Info from TRACI_CONF ' 4356 WRITE(6,*) ' ===================== ' 4357 WRITE(6,*) ' LUC, LUHC = ', LUC, LUHC 4358 WRITE(6,*) ' ICISTR = ', ICISTR 4359 WRITE(6,*) ' ICSM, ISSM = ',ICSM, ISSM 4360 END IF 4361 IF(NTEST.GE.10000) THEN 4362 WRITE(6,*) ' Initial vector to be transformed' 4363 NCSF_C = NCSF_PER_SYM_GN(ICSM,ICSPC_CN) 4364 CALL WRTMAT(C,1,NCSF_C,1,NCSF_C) 4365 END IF 4366* 4367* 1: Obtain the matrix T defining the steps of the orbital transformation 4368* using the approach of PAM 4369* T 4370 CALL MEMMAN(KLT,NTOOB**2,'ADDL ',2,'TMAT ') 4371 CALL MEMMAN(KLTB,NTOOB**2,'ADDL ',2,'TMATBL') 4372*. Scratch in PAMTMT 4373 LSCR = NTOOB**2 +NTOOB*(NTOOB+1)/2 4374 CALL MEMMAN(KLSCR,LSCR,'ADDL ',2,'KLSCR ') 4375*. Each symmetry separate 4376 DO ISM = 1, NSMOB 4377 IF(ISM.EQ.1) THEN 4378 IOFF = 1 4379 ELSE 4380 IOFF = IOFF + NTOOBS(ISM-1)**2 4381 END IF 4382 IF(NTOOBS(ISM).GT.0) 4383 & CALL PAMTMT(WORK(KCBIO-1+IOFF),WORK(KLT-1+IOFF), 4384 & WORK(KLSCR),NTOOBS(ISM)) 4385 END DO 4386* 4387 IF(NTEST.GE.100) THEN 4388 WRITE(6,*) ' The T-matrix for the orbital trans ' 4389 CALL APRBLM2(WORK(KLT),NTOOBS,NTOOBS,NSMOB,0) 4390 END IF 4391*. LUCIA will use space for one-electron integrals for orbital transformation. 4392*. save a copy of original KINT1 4393 LEN_1F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 4394 CALL MEMMAN(KLINT1_ORIG,LEN_1F,'ADDL ',2,'INT1_O') 4395 CALL COPVEC(WORK(KINT1),WORK(KLINT1_ORIG),LEN_1F) 4396*. Default block size 4397 LCSBLK_L = LCSBLK 4398 IF(LCSBLK_L.LE.0) THEN 4399 WRITE(6,*) ' SIGMA_CONF will define length of batch ' 4400 LCSBLK_DEFAULT = 2000000 4401*. Compare with dimension of largest single configuration 4402 LCONF_MAX = IMNMX(NPCSCNF,MAXOP+1,2) 4403 IF(LCONF_MAX.GT.LCSBLK_DEFAULT) LCSBLK_DEFAULT = LCONF_MAX 4404 LCSBLK_L = LCSBLK_DEFAULT 4405 END IF 4406 IF(NTEST.GE.100) THEN 4407 WRITE(6,*) ' LCSBLK_L = ', LCSBLK_L 4408 END IF 4409* 4410 ICSPC_CN_SAVE = ICSPC_CN 4411 ISSPC_CN_SAVE = ISSPC_CN 4412* 4413*. Now do the transformation for each orbital 4414* 4415 4416 DO IORB = 1, N_ORB_CONF 4417*. We are looping over orbitals in the configurations, i.e. 4418*. in type-order 4419 IIORB = IB_ORB_CONF -1 + IORB 4420 IIORB_SO = IREOTS(IIORB) 4421 IF(NTEST.GE.1000) THEN 4422 WRITE(6,'(A,I2,I3) ') 4423 & ' >>>> Info for orb. transformation for orbital', 4424 & IORB 4425 END IF 4426 IF(NTEST.GE.100) THEN 4427 WRITE(6,*) ' IORB, IIORB,IIORB_SO = ', 4428 & IORB, IIORB,IIORB_SO 4429 END IF 4430* For each orbital I we will calculate 4431*( 1+ \hat T(I) + 1/2\hat T(I)^2)) TII^\hat N_I C(I-1), 4432* where C(I-1) is result of all previous transformations. 4433*. We will collect the contributions for each orb in KLCSFVC 4434*. At start we have the transformed operator so far in C 4435* 4436* Prepare for transforming orbital IORB 4437* 4438*. Place (T(P,I)/S(I,I) in one-electron integral list 4439C T_ROW_TO_H(T,H,K) 4440 CALL T_ROW_TO_H(WORK(KLT),WORK(KINT1),IIORB_SO,TII) 4441*. T_{II}^Ni C in ICSPC_CN, save in C 4442C T_TO_NK_T_VEC_CONF(T,K,VEC,ISPC,ISYM) 4443 CALL T_TO_NK_T_VEC_CONF(TII,IORB,C,ICSPC_CN,ICSM) 4444* 4445 ICSPC_CN = IORBTRA_SPC_IN(IORB) 4446 ISSPC_CN = IORBTRA_SPC_OUT(IORB) 4447 NCSF_C = NCSF_PER_SYM_GN(ICSM,ICSPC_CN) 4448 NCSF_S = NCSF_PER_SYM_GN(ISSM,ISSPC_CN) 4449 NCSF_CS = MAX(NCSF_S,NCSF_C) 4450*. A scratch CSF vector 4451 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'TRACNI') 4452 CALL MEMMAN(KLCSFVC,NCSF_MNMX_MAX,'ADDL ',2,'CSFVC ') 4453*. Loop over the two operators needed for each orbitaltransf 4454 DO IPOT = 1, 2 4455 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'TRACNI') 4456* The input (C) and output spaces 4457 IF(IPOT.EQ.1) THEN 4458 ICSPC_CN = IORBTRA_SPC_IN(IORB) 4459 ISSPC_CN = IORBTRA_SPC_OUT(IORB) 4460 ELSE 4461 ICSPC_CN = IORBTRA_SPC_OUT(IORB) 4462 ISSPC_CN = IORBTRA_SPC_OUT(IORB) 4463 END IF 4464 IF(NTEST.GE.100) 4465 & WRITE(6,*) ' ICSPC_CN, ISSPC_CN = ', ICSPC_CN, ISSPC_CN 4466 IF(IPOT.EQ.1) THEN 4467*. Expand TII^\hat N_I C(I-1) in CSFVC 4468C REF_CNFVEC(VECIN,ISPCIN,VECOUT,ISPCOUT,ISYM) 4469 CALL REF_CNFVEC(C,ICSPC_CN,WORK(KLCSFVC),ISSPC_CN,ICSM) 4470 END IF 4471* 4472 NCONF_C = NCONF_PER_SYM_GN(ICSM,ICSPC_CN) 4473 NSD_C = NSD_PER_SYM_GN(ICSM,ICSPC_CN) 4474 NCSF_C = NCSF_PER_SYM_GN(ICSM,ICSPC_CN) 4475* 4476 NCONF_S = NCONF_PER_SYM_GN(ISSM,ISSPC_CN) 4477 NSD_S = NSD_PER_SYM_GN(ISSM,ISSPC_CN) 4478 NCSF_S = NCSF_PER_SYM_GN(ISSM,ISSPC_CN) 4479* 4480 NCONF_MAX = MAX(NCONF_C,NCONF_S) 4481* 4482 IF(NTEST.GE.1000) THEN 4483 WRITE(6,'(A,3I8)') 4484 & ' Number of confs, SDs and CSFs for C ', 4485 & NCONF_C, NSD_C, NCSF_C 4486 WRITE(6,'(A,3I8)') 4487 & ' Number of confs, SDs and CSFs for S ', 4488 & NCONF_S, NSD_S, NCSF_S 4489 END IF 4490* 4491* 4492*. If ICISTR = 1, vectors are stored in one batch, so 4493 IF(ICISTR.EQ.1) LCSBLK_L = MAX(NCSF_C,NCSF_S) 4494 IF(NTEST.GE.100) WRITE(6,*) ' Size of batch ', LCSBLK_L 4495*. Batches of C 4496*. ============== 4497*. One could here either use CSF's or SD's. As memory maybe the defining parameter, 4498* I opt for CSF's and will then expand/contract each configuration when needed. 4499*. Length of each configuration 4500 CALL MEMMAN(KLLCNFEXP,NCONF_MAX,'ADDL ',1,'LCNFEX') 4501*. For C 4502C CONF_EXP_LEN_LIST(ILEN,NCONF_PER_OPEN,NELMNT_PER_OPEN,MAXOP) 4503 CALL CONF_EXP_LEN_LIST(WORK(KLLCNFEXP), 4504 & NCONF_PER_OPEN_GN(1,ICSM,ICSPC_CN),NPCSCNF,MAXOP) 4505C PART_VEC(LBLK,NBLK,MAXSTR,LBAT,NBAT,IONLY_NBAT) 4506 CALL PART_VEC(WORK(KLLCNFEXP),NCONF_C,LCSBLK_L,IDUM,NBAT_C,1) 4507 CALL MEMMAN(KLLBAT_C,NBAT_C,'ADDL ',1,'LBAT_C') 4508 CALL PART_VEC(WORK(KLLCNFEXP),NCONF_C,LCSBLK_L,WORK(KLLBAT_C), 4509 & NBAT_C,0) 4510*. And for Sigma 4511C CONF_EXP_LEN_LIST(ILEN,NCONF_PER_OPEN,NELMNT_PER_OPEN,MAXOP) 4512 CALL CONF_EXP_LEN_LIST(WORK(KLLCNFEXP), 4513 & NCONF_PER_OPEN_GN(1,ISSM,ISSPC_CN),NPCSCNF,MAXOP) 4514C PART_VEC(LBLK,NBLK,MAXSTR,LBAT,NBAT,IONLY_NBAT) 4515 CALL PART_VEC(WORK(KLLCNFEXP),NCONF_S,LCSBLK_L,IDUM,NBAT_S,1) 4516 CALL MEMMAN(KLLBAT_S,NBAT_S,'ADDL ',1,'LBAT_S') 4517 CALL PART_VEC(WORK(KLLCNFEXP),NCONF_S,LCSBLK_L,WORK(KLLBAT_S), 4518 & NBAT_S,0) 4519* 4520 IF(NTEST.GE.1000) THEN 4521 WRITE(6,*) ' Number of batches for C and S ', NBAT_C, NBAT_S 4522 END IF 4523*. Largest number of configurations in a given batch 4524 MAX_CONF_BATCH_C = IMNMX(WORK(KLLBAT_C),NBAT_C,2) 4525 MAX_CONF_BATCH_S = IMNMX(WORK(KLLBAT_S),NBAT_S,2) 4526 MAX_CONF_BATCH = MAX(MAX_CONF_BATCH_C,MAX_CONF_BATCH_S) 4527* 4528 IF(NTEST.GE.1000) 4529 & WRITE(6,*) ' Largest number of configs in batch ', 4530 & MAX_CONF_BATCH 4531 CALL MEMMAN(KLLBLK_BAT_C,MAX_CONF_BATCH ,'ADDL ',2,'LBLBTC') 4532 CALL MEMMAN(KLLBLK_BAT_S,MAX_CONF_BATCH ,'ADDL ',2,'LBLBTS') 4533*. Two vectors for holding expansion in SD of given config 4534 LEN_SD_CONF_MAX = IMNMX(NPDTCNF,MAXOP+1,2) 4535 CALL MEMMAN(KLCONF_SD_C,LEN_SD_CONF_MAX,'ADDL ',2,'CN_SDC') 4536 CALL MEMMAN(KLCONF_SD_S,LEN_SD_CONF_MAX,'ADDL ',2,'CN_SDS') 4537*. Scratch space in routine for evuluating H for configurations (allowing combs) 4538*. Scratch: Length: INTEGER: (NDET_C + NDET_S)*N_EL_CONF + NDET_C + 6*NORB 4539 L_CNHCN = LEN_SD_CONF_MAX*(1+2*N_EL_CONF) + 6*N_ORB_CONF 4540 CALL MEMMAN(KL_CNHCN, L_CNHCN,'ADDL ',1,'LCNHCN') 4541*. Space for two integers arrays for signs 4542 CALL MEMMAN(KLISIGNC,LEN_SD_CONF_MAX,'ADDL ',1,'ISIGNC') 4543 CALL MEMMAN(KLISIGNS,LEN_SD_CONF_MAX,'ADDL ',1,'ISIGNS') 4544* 4545 ZERO = 0.0D0 4546 CALL SETVEC(S,ZERO,NCSF_S) 4547* 4548 IADOB = IB_ORB_CONF - 1 4549 CALL MEMCHK2('BETRAC') 4550 IF(IPOT.EQ.1) THEN 4551 XXNORM = INPROD(C,C,NCSF_C) 4552 WRITE(6,*) ' Norm**2 C(ini) = ', XXNORM 4553 END IF 4554 CALL TRACI_CONF_SLAVE(C,S,LUC,LUHC,ICISTR, 4555 & NCONF_PER_OPEN_GN(1,ICSM,ICSPC_CN), 4556 & NCONF_PER_OPEN_GN(1,ISSM,ISSPC_CN), 4557 & NBAT_C,WORK(KLLBAT_C), 4558 & NBAT_S,WORK(KLLBAT_S), 4559 & WORK(KLLBLK_BAT_C),WORK(KLLBLK_BAT_S), 4560 & WORK(KLCONF_SD_C),WORK(KLCONF_SD_S), 4561 & IADOB,WORK(KDFTP),WORK(KL_CNHCN), 4562 & WORK(KLISIGNC),WORK(KLISIGNS),IORB) 4563 CALL MEMCHK2('AFTRAC') 4564* 4565*. And copy output to input for next round.. 4566* 4567 ONE = 1.0D0 4568 IF(IPOT.EQ.1) THEN 4569*. Collecting (1 + T ) !C(K-1)> in KLCSFVC 4570 FACTOR = 1.0D0 4571 CALL VECSUM(WORK(KLCSFVC),WORK(KLCSFVC),S,ONE,FACTOR,NCSF_S) 4572 XXNORM = INPROD(WORK(KLCSFVC),WORK(KLCSFVC),NCSF_S) 4573 WRITE(6,*) ' Norm**2 (1+T)!Prev> = ', XXNORM 4574CD IF(NTEST.GE.1000) THEN 4575CD WRITE(6,*) ' Fusk Updated Sigma vector (1+T)!Prev> ' 4576CD WRITE(6,*) ' Fusk Updated Sigma vector (1+T)!Prev> ' 4577CD CALL CSDTVC_CONFSPACE(NCONF_S,WORK(KLCSFVC), 4578CD & FUSK,ISSM,ISSPC_CN,1) 4579CD END IF 4580*. And prepare for next op 4581 CALL COPVEC(S,C,NCSF_S) 4582 ELSE 4583*. Collecting (1 + T + 1/2T^2) !C(K-1)> in KLCSFVC 4584 FACTOR = 0.5D0 4585 ONE = 1.0D0 4586 CALL VECSUM(WORK(KLCSFVC),WORK(KLCSFVC),S,ONE,FACTOR,NCSF_S) 4587 CALL COPVEC(WORK(KLCSFVC),C,NCSF_S) 4588 CALL COPVEC(WORK(KLCSFVC),S,NCSF_S) 4589 XXNORM = INPROD(WORK(KLCSFVC),WORK(KLCSFVC),NCSF_S) 4590 WRITE(6,*) ' Norm**2 (1+T+1/2 T^2)!Prev> = ', XXNORM 4591* 4592CD WRITE(6,*) ' Fusk, (1 + T + 1/2T^2) !C(K-1)> SD basis ' 4593CD WRITE(6,*) ' Fusk, (1 + T + 1/2T^2) !C(K-1)> SD basis ' 4594CD CALL CSDTVC_CONFSPACE(NCONF_S,S,FUSK,ISSM,ISSPC_CN,1) 4595 END IF 4596 CALL MEMCHK2('AFTSUM') 4597* 4598* 4599 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'TRACNI') 4600 END DO !End of loop over the two powers of the operator 4601* 4602 IF(NTEST.GE.1000) THEN 4603 WRITE(6,*) ' Updated TRACI vector after a orbtrans' 4604 CALL WRTMAT(S,1,NCSF_S,1,NCSF_S) 4605 END IF 4606 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'TRACNI') 4607 END DO ! Loop over orbitals to be transformed 4608*. and restors defs 4609 ICSPC_CN = ICSPC_CN_SAVE 4610 ISSPC_CN = ISSPC_CN_SAVE 4611 CALL COPVEC(WORK(KLINT1_ORIG),WORK(KINT1),LEN_1F) 4612* 4613 IF(NTEST.GE.10000) THEN 4614 WRITE(6,*) ' Final PAM transformed CI vector ' 4615 WRITE(6,*) ' ================================' 4616 NCSF_S = NCSF_PER_SYM_GN(ISSM,ISSPC_CN) 4617 CALL WRTMAT(S,1,NCSF_S,1,NCSF_S) 4618 END IF 4619* 4620 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'TRACNF') 4621 CALL LUCIAQEXIT('TRACNF') 4622 RETURN 4623 END 4624 SUBROUTINE TRACI_CONF_SLAVE(C,S,LUC,LUS,ICISTR, 4625 & NCONF_PER_OPEN_C,NCONF_PER_OPEN_S, 4626 & NBAT_C,LBAT_C,NBAT_S,LBAT_S, 4627 & LBLK_BAT_C,LBLK_BAT_S, 4628 & CONF_SD_C,CONF_SD_S,IADOB,IPRODT, 4629 & ISCR_CNHCN,ISIGN_C,ISIGN_S,IORB) 4630* 4631* Inner (aka slave) routine for orbital transformation in configuration based methods 4632* 4633* Transform Orbital IORB 4634* 4635*. Jeppe Olsen,July 2011 4636* 4637 INCLUDE 'implicit.inc' 4638 INCLUDE 'mxpdim.inc' 4639 INCLUDE 'spinfo.inc' 4640 INCLUDE 'cands.inc' 4641 INCLUDE 'cecore.inc' 4642*. Input 4643*. C-vector or space for batch of C-vector 4644 DIMENSION C(*) 4645*. Info on the two configuration expansions 4646 INTEGER NCONF_PER_OPEN_C(*), NCONF_PER_OPEN_S(*) 4647*. Number of blocks in the batches of C and S 4648 INTEGER LBAT_C(*), LBAT_S(*) 4649*. Scratch for Info on batches of C and S: Length of each block (configuration in batch) 4650 INTEGER LBLK_BAT_C(*),LBLK_BAT_S(*) 4651*. Space for SD expansion of single configurations 4652 DIMENSION CONF_SD_C(*), CONF_SD_S(*) 4653*. Space for signs for phase change for dets of a configurations 4654 INTEGER ISIGN_C(*),ISIGN_S(*) 4655*. CSF info: proto type dets 4656 INTEGER IPRODT(*) 4657 4658*. Output 4659 DIMENSION S(*) 4660*. Scratch transferred through to CNHCN 4661 INTEGER ISCR_CNHCN 4662*. Local scratch 4663 INTEGER IOCC_C(MXPORB),IOCC_S(MXPORB) 4664* 4665*. TEMP SCRATCH 4666 DIMENSION SFUSK(2000), SFUSK2(2000) 4667* 4668 NTEST = 0010 4669 IF(NTEST.GE.10) THEN 4670 WRITE(6,*) ' Output from TRACI_CONF_SLAVE ' 4671 WRITE(6,*) ' =============================' 4672 WRITE(6,*) 4673 WRITE(6,*) ' ICISTR = ', ICISTR 4674 WRITE(6,'(A,I4)') ' IORB = ', IORB 4675 END IF 4676* 4677 IDUM = 0 4678 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'TRACNI') 4679*. Initialization of some parameters for controlling loop over configurations 4680 IOPEN_S = 0 4681 INUM_OPS = 0 4682 IOPEN_C = 0 4683 INUM_OPC = 0 4684 IB_CSF_C = 1 4685 IB_CSF_S = 1 4686* 4687 CALL MEMCHK2('INISIG') 4688* 4689*. Loop over batches of S 4690 INI_S = 1 4691C? WRITE(6,*) ' NBAT_S = ', NBAT_S 4692 DO IBAT_S = 1, NBAT_S 4693 IF(NTEST.GE.1000) 4694 & WRITE(6,'(A,I3)') ' >>> Start of sigma batch ', IBAT_S 4695* 4696 IF(IBAT_S.EQ.1) THEN 4697 IB_CONF_S = 1 4698 IB_CSF_S = 1 4699 ELSE 4700 IB_CONF_S = IB_CONF_S + LBAT_S(IBAT_S-1) 4701 END IF 4702C? WRITE(6,*) ' LBAT_S(1) = ', LBAT_S(1) 4703 N_CONF_S = LBAT_S(IBAT_S) 4704*. Number of CSF's per config in S-batch 4705C GET_LBLK_CONF_BATCH(ICNF_INI,NCNF,LBLK_BAT,ISYM,ISPC, 4706C & NSD_BAT_TOT,NCSF_BAT_TOT) 4707 CALL GET_LBLK_CONF_BATCH(IB_CONF_S,N_CONF_S,LBLK_BAT_S,ISSM, 4708 & ISSPC_CN,NSD_BAT_TOT_S,NCSF_BAT_TOT_S) 4709 CALL MEMCHK2('AFGTL1') 4710 IF(NTEST.GE.100) THEN 4711 WRITE(6,'(A,2I9)') 4712 & ' Number of CSFs and SDs in S-batch ', NCSF_BAT_TOT_S, 4713 & NSD_BAT_TOT_S 4714 END IF 4715*. Initialize sigma batch 4716 ZERO = 0.0D0 4717C? WRITE(6,*) ' IB_CSF_S, NCSF_BAT_TOT_S = ', 4718C? & IB_CSF_S, NCSF_BAT_TOT_S 4719 CALL SETVEC(S(IB_CSF_S),ZERO,NCSF_BAT_TOT_S) 4720*. Loop over batches of C 4721 IF(ICISTR.NE.1) REWIND LUS 4722 INI_C = 1 4723*. First time in this batch 4724 ISBAT_FIRST_TIME =1 4725 DO IBAT_C = 1, NBAT_C 4726 IF(NTEST.GE.1000) 4727 & WRITE(6,'(A,I3)') ' >>> Start of C batch ', IBAT_C 4728 CALL MEMCHK2('STCBAT') 4729 IF(IBAT_C.EQ.1) THEN 4730 IB_CONF_C = 1 4731 IB_CSF_C = 1 4732 ELSE 4733 IB_CONF_C = IB_CONF_C + LBAT_C(IBAT_C-1) 4734 END IF 4735 N_CONF_C = LBAT_C(IBAT_C) 4736*. Number of configs per config in S-batch 4737 CALL GET_LBLK_CONF_BATCH(IB_CONF_C,N_CONF_C,LBLK_BAT_C,ICSM, 4738 & ICSPC_CN,NSD_BAT_TOT_C,NCSF_BAT_TOT_C) 4739 IF(NTEST.GE.100) THEN 4740 WRITE(6,'(A,2I9)') 4741 & ' Number of CSFs and SDs in C-batch ', NCSF_BAT_TOT_C, 4742 & NSD_BAT_TOT_C 4743 END IF 4744 CALL MEMCHK2('AFGTLB') 4745*. Read, if required, next batch of C- Each configuration stored in a record by itself 4746 IF(ICISTR.NE.1) THEN 4747 CALL FRMDSCN(C,N_CONF_C,-1,LUC) 4748C FRMDSCN(VEC,NREC,LBLK,LU) 4749 END IF 4750*. And then to the configurations of the C and sigma 4751*. First time in this batch 4752 IF(ISBAT_FIRST_TIME.EQ.1) THEN 4753* Save pointers to start of configuration 4754 IOPEN_S_SAVE = IOPEN_S 4755 INUM_OPS_SAVE = INUM_OPS 4756 IB_CSF_S_SAVE = IB_CSF_S 4757 ELSE 4758 IOPEN_S = IOPEN_S_SAVE 4759 INUM_OPS = INUM_OPS 4760 IB_CSF_S = IB_CSF_S_SAVE 4761 END IF 4762 ISBAT_FIRST_TIME = 0 4763* 4764 ICBAT_FIRST_TIME =1 4765 DO ICONF_S = IB_CONF_S, IB_CONF_S + N_CONF_S -1 4766*. Obtain occupation in IOCC_S and iopen for this sigma-configuration 4767C NEXT_CONF_IN_CONFSPC(IOCC,IOPEN,INUM_OP,INI,ISYM,ISPC,NEW) 4768 CALL NEXT_CONF_IN_CONFSPC(IOCC_S,IOPEN_S,INUM_OPS,INI_S, 4769 & ISSM,ISSPC_CN,NEW_S) 4770 INI_S = 0 4771 IOCOB_S = (IOPEN_S + N_EL_CONF)/2 4772*. Signs for going between configuration and interaction order of dets 4773C SIGN_CONF_SD(ICONF,NOB_CONF,IOP,ISGN,IPDET_LIST,ISCR) 4774 CALL SIGN_CONF_SD(IOCC_S,IOCOB_S,IOPEN_S,ISIGN_S,IPRODT, 4775 & ISCR_CNHCN) 4776 CALL MEMCHK2('AFSIGN') 4777* 4778 NCSF_S = NPCSCNF(IOPEN_S+1) 4779 NSD_S = NPDTCNF(IOPEN_S+1) 4780C? IF(NSD_S.EQ.6) THEN 4781C? WRITE(6,*) ' Fusk NTEST increased ' 4782C? WRITE(6,*) ' Fusk NTEST increased ' 4783C? WRITE(6,*) ' Fusk NTEST increased ' 4784C? NTEST = 10000 4785C? END IF 4786* 4787 IF(NTEST.GE.100) THEN 4788 WRITE(6,*) ' Sigma configuration number ', ICONF_S 4789 CALL IWRTMA(IOCC_S,1,IOCOB_S,1,IOCOB_S) 4790 END IF 4791* 4792 ZERO = 0.0D0 4793*. The contribution to a given sigma conf from all C-conf in C-batch 4794* will be stored in CONF_SD_S(1) 4795 CALL SETVEC(CONF_SD_S,ZERO,NSD_S) 4796* 4797 IF( ICBAT_FIRST_TIME .EQ. 1) THEN 4798 IOPEN_C_SAVE = IOPEN_C 4799 INUM_OPC_SAVE = INUM_OPC 4800 IB_CSF_C_SAVE = IB_CSF_C 4801 ELSE 4802 IOPEN_C = IOPEN_C_SAVE 4803 INUM_OPC = INUM_OPC_SAVE 4804 IB_CSF_C = IB_CSF_C_SAVE 4805 END IF 4806 ICBAT_FIRST_TIME = 0 4807 DO ICONF_C = IB_CONF_C, IB_CONF_C + N_CONF_C -1 4808 IF(NTEST.GE.1000) THEN 4809 WRITE(6,*) ' ICONF_C, ICONF_S: ', ICONF_C, ICONF_S 4810 END IF 4811*. Obtain occupation in IOCC_C and iopen for this C-configuration 4812C NEXT_CONF_IN_CONFSPC(IOCC,IOPEN,INUM_OP,INI,ISYM,ISPC,NEW) 4813 CALL NEXT_CONF_IN_CONFSPC(IOCC_C,IOPEN_C,INUM_OPC,INI_C, 4814 & ICSM,ICSPC_CN,NEW_C) 4815*. Signs for going between configuration and interaction order of dets 4816C SIGN_CONF_SD(ICONF,NOB_CONF,IOP,ISGN,IPDET_LIST,ISCR) 4817 IOCOB_C = (IOPEN_C + N_EL_CONF)/2 4818 CALL SIGN_CONF_SD(IOCC_C,IOCOB_C,IOPEN_C,ISIGN_C,IPRODT, 4819 & ISCR_CNHCN) 4820 INI_C = 0 4821 IF(NTEST.GE.1000) THEN 4822 WRITE(6,*) ' C configuration number ', ICONF_C 4823 IOCOB_C = (IOPEN_C + N_EL_CONF)/2 4824 CALL IWRTMA(IOCC_C,1,IOCOB_C,1,IOCOB_C) 4825 END IF 4826*. Expand coefficients for configuration from CSF to SD basis 4827 NCSF_C = NPCSCNF(IOPEN_C+1) 4828 NSD_C = NPDTCNF(IOPEN_C+1) 4829C CSDTVC_CONF(C_SD,C_CSF,NOPEN,ISIGN,IAC,IWAY) 4830 CALL CSDTVC_CONF(CONF_SD_C,C(IB_CSF_C),IOPEN_C,ISIGN_C,2,1) 4831 IF(NTEST.GE.1000) THEN 4832 WRITE(6,*) ' C(ICONF_C) in SD' 4833 CALL WRTMAT(CONF_SD_C,1,NSD_C,1,NSD_C) 4834 END IF 4835 IF(NTEST.GE.1000) THEN 4836 WRITE(6,'(A,2I6)') 4837 & ' Info on sigma for ICONF_C, ICONF_S = ', 4838 & ICONF_C, ICONF_S 4839 END IF 4840*. Update: S(I) = S(I) + Sum(J) sum p <I!a+_(P,IAB)a_(IORB,IAB)!J> C(J) 4841 I12OP = 1 4842 I_DO_ORBTRA = 1 4843*. As want to add S(I), we set a local core-energy to one 4844 ECORE_L = 0.0D0 4845C CNHCN_LUCIA(ICNL,IOPL,ICNR,IOPR,CNHCNM,SIGMA, 4846C & IADOB,IPRODT,I12OP,IORBTRA,ECORE,ISCR) 4847 CALL CNHCN_LUCIA(IOCC_S,IOPEN_S,IOCC_C,IOPEN_C, 4848 & CONF_SD_C,XDUM,CONF_SD_S,IADOB, 4849 & IPRODT,I12OP, I_DO_ORBTRA, IORB, ECORE_L,2, 4850 & 0,RJ,RK,ISCR_CNHCN) 4851*. Update address of C in action 4852 IB_CSF_C = IB_CSF_C + NCSF_C 4853 IF(NTEST.GE.1000) THEN 4854 WRITE(6,*) ' Updated Sigma(ICONF_S) in SD' 4855 CALL WRTMAT(CONF_SD_S,1,NSD_S,1,NSD_S) 4856 END IF 4857 END DO ! over configs in batch of C 4858*. And transform sigma part to CSF and update sigma vector 4859 CALL CSDTVC_CONF(CONF_SD_S,S(IB_CSF_S),IOPEN_S,ISIGN_S,1,2) 4860 IB_CSF_S = IB_CSF_S + NCSF_S 4861 END DO ! over configs in batch of S 4862 END DO ! Over batches of C 4863 END DO ! over batches of Sigma 4864* 4865*. Test transformation back to CSF 4866* 4867C? WRITE(6,*) ' FUSK: back transf to SD basis at end of TRACI..' 4868* 4869C? INI_S = 1 4870C? IB_CSF = 1 4871C? IB_SD = 1 4872C? N_CONF_S = LBAT_S(1) 4873C? DO ICONF_S = 1, N_CONF_S 4874C? CALL NEXT_CONF_IN_CONFSPC(IOCC_S,IOPEN_S,INUM_OPS,INI_S, 4875C? & ISSM,ISSPC_CN,NEW_S) 4876C? INI_S = 0 4877C? IOCOB_S = (IOPEN_S + N_EL_CONF)/2 4878*. Signs for going between configuration and interaction order of dets 4879C? CALL SIGN_CONF_SD(IOCC_S,IOCOB_S,IOPEN_S,ISIGN_S,IPRODT, 4880C? & ISCR_CNHCN) 4881C? NCSF_S = NPCSCNF(IOPEN_S+1) 4882C? NSD_S = NPDTCNF(IOPEN_S+1) 4883C? CALL CSDTVC_CONF(SFUSK(IB_SD),S(IB_CSF),IOPEN_S,ISIGN_S,2,1) 4884C? IB_CSF = IB_CSF + NCSF_S 4885C? IB_SD = IB_SD + NSD_S 4886C? END DO 4887C? WRITE(6,*) ' Resulting vector transformed to SD''s ' 4888C? NSD_TOT = IB_SD - 1 4889C? CALL WRTMAT(SFUSK,1,NSD_TOT,1,NSD_TOT) 4890* 4891 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'TRACNI') 4892 IF(NTEST.GE.10) WRITE(6,*) ' Returning from TRACI_CONF_SLAVE ' 4893 RETURN 4894 END 4895 SUBROUTINE REF_CNFVEC(VECIN,ISPCIN,VECOUT,ISPCOUT,ISYM) 4896* 4897* A vector VECIN is given in configuration space IVECIN. 4898* Obtain corresponding vector in configuratin space ISPCOUT 4899* Terms that are in ISPCIN, but not in ISPCOUT are eliminated 4900* Terms that are in ISPCOUT, but not in ISPCIN are set to 0 4901* 4902* 4903*. Jeppe Olsen, July 17, 2011 4904* 4905 INCLUDE 'implicit.inc' 4906 INCLUDE 'mxpdim.inc' 4907 INCLUDE 'spinfo.inc' 4908 INCLUDE 'wrkspc-static.inc' 4909 INCLUDE 'vb.inc' 4910*. Input 4911 DIMENSION VECIN(*) 4912*. Output 4913 DIMENSION VECOUT(*) 4914*. Local scratch 4915 DIMENSION IOCC(MXPORB), IOCC2(MXPORB), IOCC3(MXPORB) 4916* 4917 NTEST = 000 4918 IF(NTEST.GE.100) THEN 4919 WRITE(6,*) ' Output from REF_CNFVEC ' 4920 WRITE(6,*) ' =======================' 4921 WRITE(6,*) 4922 WRITE(6,'(A,2I5)') ' In- and Out-spaces: ', ISPCIN,ISPCOUT 4923 WRITE(6,*) ' ISYM = ', ISYM 4924 END IF 4925* 4926 NCSF_IN = NCSF_PER_SYM_GN(ISYM,ISPCIN) 4927 NCSF_OUT = NCSF_PER_SYM_GN(ISYM,ISPCOUT) 4928 IF(NTEST.GE.100) THEN 4929 WRITE(6,*) ' NCSF_IN, NCSF_OUT = ', NCSF_IN, NCSF_OUT 4930 END IF 4931 ZERO = 0.0D0 4932 CALL SETVEC(VECOUT,ZERO,NCSF_OUT) 4933* 4934 INI = 1 4935 IB_IN = 1 4936 NEW = 1 4937 DO IOPEN = 0, MAXOP 4938 NCSF_PT = NPCSCNF(IOPEN+1) 4939 NCNF_OPEN_IN = NCONF_PER_OPEN_GN(IOPEN+1,ISYM,ISPCIN) 4940 NOCOBL = (IOPEN+N_EL_CONF)/2 4941*. First configuration in out space with given number of open orbs and sym 4942 IF_OPEN_OUT = IB_CONF_REO_GN(IOPEN+1,ISYM,ISPCOUT) 4943*. Offset in CSF vector to first elements with given sym and number of orbs 4944 IB_OPEN_OUT = IB_OPEN_CSF(IOPEN+1,ISYM,ISPCOUT) 4945 DO ICNF = 1, NCNF_OPEN_IN 4946*. Obtain occupation of configuration 4947C NEXT_CONF_IN_CONFSPC(IOCC,IOPEN,INUM_OP,INI,ISYM,ISPC,NEW) 4948 CALL NEXT_CONF_IN_CONFSPC(IOCC,IOPENX,INUM_OP_IN,INI,ISYM, 4949 & ISPCIN,NEW) 4950 IF(NTEST.GE.1000) THEN 4951 WRITE(6,*) ' Next config from NEXT_CONF.... ' 4952 NOCOBL = (N_EL_CONF + IOPEN)/2 4953 CALL IWRTMA(IOCC,1,NOCOBL,1,NOCOBL) 4954 END IF 4955 INI = 0 4956*.Is IOCC in output space? 4957* Reform from compact to occ number form 4958C REFORM_CONF_OCC2(ICONF_EXP,ICONF_PACK,NORBL,NOCOBL,IWAY) 4959 CALL REFORM_CONF_OCC2(IOCC2,IOCC,N_ORB_CONF,NOCOBL,2) 4960*.occ number to accumulated 4961C REFORM_CONF_ACCOCC(IACOCC,IOCC,IWAY,NORB) 4962 CALL REFORM_CONF_ACCOCC(IOCC3,IOCC2,2,N_ORB_CONF) 4963 IF(NTEST.GE.1000) THEN 4964 WRITE(6,*) ' Next configuration in accumulated form ' 4965 CALL IWRTMA(IOCC3,1,N_ORB_CONF,1,N_ORB_CONF) 4966 END IF 4967*. Check to see if configuration is within bounds 4968 IN_OUT = IS_IACC_CONF_IN_MINMAX_SPC(IOCC3, 4969 & IOCC_MIN_GN(1,ISPCOUT),IOCC_MAX_GN(1,ISPCOUT), 4970 & N_ORB_CONF) 4971 IF(IN_OUT.EQ.1) THEN 4972*. Find number of this configuration 4973C ILEX_FOR_CONF_G(ICONF,NOCC_ORB,ICONF_SPC,IDOREO) 4974 ILEX = ILEX_FOR_CONF_G(IOCC,NOCOBL,ISPCOUT,1) 4975 IB_OUT = IB_OPEN_OUT + (ILEX-IF_OPEN_OUT)*NCSF_PT 4976 CALL COPVEC(VECIN(IB_IN),VECOUT(IB_OUT),NCSF_PT) 4977 END IF ! conf was in out space 4978 IB_IN = IB_IN + NCSF_PT 4979 END DO ! End of loop over input configs with a given number of open orbs 4980 END DO ! End of loop over number of open orbitals 4981* 4982 IF(NTEST.GE.1000) THEN 4983 WRITE(6,*) ' Input and output vectors ' 4984 CALL WRTMAT(VECIN,1,NCSF_IN,1,NCSF_IN) 4985 WRITE(6,*) 4986 CALL WRTMAT(VECOUT,1,NCSF_OUT,1,NCSF_OUT) 4987 END IF 4988* 4989 RETURN 4990 END 4991 FUNCTION IS_IACC_CONF_IN_MINMAX_SPC(IOCC,MIN_OCC,MAX_OCC,NORB) 4992* 4993* An accumulated configuration IOCC is given. Check if this configuration 4994* in in space defined by MIN_OCC, MAX_OCC. 4995* Returns 1/0 as answer 4996* 4997*. Jeppe Olsen, July 2011 4998* 4999 INTEGER MIN_OCC(NORB),MAX_OCC(NORB) 5000 INTEGER IOCC(NORB) 5001* 5002 INBOUND = 1 5003 DO IORB = 1, NORB 5004 IF(MIN_OCC(IORB).GT.IOCC(IORB).OR. 5005 & IOCC(IORB).GT.MAX_OCC(IORB)) INBOUND = 0 5006 END DO 5007* 5008 IS_IACC_CONF_IN_MINMAX_SPC = INBOUND 5009* 5010 NTEST = 000 5011 IF(NTEST.GE.100) THEN 5012 WRITE(6,*) ' Configuration: ' 5013 CALL IWRTMA(IOCC,1,NORB,1,NORB) 5014 IF(INBOUND.EQ.1) THEN 5015 WRITE(6,*) ' Configuration is in space ' 5016 ELSE 5017 WRITE(6,*) ' Configuration is not in space ' 5018 END IF 5019 END IF 5020 IF(NTEST.GE.1000) THEN 5021 WRITE(6,*) ' Min Max space tested: ' 5022 CALL WRT_MINMAX_OCC(MIN_OCC,MAX_OCC,NORB) 5023 END IF 5024* 5025 RETURN 5026 END 5027 SUBROUTINE T_TO_NK_T_VEC_CONF(T,K,VEC,ISPC,ISYM) 5028* 5029* A vector VEC is given in CI space ISPC. 5030* Multiply with T^(\hat N_k), where \hat N_k is the 5031* number operator for orbital K 5032* 5033*. Jeppe Olsen, July 17, 2011 5034* 5035 INCLUDE 'implicit.inc' 5036 INCLUDE 'mxpdim.inc' 5037 INCLUDE 'spinfo.inc' 5038 INCLUDE 'wrkspc-static.inc' 5039 INCLUDE 'vb.inc' 5040*. Input and output 5041 DIMENSION VEC(*) 5042*. Local scratch 5043 INTEGER IOCC(MXPORB) 5044* 5045 NTEST = 00 5046 IF(NTEST.GE.100) THEN 5047 WRITE(6,*) ' Output from T_TO_NK_T_VEC_CONF ' 5048 WRITE(6,*) ' ===============================' 5049 WRITE(6,*) 5050 WRITE(6,'(A,I5)') ' Confspaces: ', ISPC 5051 WRITE(6,'(A,I3,2X,E13.7)') ' K and T ', K, T 5052 END IF 5053* 5054 IF(NTEST.GE.1000) THEN 5055 WRITE(6,*) ' Input vector to T_TO_NK_T_VEC_CONF ' 5056 NCSF = NCSF_PER_SYM_GN(ISYM,ISPC) 5057 CALL WRTMAT(VEC,1,NCSF,1,NCSF) 5058 END IF 5059* 5060 TT = T*T 5061* 5062 INI = 1 5063 IB = 1 5064 NEW = 1 5065 DO IOPEN = 0, MAXOP 5066 NCSF_PT = NPCSCNF(IOPEN+1) 5067 NCNF_FOR_IOPEN = NCONF_PER_OPEN_GN(IOPEN+1,ISYM,ISPC) 5068 NOCOBL = (IOPEN+N_EL_CONF)/2 5069 DO ICNF = 1, NCNF_FOR_IOPEN 5070*. Obtain occupation of next configuration 5071C NEXT_CONF_IN_CONFSPC(IOCC,IOPEN,INUM_OP,INI,ISYM,ISPC,NEW) 5072 CALL NEXT_CONF_IN_CONFSPC(IOCC,IOPENX,INUM_OP,INI,ISYM, 5073 & ISPC,NEW) 5074 INI = 0 5075* 5076 IF(NTEST.GE.1000) THEN 5077 WRITE(6,*) ' Next config from NEXT_CONF.... ' 5078 CALL IWRTMA(IOCC,1,NOCOBL,1,NOCOBL) 5079 END IF 5080* 5081*. Number of electrons in K 5082 NKOCC = 0 5083 DO IORB = 1, NOCOBL 5084 IF(IOCC(IORB).EQ.K) THEN 5085*. Singly occupied 5086 NKOCC = 1 5087 ELSE IF(IOCC(IORB).EQ.-K) THEN 5088*. Doubly occupied 5089 NKOCC = 2 5090 END IF 5091 END DO 5092* 5093 IF(NKOCC.EQ.1) THEN 5094 CALL SCALVE(VEC(IB),T,NCSF_PT) 5095 ELSE IF (NKOCC.EQ.2) THEN 5096 CALL SCALVE(VEC(IB),TT,NCSF_PT) 5097 END IF 5098* 5099 IB = IB + NCSF_PT 5100 END DO ! End of loop over input configs with a given number of open orbs 5101 END DO ! End of loop over number of open orbitals 5102* 5103 IF(NTEST.GE.100) THEN 5104 WRITE(6,*) ' Output vector from T_TO_NK_T_VEC_CONF ' 5105 NCSF = NCSF_PER_SYM_GN(ISYM,ISPC) 5106 CALL WRTMAT(VEC,1,NCSF,1,NCSF) 5107 END IF 5108* 5109 RETURN 5110 END 5111 SUBROUTINE GET_EXPMKS(EXPMKS,KAPPA_S, KAPPA_A,S,NOBPS,NSMOB) 5112* 5113* A symmetric and an antisymmetric kappa-matrix, KAPPA_S, KAPPA_A, 5114* respectively, are given for a orbital space, in complete form 5115* Obtain Exp (-Kappa_A S) Exp(-Kappa_S S) 5116* 5117* By varying the choice of NOBPS, the code can be used both for 5118* a complete and for a subspace matrix. 5119* 5120* Jeppe Olsen, July 19 in Santiago de COmpostela, 24 hours before talk 5121* (I decided on the plane to make a MCSCF program for the VB code ...) 5122* 5123 INCLUDE 'implicit.inc' 5124 INCLUDE 'mxpdim.inc' 5125 INCLUDE 'wrkspc-static.inc' 5126*. Input 5127 REAL*8 KAPPA_S(*), KAPPA_A(*), S(*) 5128 INTEGER NOBPS(NSMOB) 5129*. Output 5130 DIMENSION EXPMKS(*) 5131*. 5132 IDUM = 0 5133 CALL MEMMAN(IDUM,IDUM,'MARK ',2, 'GTEMKS') 5134* 5135 NTEST = 000 5136 IF(NTEST.GE.1000) THEN 5137 WRITE(6,*) ' Output from GET_EXPMKS ' 5138 WRITE(6,*) ' =======================' 5139 WRITE(6,*) 5140 WRITE(6,*) ' Input matrix KAPPA_A ' 5141 CALL APRBLM2(KAPPA_A,NOBPS,NOBPS,NSMOB,0) 5142 WRITE(6,*) ' Input matrix KAPPA_S ' 5143 CALL APRBLM2(KAPPA_S,NOBPS,NOBPS,NSMOB,0) 5144 END IF 5145* 5146* Exp (-Kappa_x S ) = S^(-1/2) Exp(-S^(1/2) Kappa_x S^1/2) S(-1/2) 5147*. Scratch: Should atleast be: 2* Dimension of matrix + 6 times largest block 5148* 5149*. Obtain S^1/2, S^-1/2 5150* 5151 LEN_1 = NDIM_1EL_MAT(1,NOBPS,NOBPS,NSMOB,0) 5152 CALL MEMMAN(KLSQRT,LEN_1,'ADDL ',2,'SQRT ') 5153 CALL MEMMAN(KLSQRTI,LEN_1,'ADDL ',2,'SQRTI ') 5154 CALL MEMMAN(KLMAT,LEN_1,'ADDL ',2,'MAT ') 5155 CALL MEMMAN(KLMAT2,LEN_1,'ADDL ',2,'MAT2 ') 5156 CALL MEMMAN(KLMAT3,LEN_1,'ADDL ',2,'MAT3 ') 5157 NOB_MAX = IMNMX(NOBPS,NSMOB,2) 5158 LSCR = 6*NOB_MAX**2 5159 CALL MEMMAN(KLSCR,LSCR,'ADDL ',2,'LSQRT ') 5160 CALL COPVEC(S,WORK(KLMAT),LEN_1) 5161C SQRT_BLMAT(A,NBLK,LBLK,ITASK,ASQRT,AMSQRT,SCR,ISYM) 5162 CALL SQRT_BLMAT(WORK(KLMAT),NSMOB,NOBPS,2, 5163 & WORK(KLSQRT),WORK(KLSQRTI),WORK(KLSCR),0) 5164* 5165* ========================================== 5166* Exp( S^1/2 Kappa A S^1/2) in WORK(KLMAT2) 5167* ========================================== 5168* 5169C TRAN_SYM_BLOC_MAT4(AIN,XL,XR,NBLOCK,LX_ROW,LX_COL,AOUT,SCR,ISYM) 5170 CALL TRAN_SYM_BLOC_MAT4(KAPPA_A,WORK(KLSQRT),WORK(KLSQRT), 5171 & NSMOB,NOBPS,NOBPS,WORK(KLMAT),WORK(KLSCR),0) 5172 IF(NTEST.GE.1000) THEN 5173 WRITE(6,*) ' The matrix S^1/2 Kappa A S^1/2 ' 5174 CALL APRBLM2(WORK(KLMAT),NOBPS,NOBPS,NSMOB,0) 5175 END IF 5176* Exp(S^1/2) Kappa A S^1/2) 5177 LSCR_EXP = 4*NOB_MAX**2 + 3*NOB_MAX 5178C? WRITE(6,*) ' LSCR_EXP, NOB_MAX = ', LSCR_EXP, NOB_MAX 5179 CALL MEMMAN(KLSCR_EXP,LSCR_EXP,'ADDL ',2,'SCR_EX') 5180 DO ISYM = 1, NSMOB 5181 IF(ISYM .EQ.1) THEN 5182 IOFF = 1 5183 ELSE 5184 IOFF = IOFF + NOBPS(ISYM-1)**2 5185 END IF 5186* Exp(S^1/2) Kappa A S^1/2) in KLMAT2 5187C EXPMA(EMA,A,NDIM,SCR,ISUB) 5188 CALL EXPMA(WORK(KLMAT2+IOFF-1),WORK(KLMAT+IOFF-1), 5189 & NOBPS(ISYM),WORK(KLSCR_EXP),0) 5190C? WRITE(6,*) ' After EXPMA ' 5191 END DO 5192 IF(NTEST.GE.1000) THEN 5193 WRITE(6,*) ' The matrix Exp( S^1/2 Kappa A S^1/2) ' 5194 CALL APRBLM2(WORK(KLMAT2),NOBPS,NOBPS,NSMOB,0) 5195 END IF 5196* 5197* =========================================== 5198* Exp( S^1/2 Kappa S S^1/2) in WORK(KLMAT3) 5199* =========================================== 5200* 5201C TRAN_SYM_BLOC_MAT4(AIN,XL,XR,NBLOCK,LX_ROW,LX_COL,AOUT,SCR,ISYM) 5202*. S^1/2 Kappa S S^1/2 in KLMAT 5203 CALL TRAN_SYM_BLOC_MAT4(KAPPA_S,WORK(KLSQRT),WORK(KLSQRT), 5204 & NSMOB,NOBPS,NOBPS,WORK(KLMAT),WORK(KLSCR),0) 5205C? WRITE(6,*) ' After TRAN_SYM_BLOC_MAT(2) ' 5206 IF(NTEST.GE.1000) THEN 5207 WRITE(6,*) ' The matrix S^1/2 Kappa S S^1/2 ' 5208 CALL APRBLM2(WORK(KLMAT),NOBPS,NOBPS,NSMOB,0) 5209 END IF 5210* 5211* Exp( S^1/2 Kappa S S^1/2) in KLMAT3 5212 DO ISYM = 1, NSMOB 5213 IF(ISYM .EQ.1) THEN 5214 IOFF = 1 5215 ELSE 5216 IOFF = IOFF + NOBPS(ISYM-1)**2 5217 END IF 5218C EXP_MAS(EMA,A,NDIM,SCR) 5219 CALL EXP_MAS(WORK(KLMAT3+IOFF-1),WORK(KLMAT+IOFF-1), 5220 & NOBPS(ISYM),WORK(KLSCR_EXP)) 5221C? WRITE(6,*) ' After EXP_MAS' 5222 END DO 5223* 5224 IF(NTEST.GE.100) THEN 5225 WRITE(6,*) ' The matrix Exp( S^1/2 Kappa S S^1/2) ' 5226 CALL APRBLM2(WORK(KLMAT3),NOBPS,NOBPS,NSMOB,0) 5227 END IF 5228* Exp( S^1/2) Kappa A S^1/2) Exp( S^1/2) Kappa S S^1/2) in KLMAT 5229C SUBROUTINE MULT_BLOC_MAT(C,A,B,NBLOCK,LCROW,LCCOL, 5230C & LAROW,LACOL,LBROW,LBCOL,ITRNSP) 5231 CALL MULT_BLOC_MAT(WORK(KLMAT),WORK(KLMAT2),WORK(KLMAT3), 5232 & NSMOB,NOBPS,NOBPS,NOBPS,NOBPS,NOBPS,NOBPS,0) 5233*. Premultipy with S^-1/2 and save on KLMAT3 5234 CALL MULT_BLOC_MAT(WORK(KLMAT3),WORK(KLSQRTI),WORK(KLMAT), 5235 & NSMOB,NOBPS,NOBPS,NOBPS,NOBPS,NOBPS,NOBPS,0) 5236*. Postmultiply with S^1/2 and save in EXPMKS 5237 CALL MULT_BLOC_MAT(EXPMKS,WORK(KLMAT3),WORK(KLSQRT), 5238 & NSMOB,NOBPS,NOBPS,NOBPS,NOBPS,NOBPS,NOBPS,0) 5239* 5240 IF(NTEST.GE.100) THEN 5241 WRITE(6,*) ' Matrix Exp(-K_A S) Exp(-K_S S) ' 5242 WRITE(6,*) ' ===============================' 5243 WRITE(6,*) 5244 CALL APRBLM2(EXPMKS,NOBPS,NOBPS,NSMOB,0) 5245 END IF 5246* 5247 CALL MEMMAN(IDUM,IDUM,'FLUSM ',2, 'GTEMKS') 5248* 5249 RETURN 5250 END 5251 SUBROUTINE EXP_MAS(EMA,A,NDIM,SCR) 5252* 5253* Expontial of minus a symmetric matrix A 5254* The matrix is given in complete form 5255* 5256*. Jeppe Olsen 5257* 5258 INCLUDE 'implicit.inc' 5259*. Input 5260 DIMENSION A(NDIM,NDIM) 5261*. Output 5262 DIMENSION EMA(NDIM,NDIM) 5263*. Scratch: Length should be 2*NDIM**2 + NDIM*(NDIM+1)/2+ NDIM 5264 DIMENSION SCR(*) 5265* 5266 NTEST = 000 5267 IF(NTEST.GE.100) THEN 5268 WRITE(6,*) ' Info from EXP_MAS ' 5269 WRITE(6,*) ' ================= ' 5270 END IF 5271 IF(NTEST.GE.1000) THEN 5272 WRITE(6,*) ' Symmetrix matrix to be exponentialized ' 5273 CALL WRTMAT(A,NDIM,NDIM,NDIM,NDIM) 5274 END IF 5275* 5276* Diagonalize matrix A 5277* 5278 KLX = 1 5279 KLSCR = KLX + NDIM**2 5280 KLMAT2 = KLSCR + NDIM*(NDIM+1)/2 5281 KLFREE = KLMAT2 + NDIM*NDIM 5282* 5283*. Obtain eigenvalues and eigenvectors of A 5284C DIAG_SYM_MAT(A,X,SCR,NDIM,ISYM) 5285 CALL DIAG_SYM_MAT(A,SCR(KLX),SCR(KLSCR),NDIM,0) 5286*. Eigenvalues have been returned in SCR(KLSCR) and the eigenvectors V 5287* in SCR(KLX) 5288*. The exponential of the eigenvalues -and remember the - from Exp(-A) 5289 DO I = 1, NDIM 5290 SCR(KLSCR-1+I) = EXP(-SCR(KLSCR-1+I)) 5291 END DO 5292* V Exp(eigenvalues) 5293 DO J = 1, NDIM 5294 EPSILJ = SCR(KLSCR-1+J) 5295 CALL COPVEC(SCR(KLX + (J-1)*NDIM), 5296 & SCR(KLMAT2+(J-1)*NDIM),NDIM) 5297 CALL SCALVE(SCR(KLMAT2+(J-1)*NDIM),EPSILJ,NDIM) 5298 END DO 5299* V Exp(eigenvalues) V+ 5300 FACTORC = 0.0D0 5301 FACTORAB = 1.0D0 5302 CALL MATML7(EMA,SCR(KLMAT2),SCR(KLX), 5303 & NDIM,NDIM,NDIM,NDIM,NDIM,NDIM, 5304 & FACTORC,FACTORAB,2) 5305* 5306 IF(NTEST.GE.100) THEN 5307 WRITE(6,*) ' Exponential of symmetrix matrix ' 5308 CALL WRTMAT(EMA,NDIM,NDIM,NDIM,NDIM) 5309 END IF 5310* 5311 RETURN 5312 END 5313 SUBROUTINE ORB_EXCIT_INT_SPACE(IORBSPC,ITOTSYM, 5314 & NOOEXC,IOOEXC,NUMONLY,IOFF_EXC, 5315 & I_RESTRICT_SUPSYM,MO_SUPSYM) 5316* 5317* Number of orbital excitations of symmetry ITOTSYM in orbitals space 5318* IORBSPC. 5319* NUMONLY = 1 => Only number is calculated 5320* = 0 => Also the excitations are set up, starting at IOFF_EXC 5321* 5322* Jeppe Olsen, July 19, 2011, the IOFF parameter added June 2012 5323* Last modification; Jeppe Olsen; June 3 2013; Supersymmetry added 5324* 5325 INCLUDE 'implicit.inc' 5326 INCLUDE 'mxpdim.inc' 5327 INCLUDE 'orbinp.inc' 5328 INCLUDE 'lucinp.inc' 5329 INCLUDE 'multd2h.inc' 5330*.Input 5331 INTEGER MO_SUPSYM(*) 5332*. Output 5333 INTEGER IOOEXC(2,*) 5334* 5335 NTEST = 10 5336 NOOEXC = 0 5337*. First orbital of space IORBSPC 5338 IOFF = NINOB + 1 5339 DO IGAS = 0, IORBSPC-1 5340 IOFF = IOFF + NOBPT(IGAS) 5341 END DO 5342 IF(NTEST.GE.100) WRITE(6,*) ' Offset for orbital excitations ', 5343 & IOFF 5344 NORB = NOBPT(IORBSPC) 5345 DO IORB = IOFF, IOFF + NORB - 1 5346 DO JORB = IOFF, IORB - 1 5347 ISM = ISMFTO(IORB) 5348 JSM = ISMFTO(JORB) 5349 IF(NTEST.GE.100) WRITE(6,*) ' IORB, JORB, ISM, JSM = ', 5350 & IORB, JORB, ISM, JSM 5351 IF(MULTD2H(ISM,JSM).EQ.ITOTSYM) THEN 5352 IMOKAY2 = 1 5353 IF(I_RESTRICT_SUPSYM.EQ.1) THEN 5354*. Check that supersymmetries are identical 5355 IF(MO_SUPSYM(IREOTS(IORB)).NE.MO_SUPSYM(IREOTS(JORB)))THEN 5356 IMOKAY2 = 0 5357 IF(NTEST.GE.10) THEN 5358 WRITE(6,*) 5359 & ' Excitation eliminated by supersym: IORB, JORB = ', 5360 & IORB, JORB 5361 END IF 5362 END IF 5363 END IF! Supersymmetry restrictions are active 5364 IF(IMOKAY2.EQ.1) THEN 5365 NOOEXC = NOOEXC + 1 5366 IF(NUMONLY.EQ.0) THEN 5367 IOOEXC(1,NOOEXC+IOFF_EXC-1) = IORB 5368 IOOEXC(2,NOOEXC+IOFF_EXC-1) = JORB 5369 END IF 5370 END IF 5371 END IF ! Symmetry was right 5372 END DO 5373 END DO 5374* 5375 IF(NTEST.GE.10) THEN 5376 WRITE(6,*) ' Number of active- active orbital excitations ', 5377 & NOOEXC 5378 END IF 5379 IF(NTEST.GE.100) THEN 5380 IF(NUMONLY.EQ.0) THEN 5381 WRITE(6,*) ' And the orbital excitations ' 5382 CALL IWRTMA(IOOEXC(1,IOFF_EXC),2,NOOEXC,2,NOOEXC) 5383 END IF 5384 END IF 5385* 5386 RETURN 5387 END 5388 SUBROUTINE E1_VB_FROM_ACTMAT(E1,IOOEXC,NOOEXC,E,RHOA,RHOB) 5389* 5390* Obtain VB gradient in active space from densities 5391* RHOB = <c!a+iaj!c(bio)>/<0!0>, RHOA = <c!a+aj!hc(bio)>/<0!0> 5392*. (note that the densities are in the original basis) 5393* 5394*. Jeppe Olsen, July19, 2011 5395* 5396* 5397 INCLUDE 'implicit.inc' 5398 INCLUDE 'mxpdim.inc' 5399 INCLUDE 'orbinp.inc' 5400*. Input 5401 INTEGER IOOEXC(2,NOOEXC) 5402 DIMENSION RHOA(NACOB,NACOB),RHOB(NACOB,NACOB) 5403*. Output 5404 DIMENSION E1(2*NOOEXC) 5405* 5406 NTEST = 000 5407 IF(NTEST.GE.100) THEN 5408 WRITE(6,*) 5409 WRITE(6,*) ' Info from E1_VB_FROM_ACTMAT ' 5410 WRITE(6,*) ' ============================' 5411 WRITE(6,*) 5412 WRITE(6,*) ' Energy = ', E 5413 END IF 5414 IF(NTEST.GE.1000) THEN 5415 WRITE(6,*) ' <0!E(ij)!H0>/<0!0> ' 5416 CALL WRTMAT(RHOA,NACOB,NACOB,NACOB,NACOB) 5417 WRITE(6,*) 5418 WRITE(6,*) ' <0!E(ij)!0>/<0!0> ' 5419 CALL WRTMAT(RHOB,NACOB,NACOB,NACOB,NACOB) 5420 WRITE(6,*) 5421 END IF 5422*. The antisymmetric part of the gradient 5423 DO JOO = 1, NOOEXC 5424 IORB = IOOEXC(1,JOO)-NINOB 5425 JORB = IOOEXC(2,JOO)-NINOB 5426 IF(NTEST.GE.1000) 5427 & WRITE(6,*) ' JOO, IORB, JORB = ', IORB, JORB 5428*. Antisymmetric part 5429 E1(JOO) = 2.0D0*(RHOA(IORB,JORB)-RHOA(JORB,IORB)) 5430*. Symmetric part 5431 E1(JOO+NOOEXC) = 5432 & -2.0D0* (RHOA(IORB,JORB)+RHOA(JORB,IORB) 5433 & -E*(RHOB(IORB,JORB)+RHOB(JORB,IORB))) 5434 END DO 5435* 5436 IF(NTEST.GE.100) THEN 5437* 5438 WRITE(6,*) ' Active-active gradient for nonorthogonal MCSCF ' 5439 WRITE(6,*) ' ===============================================' 5440 WRITE(6,*) 5441 CALL WRTMAT(E1,1,2*NOOEXC,1,2*NOOEXC) 5442 END IF 5443* 5444 RETURN 5445 END 5446 SUBROUTINE DO_ORBTRA(IDOTRA,IDOFI,IDOFA, 5447 & IE2LIST_IN,IOCOBTP_IN,INTSM_IN) 5448* 5449* Perform orbital transformations on integrals and Inactive/active Fock 5450* matrix 5451* 5452* IDOTRA = 1 => Transformed one- and two-electron integrals 5453* IDOFI = 1 => Inactive Fock-matrix 5454* IDOFA = 1 => Active Fock-matrix 5455* 5456* Jeppe Olsen, July 2011 - In a hotel room in Santiago de Compostella 5457* 5458 INCLUDE 'implicit.inc' 5459 INCLUDE 'mxpdim.inc' 5460 INCLUDE 'wrkspc-static.inc' 5461 INCLUDE 'glbbas.inc' 5462 INCLUDE 'cintfo.inc' 5463 INCLUDE 'cecore.inc' 5464 INCLUDE 'orbinp.inc' 5465 INCLUDE 'lucinp.inc' 5466#include "errquit.fh" 5467#include "mafdecls.fh" 5468#include "global.fh" 5469 5470* 5471 IDUM = 0 5472 CALL LUCIAQENTER('ORBTR') 5473 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'ORBTRA') 5474* 5475 NTEST = 0000 5476 IF(NTEST.GE.100.and.ga_nodeid().eq.0) THEN 5477 WRITE(6,*) ' Info from DO_ORBTRA ' 5478 WRITE(6,*) ' =====================' 5479 WRITE(6,*) 5480 WRITE(6,*) ' Tasks: IDOTRA, IDOFI, IDOFA = ', 5481 & IDOTRA, IDOFI, IDOFA 5482 IF(IDOTRA.EQ.1) THEN 5483 WRITE(6,*) ' IE2LIST_IN, IOCOBTP_IN, INTSM_IN = ', 5484 & IE2LIST_IN, IOCOBTP_IN, INTSM_IN 5485 END IF 5486 END IF! NTEST .ge. 100 5487* 5488 IE2LIST_A = IE2LIST_IN 5489 IOCOBTP_A = IOCOBTP_IN 5490 INTSM_A = INTSM_IN 5491* 5492 call ga_sync() 5493 IF(IDOTRA.EQ.1) THEN 5494*. Perform one- and two-electron transformations. 5495* The pointers to the mo-ao transformation matrices KKCMO_X, X=I,J,K,L 5496* must have been set up outside. 5497 CALL PREPARE_2EI_LIST 5498 CALL TRAINT 5499* 5500 IF(NTEST.GE.1000) THEN 5501 WRITE(6,*) ' one-electron transformed integrals' 5502 WRITE(6,*) ' =================================' 5503 IPACK_H1 = IE1_CCSM_G(IE2LIST_IN) 5504CNW CALL APRBLM2(WORK(KINT1),NTOOBS,NTOOBS,NSMOB,IPACK_H1) 5505 call ga_print(KINT1) 5506 END IF 5507* 5508 END IF! Integral transformation should be performed 5509* 5510 call ga_sync() 5511 IF(IDOFI.EQ.1) THEN 5512* 5513*. Calculate inactive Fock matrix in basis defined by KKCMI, KKCMJ 5514* ================================================================ 5515* 5516*. Use AO integrals in KINT_2EMO 5517* 5518 IE2ARR_F = IE2LIST_I(IE2LIST_IB(IE2LIST_FULL)) 5519 KINT2_FSAVE = KINT2_A(IE2ARR_F) 5520 KINT2_A(IE2ARR_F) = KINT_2EMO 5521*. The permutational symmetry of the inactive Fock-matrix is inherited from 5522*. the complex conjugation symmetry of the one-electron integrals 5523 IPACK_F = IE1_CCSM_G(IE2LIST_IN) 5524* 5525 CALL FI_FROM_INIINT_G(KFI,dbl_mb(KKCMO_I),dbl_mb(KKCMO_J), 5526 & KINT1,ECORE_HEX,3,IPACK_F) 5527 ECORE = ECORE_ORIG + ECORE_HEX 5528 IF(NTEST.GE.100) 5529 & WRITE(6,*) ' Updated core energy = ', ECORE 5530 IF(NTEST.GE.1000) THEN 5531 WRITE(6,*) ' Inactive Fock-matrix ' 5532 call ga_print(kfi) 5533CNW CALL APRBLM2(WORK(KFI),NTOOBS,NTOOBS,NSMOB,IPACK_F) 5534 END IF 5535*. And clean up 5536 KINT2_A(IE2ARR_F) = KINT2_FSAVE 5537 END IF ! FI should be calculated 5538* 5539 call ga_sync() 5540 IF(IDOFA.EQ.1) THEN 5541* 5542*. Calculate active Fock matrix in basis defined by KKCMI, KKCMJ 5543* ============================================================= 5544* 5545* 5546*. Use AO integrals in KINT_2EMO 5547* 5548 IE2ARR_F = IE2LIST_I(IE2LIST_IB(IE2LIST_FULL)) 5549 KINT2_FSAVE = KINT2_A(IE2ARR_F) 5550 KINT2_A(IE2ARR_F) = KINT_2EMO 5551*. The permutational symmetry of the inactive Fock-matrix is inherited from 5552*. the complex conjugation symmetry of the one-electron integrals 5553 IPACK_F = IE1_CCSM_G(IE2LIST_IN) 5554* 5555* A bit dirty: I will use IPACK_F to decide whether it is an 5556* normal or bio-calculation- will probably give my trouble later.. 5557 IF(IPACK_F.EQ.0) THEN 5558 IBIO_CALC = 1 5559 ELSE 5560 IBIO_CALC = 0 5561 END IF 5562* 5563C FA_FROM_INIINT(FA,CINI,CINIB,D,IPACK) 5564 IF(IBIO_CALC.EQ.1) THEN 5565*. transform RHO1 to bio-actual MO basis 5566* 5567*. Obtain first in symmetry block form 5568 LEN_R = NDIM_1EL_MAT(1,NACOBS,NACOBS,NSMOB,0) 5569 CALL MEMMAN(KLRHO1,NACOB**2,'ADDL ',2,'RHO1L ') 5570 CALL MEMMAN(KLRHO1B,NACOB**2,'ADDL ',2,'RHO1S ') 5571 CALL MEMMAN(KLCBIOA,LEN_R,'ADDL ',2,'CBIOAC') 5572C REORHO1(RHO1I,RHO1O,IRHO1SM) 5573 CALL REORHO1(dbl_mb(KRHO1),dbl_mb(KLRHO1),1,1) 5574*. Obtain CBIO over active orbitals only 5575C EXTR_OR_CP_ACT_BLKS_FROM_ORBMAT(A,AGAS,I_EX_OR_CP) 5576 CALL EXTR_OR_CP_ACT_BLKS_FROM_ORBMAT 5577 & (dbl_mb(KCBIO),dbl_mb(KLCBIOA),1) 5578 IF(NTEST.GE.1000) THEN 5579 WRITE(6,*) ' CBIO in active orbitals ' 5580 CALL APRBLM2(dbl_mb(KLCBIOA),NACOBS,NACOBS,NSMOB,0) 5581 END IF 5582 CALL TR_BIOMAT(dbl_mb(KLRHO1),dbl_mb(KLRHO1B),dbl_mb(KLCBIOA), 5583 & NACOBS,1,2,1,1) 5584*. Transfer back to full matrix over active orbitals 5585 CALL REORHO1(dbl_mb(KLRHO1),dbl_mb(KLRHO1B),1,2) 5586 ELSE 5587 KLRHO1 = KRHO1 5588 END IF 5589* 5590 CALL FA_FROM_INIINT(KFA,dbl_mb(KKCMO_I),dbl_mb(KKCMO_J), 5591 & dbl_mb(KLRHO1),IPACK_F) 5592*. And clean up 5593 KINT2_A(IE2ARR_F) = KINT2_FSAVE 5594 IF(NTEST.GE.1000) THEN 5595 WRITE(6,*) ' Active Fock-matrix ' 5596 call ga_print(kfa) 5597CNW CALL APRBLM2(WORK(KFA),NTOOBS,NTOOBS,NSMOB,IPACK_F) 5598 END IF 5599 END IF ! Active Fock matrix should be calculated 5600* 5601 call ga_sync() 5602 IF(NTEST.GE.100) WRITE(6,*) ' Leaving DO_ORBTRA ' 5603* 5604 CALL LUCIAQEXIT('ORBTR') 5605 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'ORBTRA') 5606* 5607 RETURN 5608 END 5609 SUBROUTINE GET_INIMO(CMO_INI) 5610* 5611* Obtain initial set of Molecular orbitals in CMO_INI as specified by 5612* parameters INI_MO_TP,INI_MO_ORT, INI_ORT_VBGAS in crun 5613* 5614* Two steps : 1) Obtain a set of (nonorthogonal) initial orbitals 5615* according to INI_MO_TP 5616* 2) Perform (partial) orthonormalization to obtain 5617* Final initial orbitals according to INI_MO_ORT, 5618* and INI_ORT_VBGAS,IGAS_SEL 5619* 5620* The INI_MO_TP parameter defines the raw (nonorthogonal) initial orbitals: 5621* 5622* INI_MO_TP = 1 => Unit matrix 5623* INI_MO_TP = 2 => Rotate orbitals from environment so 5624* Diagonal block in GAS IGAS_SEL is diagonal 5625* INI_MO_TP = 3 => Use orbitals read in from environment 5626* INI_MO_TP = 4 => Read in fragment orbitals 5627* INI_MO_TP = 5 => Read in from LUCINF_O 5628* 5629* 5630* INI_MO_ORT = 0 => No orthonormalization 5631* = 1 => symmetric orthogonalization 5632* = 2 => orthonormalization by biagonalization 5633* 5634* INI_ORT_VBGAS = 0 => No orthonormalization of VB gas space 5635* = 1 => Orthonornormalization of VB gas space according to 5636* INI_MO_ORT 5637* 5638* Jeppe Olsen, Restructuring some code in a Hotel room in Santiago De 5639* Compostella, July 2011 5640* June 2012, INI_MO_TP = 5 added 5641* 5642 INCLUDE 'implicit.inc' 5643 INCLUDE 'mxpdim.inc' 5644 INCLUDE 'wrkspc-static.inc' 5645 INCLUDE 'fragmol.inc' 5646 INCLUDE 'orbinp.inc' 5647 INCLUDE 'lucinp.inc' 5648 INCLUDE 'crun.inc' 5649 INCLUDE 'clunit.inc' 5650*. 5651 CHARACTER*6 CSAVE 5652*. Output 5653 DIMENSION CMO_INI(*) 5654* 5655 IDUM = 0 5656 NTEST = 0 5657 IF(NTEST.GE.100) THEN 5658 WRITE(6,*) 5659 WRITE(6,*) ' =====================' 5660 WRITE(6,*) ' Info from GET_INIMO: ' 5661 WRITE(6,*) ' =====================' 5662 WRITE(6,*) 5663 END IF 5664 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'INIMO ') 5665* 5666*. 0: Obtain some input information if required 5667* 5668 IF(INI_MO_TP.EQ.4) THEN 5669* 5670*. Set up fragment information 5671* 5672 IF(NFRAG_TP.EQ.0) THEN 5673 WRITE(6,*) 5674 & ' Input orbitals from fragment MOs requested(INI_MO_TP=4)' 5675 WRITE(6,*) 5676 & ' But no fragment information provided (keyword: MOFRAG)' 5677 WRITE(6,*) ' Specify keyword MOFRAG ' 5678 STOP ' Specify keyword MOFRAG ' 5679 ELSE 5680 CALL MOINF_FRAG 5681 END IF 5682 END IF ! Iform = 4 5683* 5684 LEN_1F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 5685 CALL MEMMAN(KLCMOAO1,LEN_1F,'ADDL ',2,'CMOAO1') 5686 CALL MEMMAN(KLCMOAO2,LEN_1F,'ADDL ',2,'CMOAO2') 5687* 5688 IF(INI_MO_TP.EQ.2.OR.INI_MO_TP.EQ.3) THEN 5689* 5690*. Obtain MOAO transformation matrix from environment 5691* 5692 CALL GET_CMOAO_ENV(WORK(KLCMOAO1)) 5693 END IF 5694* 5695 IF(INI_MO_TP.EQ.5) THEN 5696* 5697*. Read in from LUCINF_O which is a fort.91 output file, but 5698*. perhaps from another geometry. 5699* 5700*. a bit of dirty dancing: let LUCINF_O be the standard fort.91 5701*. for a few microseconds. 5702*. Obtain a free unit-number 5703 LU91_SAVE = LU91 5704 CALL FILEMAN_MINI(LU91,'ASSIGN') 5705 OPEN(LU91,STATUS='OLD',FORM='FORMATTED',FILE='LUCINF_O') 5706*. Fool also environment to think it is LUCIA 5707 CSAVE = ENVIRO 5708 ENVIRO(1:6) = 'LUCIA ' 5709*. Obtain CMO as usual from environment - with changed LU91 5710*. 5711 CALL GET_CMOAO_ENV(WORK(KLCMOAO1)) 5712 IF(NTEST.GE.1000) THEN 5713 WRITE(6,*) ' MOAO for INI_MO_TP = 5 ' 5714 CALL APRBLM2(WORK(KLCMOAO1),NTOOBS,NTOOBS,NSMOB,0) 5715 END IF 5716*. And restore order 5717 CLOSE(LU91,STATUS='KEEP') 5718 CALL FILEMAN_MINI(LU91,'FREE ') 5719 LU91 = LU91_SAVE 5720 ENVIRO = CSAVE 5721 END IF 5722* 5723* 5724*. 1: Generate/Read in the 'initial initial' orbitals and store in CMOAO2 5725* 5726*. The split of work between current routine and PREPARE_CMOAO_INI is 5727*. strange, but works.. 5728C PREPARE CMOAO_INI(INI_MO_TP_L, CMOAO_OUT,CMOAO_IN,IVBGAS) 5729 CALL PREPARE_CMOAO_INI 5730 & (INI_MO_TP,WORK(KLCMOAO2),WORK(KLCMOAO1), 5731 & NORTCIX_SCVB_SPACE) 5732 CALL COPVEC(WORK(KLCMOAO2),WORK(KLCMOAO1),LEN_1F) 5733* 5734*. 2. Orthonormalize parts of the orbital spaces 5735* 5736*. 5737*. Orthogonalize Active to inactive and secondary to active- always done 5738 INTER_ORT = 1 5739*. Between GA spaces 5740 IF(INI_MO_ORT.EQ.0) THEN 5741 INTERGAS_ORT = 0 5742 INI_ORT_VBGASL = 0 5743 ELSE 5744 INTERGAS_ORT = 1 5745 INI_ORT_VBGASL = INI_ORT_VBGAS 5746 END IF 5747*. Intragas orthogonalization 5748 INTRAGAS_ORT = INI_MO_ORT 5749*. Orthogonalization in VB space- defined by parameter INI_MO_ORT 5750 IF(NTEST.GE.100) THEN 5751 WRITE(6,'(A,4I4)') 5752 & ' INTER_ORT, INTERGAS_ORT, INTRAGAS_ORT, INI_ORT_VBGASL', 5753 & INTER_ORT, INTERGAS_ORT, INTRAGAS_ORT, INI_ORT_VBGASL 5754 END IF 5755C ORT_ORB(CMOAO_IN, CMOAO_OUT, INTER_ORT,INTERGAS_ORT, 5756C & INTRAGAS_ORT,IORT_VBSPC) 5757 CALL ORT_ORB(WORK(KLCMOAO1),CMO_INI,INTER_ORT, 5758 & INTERGAS_ORT,INTRAGAS_ORT,INI_ORT_VBGASL) 5759* 5760 IF(NTEST.GE.100) THEN 5761 WRITE(6,*) ' Expansion of final initial MOs in AOs ' 5762 WRITE(6,*) ' ======================================' 5763 CALL APRBLM_F7(CMO_INI,NTOOBS,NTOOBS,NSMOB,0) 5764C CALL PRINT_CMOAO(CMO_INI) 5765 END IF 5766* 5767 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'INIMO ') 5768* 5769 RETURN 5770 END 5771 SUBROUTINE BLK_CHECK_UNI_MAT 5772 & (UNI,NBLK,LBLK,XMAX_DIFF_DIAG,XMAX_DIFF_OFFD) 5773* 5774* A full blocked matrix UNI is given. Find largest deviation of 5775* matrix from unit matrix as 5776* The largest deviation of diagonal element from one 5777* The largest deviation of block-diagonal element from zero 5778* 5779* Jeppe Olsen, May 2012 5780* 5781 INCLUDE 'implicit.inc' 5782*. Input 5783 DIMENSION UNI(*) 5784 INTEGER LBLK(NBLK) 5785* 5786 NTEST = 100 5787 IF(NTEST.GE.100) THEN 5788 WRITE(6,*) ' ===========================' 5789 WRITE(6,*) ' Info from BLK_CHECK_UNI_MAT' 5790 WRITE(6,*) ' ===========================' 5791 END IF 5792* 5793 IB = 1 5794 XMAX_DIFF_DIAG = 0.0D0 5795 XMAX_DIFF_OFFD = 0.0D0 5796* 5797 DO IBLK = 1, NBLK 5798 L = LBLK(IBLK) 5799C CHECK_UNIT_MAT(UNI,NDIM,XMAX_DIFF_DIAG,XMAX_DIFF_OFFD) 5800 CALL CHECK_UNIT_MAT(UNI(IB),L,XDIAG_LOC, XOFFD_LOC,0) 5801 XMAX_DIFF_DIAG = MAX(XMAX_DIFF_DIAG,XDIAG_LOC) 5802 XMAX_DIFF_OFFD = MAX(XMAX_DIFF_OFFD,XOFFD_LOC) 5803 IB = IB + L**2 5804 END DO 5805* 5806 IF(NTEST.GE.100) THEN 5807 WRITE(6,*) ' Deviations of block matrix from unit matrix: ' 5808 WRITE(6,*) 5809 & ' Largest deviation of diagonal element from 1:', 5810 & XMAX_DIFF_DIAG 5811 WRITE(6,*) 5812 & ' Largest deviation of off-diagonal element from 1:', 5813 & XMAX_DIFF_OFFD 5814 END IF 5815* 5816 RETURN 5817 END 5818 SUBROUTINE CHECK_UNIT_MAT(UNI,NDIM,XMAX_DIFF_DIAG,XMAX_DIFF_OFFD, 5819 & ISYM) 5820* 5821* A matrix UNI is given. Check difference between UNI and UNIT matrix 5822* and report in: 5823* XMAX_DIFF_DIAG: Max absolute difference between between diagonal 5824* element and 1 5825* XMAX_DIFF_OFFD: Max absolute difference between off diagonal and zero 5826* 5827*. Jeppe Olsen, July 2011 (Thought I had written this routine before...) 5828* Last modification; Feb 27, 2013; Jeppe Olsen; ISYM added 5829* 5830 INCLUDE 'implicit.inc' 5831*. Input 5832 DIMENSION UNI(*) 5833*. Diagonal element 5834 XMAX_DIFF_DIAG = 0.0D0 5835 DO I = 1, NDIM 5836 IF(ISYM.EQ.0) THEN 5837 II = (I-1)*NDIM + I 5838 ELSE 5839 II = I*(I-1)/2 + I 5840 END IF 5841 XMAX_DIFF_DIAG = MAX(XMAX_DIFF_DIAG,ABS(UNI(II)-1.0D0)) 5842 END DO 5843*. Off diagonal elements 5844 XMAX_DIFF_OFFD = 0.0D0 5845 DO I = 1, NDIM 5846 DO J = 1, I-1 5847 IF(ISYM.EQ.0) THEN 5848 JI = (I-1)*NDIM + J 5849 IJ = (J-1)*NDIM + I 5850 XMAX_DIFF_OFFD = MAX(XMAX_DIFF_OFFD,ABS(UNI(IJ)),ABS(UNI(JI))) 5851 ELSE 5852 IJ = I*(I-1)/2 + J 5853 XMAX_DIFF_OFFD = MAX(XMAX_DIFF_OFFD,ABS(UNI(IJ))) 5854 END IF 5855 END DO 5856 END DO 5857* 5858 NTEST = 100 5859 IF(NTEST.GE.100) THEN 5860 WRITE(6,*) ' Comparison of matrix with unit matrix: ' 5861 WRITE(6,*) ' Largest deviation of diagonal elements ', 5862 & XMAX_DIFF_DIAG 5863 WRITE(6,*) ' Largest deviation of of-diagonal elements ', 5864 & XMAX_DIFF_OFFD 5865 END IF 5866* 5867 RETURN 5868 END 5869 SUBROUTINE TR_BIOMAT(XIN,XOUT,CBIO,NORB_PSM, 5870 & INB_IN,INB_OUT,JNB_IN,JNB_OUT) 5871* 5872* An orbital matrix XIN(I,J) is given in symmetry blocked form 5873* with NORB_PSM orbitals per symmetry 5874* INB_IN = 1 => I is in normal basis 5875* = 2 => I is in bioorthogonal basis 5876* JNB_IN = 1 => J is in normal basis 5877* = 2 => J is in bioorthogonal basis 5878* Obtain the matrix in the representation XOUT(I,J) defined by 5879* 5880* INB_OUT = 1 => I is in normal basis 5881* = 2 => I is in bioorthogonal basis 5882* JNB_OUT = 1 => J is in normal basis 5883* = 2 => J is in bioorthogonal basis 5884* The matrix CBIO giving the transformation from the normal to the 5885* bioorthogonal basis is in the same basis. 5886* 5887* Note: The use of locally defined NORB_PSM, allows the restriction 5888* of the matrice to for example the active orbitals. 5889* 5890*. Jeppe Olsen, July 2011 5891* 5892 INCLUDE 'implicit.inc' 5893 INCLUDE 'mxpdim.inc' 5894 INCLUDE 'wrkspc-static.inc' 5895 INCLUDE 'glbbas.inc' 5896 INCLUDE 'lucinp.inc' 5897 INCLUDE 'orbinp.inc' 5898*. Input 5899 DIMENSION XIN(*) 5900 DIMENSION NORB_PSM(NSMOB) 5901* 5902 NTEST = 00 5903 IF(NTEST.GE.100) THEN 5904 WRITE(6,*) ' Info form TR_BIOMAT ' 5905 WRITE(6,*) ' =================== ' 5906 WRITE(6,'(A,4I2)') ' INB_IN,INB_OUT,JNB_IN,JNB_OUT = ', 5907 & INB_IN,INB_OUT,JNB_IN,JNB_OUT 5908* 5909 WRITE(6,*) ' NORB_PSM = ' 5910 CALL IWRTMA3(NORB_PSM,1,NSMOB,1,NSMOB) 5911* 5912 WRITE(6,*) ' The Input Cbio matrix ' 5913 CALL APRBLM2(CBIO,NORB_PSM,NORB_PSM,NSMOB,0) 5914 END IF 5915* 5916*. Check that input parameters are in range 5917* 5918 INB_IN_OK = 1 5919 JNB_IN_OK = 1 5920 INB_OUT_OK = 1 5921 JNB_OUT_OK = 1 5922 IF(1.GT.INB_IN.OR.INB_IN.GT.2) INB_IN_OK = 0 5923 IF(1.GT.JNB_IN.OR.JNB_IN.GT.2) JNB_IN_OK = 0 5924 IF(1.GT.INB_OUT.OR.INB_OUT.GT.2) INB_OUT_OK = 0 5925 IF(1.GT.JNB_OUT.OR.JNB_OUT.GT.2) JNB_OUT_OK = 0 5926* 5927 IF(INB_IN_OK.EQ.0.OR.JNB_IN_OK.EQ.0.OR. 5928 & INB_OUT_OK.EQ.0.OR.JNB_OUT_OK.EQ.0) THEN 5929 WRITE(6,*) ' Error in input to TR_BIOMAT' 5930 WRITE(6,*) ' Input parameter out or range (1,2)' 5931 WRITE(6,'(A,4(2X,I2))') 5932 & ' INB_IN,JNB_IN,INB_OUT,JNB_OUT = ', 5933 & INB_IN,JNB_IN,INB_OUT,JNB_OUT 5934 STOP ' Error in input to TR_BIOMAT' 5935 END IF 5936* 5937 IDUM = 0 5938 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'TR_BIO') 5939* 5940 LEN_1F = NDIM_1EL_MAT(1,NORB_PSM,NORB_PSM,NSMOB,0) 5941*. Local copy of CBIO 5942 CALL MEMMAN(KLCBIO,LEN_1F,'ADDL ',2,'CBIOL ') 5943 CALL COPVEC(CBIO,WORK(KLCBIO),LEN_1F) 5944* 5945 NOBS_MX = IMNMX(NORB_PSM,NSMOB,2) 5946 LSCR = 2*NOBS_MX**2 5947 KLCBIOINV = 0 5948*. Obtain transformation from BIO to normal basis if required 5949 IF(INB_IN.EQ.2.AND.INB_OUT.EQ.1.OR. 5950 & JNB_IN.EQ.2.AND.JNB_OUT.EQ.1) THEN 5951 CALL MEMMAN(KLCBIOINV,LEN_1F,'ADDL ',2,'CBIINV') 5952 CALL MEMMAN(KLSCR,LSCR,'ADDL ',2,'CBIOSC') 5953* 5954C INV_BLKMT(A,AINV,SCR,NBLK,LBLK,IPROBLEM) 5955 CALL INV_BLKMT(WORK(KLCBIO),WORK(KLCBIOINV),WORK(KLSCR), 5956 & NSMOB,NORB_PSM,IPROBLEM) 5957 IF(NTEST.GE.1000) THEN 5958 WRITE(6,*) ' Inverted CBIO ' 5959 CALL APRBLM2(WORK(KLCBIOINV),NORB_PSM,NORB_PSM,NSMOB,0) 5960 END IF 5961 IF(IPROBLEM.NE.0) THEN 5962 WRITE(6,*) ' Problem inverting CBIO(MO,MO) ' 5963 END IF 5964 END IF 5965* 5966*. Local pointers to pointers to transformations matrices for I and J 5967* 5968 IF(INB_IN.EQ.INB_OUT) THEN 5969 KKLI = 0 5970 ELSE 5971 IF(INB_IN.EQ.1.AND.INB_OUT.EQ.2) THEN 5972* Normal => BIO 5973 KKLI = KLCBIO 5974 ELSE 5975 KKLI = KLCBIOINV 5976 END IF 5977 END IF 5978* 5979 IF(JNB_IN.EQ.JNB_OUT) THEN 5980 KKLJ = 0 5981 ELSE 5982 IF(JNB_IN.EQ.1.AND.JNB_OUT.EQ.2) THEN 5983* Normal => BIO 5984 KKLJ = KLCBIO 5985 ELSE 5986 KKLJ = KLCBIOINV 5987 END IF 5988 END IF 5989*. And do the transformation as requested 5990 IF(INB_IN.EQ.INB_OUT.AND.JNB_IN.EQ.JNB_OUT) THEN 5991* No transformation, just copy 5992 CALL COPVEC(XIN,XOUT,LEN_1F) 5993 ELSE IF( INB_IN.NE.INB_OUT.AND.JNB_IN.EQ.JNB_OUT) THEN 5994*. Transformation of first index I 5995C MULT_BLOC_MAT(C,A,B, 5996C NBLOCK,LCROW,LCCOL,LAROW,LACOL,LBROW,LBCOL,ITRNSP) 5997 CALL MULT_BLOC_MAT(XOUT,WORK(KKLI),XIN, 5998 & NSMOB,NORB_PSM,NORB_PSM,NORB_PSM,NORB_PSM,NORB_PSM, 5999 & NORB_PSM,1) 6000 ELSE IF(INB_IN.EQ.INB_OUT.AND.JNB_IN.NE.JNB_OUT) THEN 6001* Transformation of second index, J 6002 CALL MULT_BLOC_MAT(XOUT,XIN,WORK(KKLJ), 6003 & NSMOB,NORB_PSM,NORB_PSM,NORB_PSM,NORB_PSM,NORB_PSM, 6004 & NORB_PSM,0) 6005 ELSE 6006*. Transform both I and J indeces 6007C TRAN_SYM_BLOC_MAT4 6008C (AIN,XL,XR,NBLOCK,LX_ROW,LX_COL,AOUT,SCR,ISYM) 6009 CALL MEMMAN(KLSCRTRA,LSCR,'ADDL ',2,'SCRTRA') 6010 CALL TRAN_SYM_BLOC_MAT4(XIN,WORK(KKLI),WORK(KKLJ), 6011 & NSMOB,NORB_PSM,NORB_PSM,XOUT,WORK(KLSCRTRA),0) 6012 END IF 6013* 6014 IF(NTEST.GE.100) THEN 6015 WRITE(6,*) ' Output from TR_BIOMAT' 6016 WRITE(6,*) ' ====================== ' 6017 WRITE(6,*) 6018 WRITE(6,'(A,4(2X,I3))') ' INB_IN, JNB_IN, INB_OUT, JNB_OUT =', 6019 & INB_IN, JNB_IN, INB_OUT, JNB_OUT 6020 WRITE(6,*) ' Input matrix: ' 6021 CALL APRBLM2(XIN,NORB_PSM,NORB_PSM,NSMOB,0) 6022 WRITE(6,*) ' Output matrix: ' 6023 CALL APRBLM2(XOUT,NORB_PSM,NORB_PSM,NSMOB,0) 6024 END IF 6025* 6026 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'TR_BIO') 6027 RETURN 6028 END 6029 SUBROUTINE EXTR_OR_CP_ACT_BLKS_FROM_ORBMAT 6030 & (A,AGAS,I_EX_OR_CP) 6031* 6032* A symmetryblocked (not lower half packed) matrix A over orbitals is given 6033* Extract all blocks referring to the GASpaces (i.e. 1-ngas) 6034* 6035* Matrix is assumed total symmetric wrt pointgroup 6036* 6037* I_EX_OR_CP = 1 => Extract from A to AGAS 6038* I_EX_OR_CP = 1 => Copy from AGAS to A 6039* 6040*. Jeppe Olsen, July 2011 6041* 6042 INCLUDE 'implicit.inc' 6043 INCLUDE 'mxpdim.inc' 6044 INCLUDE 'orbinp.inc' 6045 INCLUDE 'lucinp.inc' 6046*. Specific input or output 6047 DIMENSION A(*), AGAS(*) 6048* 6049 DO ISYM = 1, NSMOB 6050 IF(ISYM.EQ.1) THEN 6051 IOFF_IN = 1 6052 IOFF_OUT = 1 6053 ELSE 6054 IOFF_IN = IOFF_IN + NTOOBS(ISYM-1)**2 6055 IOFF_OUT = IOFF_OUT + NACOBS(ISYM-1)**2 6056 END IF 6057* 6058 IOFF = NINOBS(ISYM)+1 6059 NIA= NACOBS(ISYM) 6060 NIT= NTOOBS(ISYM) 6061* 6062 DO J = 1, NIA 6063 DO I = 1, NIA 6064 IJ_OUT = IOFF_OUT -1 + (J-1)*NIA + I 6065 IJ_IN = IOFF_IN -1 6066 & + (IOFF+J-1-1)*NIT + IOFF+I-1 6067 IF(I_EX_OR_CP.EQ.1) THEN 6068 AGAS(IJ_OUT) = A(IJ_IN) 6069 ELSE 6070 A(IJ_IN) = AGAS(IJ_OUT) 6071 END IF 6072 END DO 6073 END DO 6074 END DO ! End of loop over symmetries 6075* 6076 NTEST = 00 6077 IF(NTEST.GE.100) THEN 6078 WRITE(6,*) ' Submatrix Over active orbitals' 6079 CALL APRBLM2(AGAS,NACOBS,NACOBS,NSMOB,0) 6080 WRITE(6,*) ' Full matrix ' 6081 CALL APRBLM2(A,NTOOBS,NTOOBS,NSMOB,0) 6082 END IF 6083* 6084 RETURN 6085 END 6086 SUBROUTINE VB_GRAD_ORBVBSPC(NOOEXC_AA,IOOEXC_AA,E1,C, 6087 & VEC1_CSF,VEC2_CSF) 6088* 6089* Obtain gradient over orbitals in active space 6090* 6091* E1(A)(IJ) = 2 ( <0!(E(ij) - E(ji))H!0> 6092* E1(S)(IJ) =-2 ( <0!(E(ij) + E(ji))(H-E)!0> 6093* 6094* The number of active-active excitations is NOOEXC_AA 6095* and the corresponding excitations are IOOEXC_AA 6096* 6097* So to obtain gradient 6098* 1: construct bioorthogonal expansion of S = H!0> and !0> 6099* 2: Set up density matrices <0!E(ij)!s> <0!E(ij)!0> 6100* where i is in biobase and j in normal 6101* 3: Transform density matrices to standard basis 6102* To accomplish 1, the sigma routine is called with the current set of 6103* CI coefficients 6104* 6105* The current CI coefficients in the CSF basis are in C, where 6106* VEC1_CSF, VEC2_CSF, must be able to hold these expansions 6107* 6108* This is an initial version, for initial calculations and checks 6109* 6110* Jeppe Olsen, July 2011, for the initial NORTMCSCF program 6111* 6112 INCLUDE 'implicit.inc' 6113 INCLUDE 'mxpdim.inc' 6114 INCLUDE 'wrkspc-static.inc' 6115 INCLUDE 'lucinp.inc' 6116 INCLUDE 'orbinp.inc' 6117 INCLUDE 'clunit.inc' 6118 INCLUDE 'glbbas.inc' 6119 INCLUDE 'crun.inc' 6120 COMMON/SCRFILES_MATVEC/LUSCR1,LUSCR2,LUSCR3, 6121 & LUCBIO_SAVE, LUHCBIO_SAVE,LUC_SAVE 6122 REAL*8 INPRDD 6123*. Input 6124 DIMENSION C(*) 6125 INTEGER IOOEXC_AA(2,NOOEXC_AA) 6126*. Scratch 6127 DIMENSION VEC1_CSF(*), VEC2_CSF(*) 6128*. Output 6129 DIMENSION E1(2*NOOEXC_AA) 6130* 6131 NTEST = 000 6132*. CSFs are handled explicitly, so 6133 NOCSF = 1 6134* 6135 IF(NTEST.GE.100) THEN 6136 WRITE(6,*) 6137 WRITE(6,*) ' ===========================' 6138 WRITE(6,*) ' Input from VB_GRAD_ORBVBSPC' 6139 WRITE(6,*) ' ===========================' 6140 WRITE(6,*) 6141 WRITE(6,*) ' NOOEXC_AA = ', NOOEXC_AA 6142 WRITE(6,*) ' The active-active excitations ' 6143 CALL PRINT_ORBEXC_LIST(IOOEXC_AA,0,NOOEXC_AA) 6144 END IF 6145* 6146 IDUM = 0 6147 CALL MEMMAN(IDUM,IDUM,'MARK ',2,'VBGRAD') 6148* 6149 LUSCR1 = LUSC34 6150 LUSCR2 = LUSC35 6151 LUSCR3 = LUSC36 6152 LUCBIO_SAVE = 110 6153 LUHCBIO_SAVE = 111 6154 LUC_SAVE = 112 6155* 6156* A bit of scratch 6157* 6158 LEN_1A = NDIM_1EL_MAT(1,NACOBS,NACOBS,NSMOB,0) 6159 CALL MEMMAN(KLRHOA,NACOB**2,'ADDL ',2,'RHOA ') 6160 CALL MEMMAN(KLRHOB,NACOB**2,'ADDL ',2,'RHOB ') 6161 CALL MEMMAN(KLSCR ,NACOB**2,'ADDL ',2,'SCR ') 6162 CALL MEMMAN(KLCBIOA,LEN_1A,'ADDL ',2,'CBIOAC') 6163*. Preparation: Obtain CBIO over active orbitals only 6164C EXTR_OR_CP_ACT_BLKS_FROM_ORBMAT(A,AGAS,I_EX_OR_CP) 6165 CALL EXTR_OR_CP_ACT_BLKS_FROM_ORBMAT 6166 & (WORK(KCBIO),WORK(KLCBIOA),1) 6167 IF(NTEST.GE.1000) THEN 6168 WRITE(6,*) ' CBIO in active orbitals ' 6169 CALL APRBLM2(WORK(KLCBIOA),NACOBS,NACOBS,NSMOB,0) 6170 END IF 6171* 6172*. Sigma with the current C 6173* 6174C SIGMA_NORTCI(C,HC,SC,IDOHC,IDOSC) 6175 CALL SIGMA_NORTCI(C,VEC1_CSF,VEC2_CSF,1,1) 6176 IF(NTEST.GE.1000) WRITE(6,*) ' Back from SIGMA_NORTCI' 6177* calculate energy from vectors on file 6178 CHC = INPRDD(WORK(KVEC1P),WORK(KVEC2P),LUC_SAVE,LUHCBIO_SAVE,1,-1) 6179 CC = INPRDD(WORK(KVEC1P),WORK(KVEC2P),LUC_SAVE, LUCBIO_SAVE,1,-1) 6180 EVB = CHC/CC 6181 IF(NTEST.GE.10) WRITE(6,*) ' Energy is ', EVB 6182* 6183*. Set up density <0! a+i(bio) aj!0(bio)> in RHOB 6184* 6185 IF(NTEST.GE.1000) THEN 6186 WRITE(6,*) ' C in SD expansion ' 6187 CALL WRTVCD(WORK(KVEC1P),LUC_SAVE,1,-1) 6188 WRITE(6,*) ' C(bio) in SD expansion ' 6189 CALL WRTVCD(WORK(KVEC1P),LUCBIO_SAVE,1,-1) 6190 WRITE(6,*) ' HC(bio) in SD expansion ' 6191 CALL WRTVCD(WORK(KVEC1P),LUHCBIO_SAVE,1,-1) 6192 END IF 6193 XDUM = 0.0D0 6194 CALL DENSI2(1 ,WORK(KLRHOB),XDUM, 6195 &WORK(KVEC1P),WORK(KVEC2P),LUC_SAVE,LUCBIO_SAVE,EXPS2, 6196 &0,XDUM,XDUM,XDUM,XDUM,0) 6197*. Scale with 1/<0!0> 6198 FACTOR = 1.0D0/CC 6199 CALL SCALVE(WORK(KLRHOB),FACTOR,NACOB**2) 6200 IF(NTEST.GE.1000) THEN 6201 WRITE(6,*) ' Density matrix <0! a+i(bio) aj!bio 0>/<0!0> ' 6202 CALL WRTMAT(WORK(KLRHOB),NACOB,NACOB,NACOB,NACOB) 6203 END IF 6204*. Obtain density as blocked matrix over symmetry blocks of active orbitals 6205C REORHO1(RHO1I,RHO1O,IRHO1SM) 6206 CALL REORHO1(WORK(KLRHOB),WORK(KLSCR),1,1) 6207 CALL COPVEC(WORK(KLSCR),WORK(KLRHOB),LEN_1A) 6208*. Transform the densities from bio, normal to the normal, normal basis 6209C TR_BIOMAT(XIN,XOUT,CBIO,NORB_PSM, 6210C & INB_IN,INB_OUT,JNB_IN,JNB_OUT) 6211 CALL TR_BIOMAT(WORK(KLRHOB),WORK(KLSCR),WORK(KLCBIOA), 6212 & NACOBS,2,1,1,1) 6213*. Transfer back to full matrix over active orbitals 6214 CALL REORHO1(WORK(KLRHOB),WORK(KLSCR),1,2) 6215 IF(NTEST.GE.1000) THEN 6216 WRITE(6,*) ' Density matrix <0! a+i aj!bio 0> ' 6217 CALL WRTMAT(WORK(KLRHOB),NACOB,NACOB,NACOB,NACOB) 6218 END IF 6219* 6220*. Set up density <0! a+i(bio) aj!H0(bio)> in RHOA 6221* 6222 CALL DENSI2(1 ,WORK(KLRHOA),XDUM, 6223 & WORK(KVEC1P),WORK(KVEC2P),LUC_SAVE,LUHCBIO_SAVE,EXPS2, 6224 & 0,XDUM,XDUM,XDUM,XDUM,0) 6225*. Scale with 1/<0!0> 6226 FACTOR = 1.0D0/CC 6227 CALL SCALVE(WORK(KLRHOA),FACTOR,NACOB**2) 6228 IF(NTEST.GE.1000) THEN 6229 WRITE(6,*) ' Density matrix <0! a+i(bio) aj!bio H0>/<0!0> ' 6230 CALL WRTMAT(WORK(KLRHOA),NACOB,NACOB,NACOB,NACOB) 6231 END IF 6232*. Obtain density as blocked matrix over symmetry blocks of active orbitals 6233 CALL REORHO1(WORK(KLRHOA),WORK(KLSCR),1,1) 6234 CALL COPVEC(WORK(KLSCR),WORK(KLRHOA),LEN_1A) 6235*. Transform the densities from bio, normal to the normal, normal basis 6236 CALL TR_BIOMAT(WORK(KLRHOA),WORK(KLSCR),WORK(KLCBIOA), 6237 & NACOBS,2,1,1,1) 6238*. Transfer back to full matrix over active orbitals 6239 CALL REORHO1(WORK(KLRHOA),WORK(KLSCR),1,2) 6240*. and construct the gradient 6241C E1_VB_FROM_ACTMAT(E1,IOOEXC_S,NOOEXC_AA,E,RHOA,RHOB) 6242 CALL E1_VB_FROM_ACTMAT(E1,IOOEXC_AA, 6243 & NOOEXC_AA,EVB, WORK(KLRHOA),WORK(KLRHOB)) 6244* 6245 CALL MEMMAN(IDUM,IDUM,'FLUSM ',2,'VBGRAD') 6246 RETURN 6247 END 6248 SUBROUTINE GET_VB_VF_VBSPC_FROM_KAPPA(E1, 6249 & KAPPA_A,NOOEXC_A,IOOEXC_A, 6250 & KAPPA_S,NOOEXC_S,IOOEXC_S,CCI, 6251 & VEC1_CSF,VEC2_CSF) 6252* 6253* Obtain gradient-like Vector function E1 in VB orbital space from 6254* given Kappa and S 6255* 6256* Using method with expansion in complete VI space 6257* 6258*. It is assumed that the current MO-AO coefficients are in KMOAOIN. 6259* Integrals etc are overwritten, so the exit from this routine is 6260* not clean. 6261* 6262*. Jeppe Olsen, July 24 2011 6263* 6264 INCLUDE 'implicit.inc' 6265 INCLUDE 'mxpdim.inc' 6266 INCLUDE 'wrkspc-static.inc' 6267 INCLUDE 'glbbas.inc' 6268 INCLUDE 'lucinp.inc' 6269 INCLUDE 'orbinp.inc' 6270 INCLUDE 'cintfo.inc' 6271 INCLUDE 'spinfo.inc' 6272*. Specific input 6273 INTEGER IOOEXC_A(2,NOOEXC_A), IOOEXC_S(2,NOOEXC_S) 6274 REAL*8 KAPPA_A(*), KAPPA_S(*) 6275*. Scratch 6276 DIMENSION VEC1_CSF(*),VEC2_CSF(*) 6277*. Output 6278 DIMENSION E1(NOOEXC_S+NOOEXC_A) 6279* 6280 NTEST = 100 6281 IF(NTEST.GE.10) THEN 6282 WRITE(6,*) ' Input from GET_VB_VF_VBSPC_FROM_KAPPA ' 6283 WRITE(6,*) ' ======================================' 6284 WRITE(6,*) 6285 WRITE(6,*) ' Input Kappa_A, Kappa_S: ' 6286 CALL WRTMAT(KAPPA_A,1,NOOEXC_A,1,NOOEXC_A) 6287 WRITE(6,*) 6288 CALL WRTMAT(KAPPA_S,1,NOOEXC_S,1,NOOEXC_S) 6289 END IF 6290* 6291 IDUM = 0 6292 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'GTVBVF') 6293* 6294*. Obtain New MO coefficients in MOAOUT: MOAOIN* Exp(-Kappa_A S) Exp(-Kappa_S S) 6295* 6296C NEWMO_FROM_KAPPA_NORT( 6297C & NOOEXC_A,IOOEXC_A,KAPPA_A, 6298C & NOOEXC_S,IOOEXC_S,KAPPA_S,CMOAO_IN,CMOAO_OUT) 6299 CALL NEWMO_FROM_KAPPA_NORT( 6300 & NOOEXC_A,IOOEXC_A,KAPPA_A,NOOEXC_S,IOOEXC_S,KAPPA_S, 6301 & WORK(KMOAOIN),WORK(KMOAOUT)) 6302* 6303* Obtain the set of biorthonormal orbitals 6304* 6305 CALL GET_CBIO(WORK(KMOAOIN),WORK(KCBIO),WORK(KCBIO2)) 6306* 6307* Biorthonormal integral transformaion 6308* 6309 IF(NTEST.GE.10) THEN 6310 WRITE(6,*) ' Bioorthogonal integral transformation ' 6311 END IF 6312* 6313 IE2LIST_A = IE2LIST_FULL_BIO 6314 IOCOBTP_A = 1 6315 INTSM_A = 1 6316 CALL PREPARE_2EI_LIST 6317* 6318 KKCMO_I = KMOAOUT 6319 KKCMO_J = KCBIO2 6320 KKCMO_K = KMOAOUT 6321 KKCMO_L = KCBIO2 6322* 6323C DO_ORBTRA(IDOTRA,IDOFI,IDOFA,IE2LIST_IN,IOCOBTP_IN,INTSM_IN) 6324 CALL DO_ORBTRA(1,1,1,IE2LIST_FULL_BIO,IOCOBTP_A,INTSM_A) 6325 NINT1_F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 6326 CALL COPVEC(WORK(KFI),WORK(KINT1),NINT1_F) 6327 CALL FLAG_ACT_INTLIST(IE2LIST_FULL_BIO) 6328*. The antisymmetric part of gradient 6329 CALL FOCK_MAT_NORT(WORK(KF),WORK(KF2),2,WORK(KFI),WORK(KFA)) 6330*. And the interspace gradient 6331C E1_FROM_F_NORT(E1,F1,F2,IOPSM,IOOEXC,IOOEXCC, 6332C & NOOEXC,NTOOB,NTOOBS,NSMOB,IBSO,IREOST) 6333 CALL E1_FROM_F_NORT(E1,WORK(KF),WORK(KF2),1, 6334 & WORK(KLOOEXC),WORK(KLOOEXCC),NOOEXC_A,NTOOB, 6335 & NTOOBS,NSMOB,IBSO,IREOST) 6336*. And add the active-active gradient 6337* The interspace excitations 6338C VB_GRAD_ORBVBSPC(NOOEXC,IOOEXC,E1,C,VEC1_CSF,VEC2_CSF) 6339 IF(NTEST.GE.1000) 6340 & WRITE(6,*) ' Active-active gradient will be calculated ' 6341 CALL VB_GRAD_ORBVBSPC(NOOEXC_S,WORK(KLOOEXCC_S), 6342 & WORK(KLE1+NOOEXC_IS), 6343 & WORK(KL_VEC1),WORK(KL_VEC2),WORK(KL_VEC3)) 6344 6345 6346C VB_GRAD_ORBVBSPC(NOOEXC,IOOEXC,E1,C, 6347C & VEC1_CSF,VEC2_CSF) 6348*. Assuming just optimization in the VB space, 6349 CALL VB_GRAD_ORBVBSPC(NOOEXC_S,IOOEXC_S,E1,CCI, 6350 & VEC1_CSF,VEC2_CSF) 6351* 6352 IF(NTEST.GE.100) THEN 6353 WRITE(6,*) 6354 & ' Orbital vector function from GET_VB_VF_VBSPC_FROM_KAPPA' 6355 WRITE(6,*) 6356 & ' =======================================================' 6357 WRITE(6,*) 6358 WRITE(6,*) ' Part referring to antisymmetric operators: ' 6359 CALL WRT_IOOEXCOP(E1,IOOEXC_S,NOOEXC_S) 6360 WRITE(6,*) ' Part referring to symmetric operators: ' 6361 CALL WRT_IOOEXCOP(E1(1+NOOEXC_S),IOOEXC_S,NOOEXC_S) 6362 END IF 6363* 6364 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'GTVBVF') 6365 RETURN 6366 END 6367 SUBROUTINE NEWMO_FROM_KAPPA_NORT( 6368 & NOOEXC_A,IOOEXC_A,KAPPA_A, 6369 & NOOEXC_S,IOOEXC_S,KAPPA_S,CMOAO_IN,CMOAO_OUT) 6370* 6371* Obtain New MO coefficients from symmetric and anti-symmetric 6372* kappa for VB calculation: 6373* 6374* CMOAO_OUT = CMOAO_IN * Exp(-Kappa_A S) Exp(-Kappa_S S) 6375* 6376* Jeppe Olsen, July 24, 2011 6377* 6378 INCLUDE 'implicit.inc' 6379 INCLUDE 'mxpdim.inc' 6380 INCLUDE 'wrkspc-static.inc' 6381 INCLUDE 'lucinp.inc' 6382 INCLUDE 'orbinp.inc' 6383*. Input 6384 INTEGER IOOEXC_A(2,NOOEXC_A),IOOEXC_S(2,NOOEXC_S) 6385*. Antisymmetric and symmetric part of Kappa in packed form 6386 REAL*8 6387 &KAPPA_A(*),KAPPA_S(*) 6388 DIMENSION CMOAO_IN(*) 6389*. Output 6390 DIMENSION CMOAO_OUT(*) 6391* 6392 NTEST = 000 6393 IF(NTEST.GE.100) THEN 6394 WRITE(6,*) ' Output from NEWMO_FROM_KAPPA_NORT' 6395 WRITE(6,*) ' ================================ ' 6396 WRITE(6,*) 6397 END IF 6398 IF(NTEST.GE.100) THEN 6399 WRITE(6,*) ' Input KAPPA_A, KAPPA_S: ' 6400 CALL WRTMAT(KAPPA_A,1,NOOEXC_A,1,NOOEXC_A) 6401 WRITE(6,*) 6402 CALL WRTMAT(KAPPA_S,1,NOOEXC_S,1,NOOEXC_S) 6403 END IF 6404* 6405 IDUM = 0 6406 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'NWMONO') 6407* 6408* Obtain Kappa_A and Kappa_S in full form 6409* 6410 NDIM_1F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 6411 CALL MEMMAN(KLKAPPA_AE,NDIM_1F,'ADDL ',2,'KAPPAE') 6412 CALL MEMMAN(KLKAPPA_SE,NDIM_1F,'ADDL ',2,'KAPPSE') 6413C REF_GN_KAPPA(KAPPAP,KAPPAE,IAS,ISM,IWAY,IOOEX,NOOEX) 6414 CALL REF_GN_KAPPA(KAPPA_A,WORK(KLKAPPA_AE),1,1,1, 6415 & IOOEXC_A,NOOEXC_A) 6416 CALL REF_GN_KAPPA(KAPPA_S,WORK(KLKAPPA_SE),2,1,1, 6417 & IOOEXC_S,NOOEXC_S) 6418*, Obtain metric in MO basis 6419 CALL MEMMAN(KLS,NDIM_1F,'ADDL ',2,'SMOMO ') 6420 CALL GET_SMO(CMOAO_IN,WORK(KLS),0) 6421* 6422*. Obtain Exp (-Kappa_A S) Exp(-Kappa_S S) 6423* 6424 CALL MEMMAN(KLEXPMKS,NDIM_1F,'ADDL ',2,'SMOMO ') 6425C GET_EXPMKS(EXPMKS,KAPPA_S, KAPPA_A,S,NOBPS,NSMOB) 6426 CALL GET_EXPMKS(WORK(KLEXPMKS),WORK(KLKAPPA_SE), 6427 & WORK(KLKAPPA_AE),WORK(KLS), 6428 & NTOOBS,NSMOB) 6429* 6430* CMOAO_OUT = CMOAO_IN (-Kappa_A S) Exp(-Kappa_S S) 6431* 6432C MULT_BLOC_MAT(C,A,B,NBLOCK,LCROW,LCCOL,LAROW,LACOL,LBROW,LBCOL,ITRNSP) 6433 CALL MULT_BLOC_MAT(CMOAO_OUT,CMOAO_IN,WORK(KLEXPMKS),NSMOB, 6434 & NTOOBS,NTOOBS,NTOOBS,NTOOBS,NTOOBS,NTOOBS,0) 6435* 6436 IF(NTEST.GE.1000) THEN 6437 WRITE(6,*) 6438 WRITE(6,*) 6439 WRITE(6,*) ' CMOAO_OUT: ' 6440 CALL APRBLM2(CMOAO_OUT,NTOOBS,NTOOBS,NSMOB,0) 6441 END IF 6442* 6443 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'NWMONO') 6444* 6445 RETURN 6446 END 6447 SUBROUTINE GENERIC_JAC_FROM_VF(JAC,NDIM,E1FUNC,E1,X,IDOSYM, 6448 & ISTART,ISTOP) 6449* 6450*. Obtain Jacobian around X using external gradient function E1FUNC 6451* 6452* The Jacobian is assumed full, but is only calculated for 6453* the Columns ISTART to ISTOP 6454* 6455*. Jeppe Olsen, July 2011 6456*. Last modification; Jeppe Olsen; June 2013; ISTART, ISTOP added 6457* 6458 INCLUDE 'implicit.inc' 6459*. Input 6460 DIMENSION X(NDIM) 6461*. Output 6462 REAL*8 JAC(NDIM,NDIM) 6463*. External 6464 EXTERNAL E1FUNC 6465* 6466* IORDER = 2: - second order formulae: 6467* 6468* J Delta X = E1(X+Delta X) - E1(X-Delta) 6469* 6470* IORDER = 4: Fourth order formulae: 6471* 6472* J Delta X = (-1/12) ( (E1(X+2Delta X) - E1(X-2Delta X)) 6473* -8.0D0*(E1(X+Delta X) - E1(X-Delta X) )) 6474* 6475* 6476* 6477 IORDER = 2 6478* 6479 NTEST = 10 6480 IF(NTEST.GE.10) THEN 6481 WRITE(6,*) 6482 WRITE(6,*) ' Info from GENERIC_JAC_FROM_VF ' 6483 WRITE(6,*) ' ==============================' 6484 WRITE(6,*) 6485 WRITE(6,*) ' Order of method in use ', IORDER 6486 END IF 6487 IF(NTEST.GE.1000) THEN 6488 WRITE(6,*) ' Initial set of parameters ' 6489 CALL WRTMAT(X,1,NDIM,1,NDIM) 6490 END IF 6491*Evaluate vector function at point of expansion for check 6492C? CALL E1FUNC(X,E1) 6493C? WRITE(6,*) ' Vector function at initial point' 6494C? CALL WRTMAT(E1,1,NDIM,1,NDIM) 6495C? STOP ' After initial test ' 6496* 6497 6498* 6499*. Shift and constants for finite difference 6500 IF(IORDER.EQ.2) THEN 6501 DELTA = 1.0D-4 6502 FAC1 = 0.5D0/DELTA 6503 ELSE IF (IORDER.EQ.4) THEN 6504 DELTA = 1.0D-2 6505 FAC1 = 1.0D0/(12.0D0*DELTA) 6506 FAC2 = 8.0D0/(12.0D0*DELTA) 6507 END IF 6508* 6509 IF(IORDER.EQ.2) THEN 6510 DO J = ISTART, ISTOP 6511* E1(X+Delta X) 6512 X(J) = X(J) + DELTA 6513 CALL E1FUNC(X,E1) 6514 CALL COPVEC(E1,JAC(1,J),NDIM) 6515 CALL SCALVE(JAC(1,J),FAC1,NDIM) 6516 IF(NTEST.GE.1000) THEN 6517 WRITE(6,*) ' E1(X+Delta)*FAC1: ' 6518 CALL WRTMAT(JAC(1,J),1,NDIM,1,NDIM) 6519 END IF 6520* E1(X-Delta X) 6521 X(J) = X(J) - DELTA - DELTA 6522 CALL E1FUNC(X,E1) 6523 ONE = 1.0D0 6524 FAC1M = -FAC1 6525 CALL VECSUM(JAC(1,J),JAC(1,J),E1,ONE,FAC1M,NDIM) 6526 IF(NTEST.GE.1000) THEN 6527 WRITE(6,*) ' (E1(X+Delta)-E1(X-Delta))*FAC1: ' 6528 CALL WRTMAT(JAC(1,J),1,NDIM,1,NDIM) 6529 END IF 6530*. Clean up 6531 X(J) = X(J) + DELTA 6532 END DO 6533 ELSE IF (IORDER.EQ.4) THEN 6534 DO J = 1, NDIM 6535* E1(X+2Delta X) 6536 X(J) = X(J) + 2.0D0*DELTA 6537 CALL E1FUNC(X,E1) 6538 CALL COPVEC(E1,JAC(1,J),NDIM) 6539 CALL SCALVE(JAC(1,J),-FAC1,NDIM) 6540* E1(X-2Delta X) 6541 X(J) = X(J) - 2.0D0*DELTA - 2.0D0*DELTA 6542 CALL E1FUNC(X,E1) 6543 ONE = 1.0D0 6544 CALL VECSUM(JAC(1,J),JAC(1,J),E1,ONE,FAC1,NDIM) 6545* E1(X+ Delta X) 6546 X(J) = X(J) + 2.0D0*DELTA + DELTA 6547 CALL E1FUNC(X,E1) 6548 ONE = 1.0D0 6549 CALL VECSUM(JAC(1,J),JAC(1,J),E1,ONE,FAC2,NDIM) 6550* E1(X- Delta X) 6551 X(J) = X(J) - DELTA - DELTA 6552 CALL E1FUNC(X,E1) 6553 ONE = 1.0D0 6554 CALL VECSUM(JAC(1,J),JAC(1,J),E1,ONE,-FAC2,NDIM) 6555*. Clean up 6556 X(J) = X(J) + DELTA 6557 END DO 6558 END IF !Switch between the two procedures 6559* 6560 IF(IDOSYM.EQ.1) THEN 6561*. Symmetrize Jacobian 6562 DO I = 1, NDIM 6563 DO J = 1, I 6564 JAC(I,J) = 0.5D0*(JAC(I,J) + JAC(J,I)) 6565 JAC(J,I) = JAC(I,J) 6566 END DO 6567 END DO 6568 END IF 6569* 6570 IF(NTEST.GE.100) THEN 6571 WRITE(6,*) ' Output from GENERIC_JAC_FROM_VF ' 6572 WRITE(6,*) ' =================================' 6573 WRITE(6,*) 6574 CALL WRTMAT(JAC,NDIM,NDIM,NDIM,NDIM) 6575 END IF 6576* 6577 RETURN 6578 END 6579 SUBROUTINE GENERIC_GRAD_FROM_F(GRAD,NDIM,EFUNC,X) 6580* 6581*. Obtain gradient around X using external function EFUNC 6582* 6583*. Jeppe Olsen, July 2011 6584* 6585 INCLUDE 'implicit.inc' 6586*. Input 6587 DIMENSION X(NDIM) 6588*. Output 6589 REAL*8 GRAD(NDIM) 6590*. External 6591 EXTERNAL EFUNC 6592*. The Gradient is obtained from finite difference using 6593* Gradient Delta X = (-1/12) ( (E(X+2Delta X) - E(X-2Delta X)) 6594* -8.0D0*(E(X+Delta X) - E(X-Delta X) )) 6595* 6596*. Shift for finite difference 6597 DELTA = 1.0D-3 6598* 6599 DO J = 1, NDIM 6600* E(X+2Delta X) 6601 X(J) = X(J) + 2.0D0*DELTA 6602 EP2D = EFUNC(X) 6603* E1(X-2Delta X) 6604 X(J) = X(J) - 2.0D0*DELTA - 2.0D0*DELTA 6605 EM2D = EFUNC(X) 6606* E(X+ Delta X) 6607 X(J) = X(J) + 2.0D0*DELTA + DELTA 6608 EP1D = EFUNC(X) 6609* E1(X- Delta X) 6610 X(J) = X(J) - DELTA - DELTA 6611 EM1D = EFUNC(X) 6612*. And the synthesis 6613 GRAD(J) = -1.0D0/(12.0D0*DELTA)*(EP2D-EM2D) 6614 & +8.0D0/(12.0D0*DELTA)*(EP1D-EM1D) 6615*. Clean up 6616 X(J) = X(J) + DELTA 6617 END DO 6618* 6619 NTEST = 100 6620 IF(NTEST.GE.100) THEN 6621 WRITE(6,*) ' Output from GENERIC_GRAD_FROM_F ' 6622 WRITE(6,*) ' =================================' 6623 WRITE(6,*) 6624 CALL WRTMAT(GRAD,1,NDIM,1,NDIM) 6625 END IF 6626* 6627 RETURN 6628 END 6629 FUNCTION E_VB_FROM_KAPPA_WRAP(KAPPA) 6630* 6631* Wrapper routine for calculating Valence bond energy 6632* from Kappa 6633* It is required that common /EVB_TRANS/ has been defined 6634* 6635*. Jeppe Olsen, July 25, 2011, on the train to Fjerritslev- cannot get the 6636* code out of my head.. 6637* 6638 INCLUDE 'implicit.inc' 6639 INCLUDE 'mxpdim.inc' 6640 INCLUDE 'wrkspc-static.inc' 6641 INCLUDE 'glbbas.inc' 6642 INCLUDE 'crun.inc' 6643 COMMON/EVB_TRANS/KLIOOEXC_A, KLKAPPA_A, 6644 & KLIOOEXC_S,KLKAPPA_S, 6645 & KL_C,KL_VEC2,KL_VEC3 6646*. Input 6647 REAL*8 KAPPA(*) 6648 NTEST = 00 6649 IF(NTEST.GE.100) THEN 6650 WRITE(6,*) ' Output from E_VB_FROM_KAPPA_WRAP' 6651 WRITE(6,*) ' ================================' 6652 WRITE(6,*) 6653 WRITE(6,*) ' Kappa_A, Kappa_S ' 6654 WRITE(6,*) 6655 CALL WRTMAT(KAPPA(1),NOOEXC_A,1,NOOEXC_A) 6656 WRITE(6,*) 6657 CALL WRTMAT(KAPPA(1+NOOEXC_A),1,NOOEXC_S,1,NOOEXC_S) 6658 END IF 6659* 6660 E_VB_FROM_KAPPA_WRAP = 6661 &E_VB_FROM_KAPPA(KAPPA,NOOEXC_A,WORK(KLIOOEXC_A), 6662 & KAPPA(1+NOOEXC_A),NOOEXC_S,WORK(KLIOOEXC_S), 6663 & WORK(KL_C),WORK(KL_VEC2),WORK(KL_VEC3)) 6664C E_VB_FROM_KAPPA( 6665C & KAPPA_A,NOOEXC_A,IOOEXC_A, 6666C & KAPPA_S,NOOEXC_S,IOOEXC_S,CCI, 6667C & VEC1_CSF,VEC2_CSF) 6668* 6669 IF(NTEST.GE.10) THEN 6670 WRITE(6,*) ' Energy from E_VB_FROM_KAPPA_WRAP ' 6671 WRITE(6,'(A,E15.8)') ' E = ', E_VB_FROM_KAPPA_WRAP 6672 END IF 6673* 6674 RETURN 6675 END 6676 FUNCTION E_VB_FROM_KAPPA( 6677 & KAPPA_A,NOOEXC_A,IOOEXC_A, 6678 & KAPPA_S,NOOEXC_S,IOOEXC_S,CCI, 6679 & VEC1_CSF,VEC2_CSF) 6680* 6681* Obtain Valence bond energy from Kappa_A, Kappa_S 6682* Using method with expansion in complete VI space 6683* 6684*. It is assumed that the current MO-AO coefficients are in KMOAOIN. 6685* Integrals etc are overwritten, so the exit from this routine is 6686* not clean. 6687* 6688*. Jeppe Olsen, July 24 2011 6689* 6690 INCLUDE 'implicit.inc' 6691 INCLUDE 'mxpdim.inc' 6692 INCLUDE 'wrkspc-static.inc' 6693 INCLUDE 'glbbas.inc' 6694 INCLUDE 'lucinp.inc' 6695 INCLUDE 'orbinp.inc' 6696 INCLUDE 'cintfo.inc' 6697 INCLUDE 'spinfo.inc' 6698*. Common block for communicating with sigma 6699 COMMON/SCRFILES_MATVEC/LUSCR1,LUSCR2,LUSCR3, 6700 & LUCBIO_SAVE, LUHCBIO_SAVE,LUC_SAVE 6701*. Specific input 6702 INTEGER IOOEXC_A(2,NOOEXC_A), IOOEXC_S(2,NOOEXC_S) 6703 REAL*8 KAPPA_A(*), KAPPA_S(*) 6704 DIMENSION CCI(*) 6705 REAL*8 INPRDD 6706*. Scratch 6707 DIMENSION VEC1_CSF(*),VEC2_CSF(*) 6708* 6709 NTEST = 00 6710 IF(NTEST.GE.100) THEN 6711 WRITE(6,*) ' info from E_VB_FROM_KAPPA ' 6712 WRITE(6,*) ' ==========================' 6713 END IF 6714 IF(NTEST.GE.100) THEN 6715 WRITE(6,*) 6716 WRITE(6,*) ' Input Kappa_A and Kappa_S ' 6717 CALL WRTMAT(KAPPA_A,1,NOOEXC_A,1,NOOEXC_A) 6718 WRITE(6,*) 6719 CALL WRTMAT(KAPPA_S,1,NOOEXC_S,1,NOOEXC_S) 6720 END IF 6721* 6722 IDUM = 0 6723 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'EVBFKA') 6724* 6725*. Obtain New MO coefficients in MOAOUT: MOAOIN* Exp(-Kappa_A S) Exp(-Kappa_S S) 6726* 6727C NEWMO_FROM_KAPPA_NORT( 6728C & NOOEXC_A,IOOEXC_A,KAPPA_A, 6729C & NOOEXC_S,IOOEXC_S,KAPPA_S,CMOAO_IN,CMOAO_OUT) 6730C? WRITE(6,*) ' NOOEXC_A, NOOEXC_S before call to NEWMO' , 6731C? & NOOEXC_A, NOOEXC_S 6732 CALL NEWMO_FROM_KAPPA_NORT( 6733 & NOOEXC_A,IOOEXC_A,KAPPA_A,NOOEXC_S,IOOEXC_S,KAPPA_S, 6734 & WORK(KMOAOIN),WORK(KMOAOUT)) 6735* 6736* Obtain the set of biorthonormal orbitals 6737* 6738 CALL GET_CBIO(WORK(KMOAOUT),WORK(KCBIO),WORK(KCBIO2)) 6739* 6740* Biorthonormal integral transformaion 6741* 6742 IF(NTEST.GE.10) THEN 6743 WRITE(6,*) ' Bioorthogonal integral transformation ' 6744 END IF 6745* 6746 IE2LIST_A = IE2LIST_FULL_BIO 6747 IOCOBTP_A = 1 6748 INTSM_A = 1 6749 CALL PREPARE_2EI_LIST 6750* 6751 KKCMO_I = KMOAOUT 6752 KKCMO_J = KCBIO2 6753 KKCMO_K = KMOAOUT 6754 KKCMO_L = KCBIO2 6755* 6756C DO_ORBTRA(IDOTRA,IDOFI,IDOFA,IE2LIST_IN,IOCOBTP_IN,INTSM_IN) 6757 CALL DO_ORBTRA(1,1,0,IE2LIST_FULL_BIO,IOCOBTP_A,INTSM_A) 6758 CALL FLAG_ACT_INTLIST(IE2LIST_FULL_BIO) 6759 NINT1_F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 6760 CALL COPVEC(WORK(KFI),WORK(KINT1),NINT1_F) 6761* 6762*. Sigma with the current C 6763* 6764C SIGMA_NORTCI(C,HC,SC,IDOHC,IDOSC) 6765 CALL SIGMA_NORTCI(CCI,VEC1_CSF,VEC2_CSF,1,1) 6766 IF(NTEST.GE.1000) WRITE(6,*) ' Back from SIGMA_NORTCI' 6767* calculate energy from vectors on file 6768 CHC = INPRDD(WORK(KVEC1P),WORK(KVEC2P),LUC_SAVE,LUHCBIO_SAVE,1,-1) 6769 CC = INPRDD(WORK(KVEC1P),WORK(KVEC2P),LUC_SAVE,LUCBIO_SAVE,1,-1) 6770 EVB = CHC/CC 6771* 6772 E_VB_FROM_KAPPA = EVB 6773* 6774 WRITE(6,'(A,3(2X,E14.8))') ' Energy: CHC, CC, CHC/CC ', 6775 & CHC,CC,EVB 6776* 6777 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'EVBFKA') 6778 RETURN 6779 END 6780 SUBROUTINE ORBHES_VB(E2,IFORM) 6781* 6782*Obtain complete or part of Orbital Hessian for VB approach 6783* 6784* IFORM = 1 => Complete orbital Hessian 6785* 6786*. Jeppe Olsen, July 26, 2011 6787* 6788 INCLUDE 'implicit.inc' 6789 INCLUDE 'mxpdim.inc' 6790 INCLUDE 'orbinp.inc' 6791 INCLUDE 'lucinp.inc' 6792 INCLUDE 'crun.inc' 6793 INCLUDE 'glbbas.inc' 6794 INCLUDE 'intform.inc' 6795 INCLUDE 'cintfo.inc' 6796 INCLUDE 'wrkspc-static.inc' 6797*. Output: Complete orbital Hessian in lower packed form 6798 DIMENSION E2(*) 6799 EXTERNAL VB_BR_FOR_KAPPA_WRAP 6800* 6801* Method for calculating orbital Hesssian 6802 I_ORBHES_MET = 2 6803* IORBHES_MET = 1 => Finite difference based on energy 6804* IORBHES_MET = 2 => Finite difference bases on Vector function 6805* IORBHES_MET = 2 => Analytic calc of antisym, FD calc of symmetric part 6806 NTEST = 000 6807 IF(NTEST.GE.10) THEN 6808 WRITE(6,*) ' Info from ORBHES_FD' 6809 WRITE(6,*) ' ================== ' 6810 WRITE(6,*) 6811 IF(I_ORBHES_MET.EQ.1) THEN 6812 WRITE(6,*) 6813 & ' Orbital Hessian obtained from energy finite difference' 6814 ELSE IF( I_ORBHES_MET.EQ.2) THEN 6815 WRITE(6,*) 6816 & ' Orbital Hessian obtained from gradient finite difference' 6817 END IF 6818 END IF 6819* 6820 IDUM = 0 6821 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'OBE2VB') 6822* 6823 KKCMO_I = KMOAOUT 6824 KKCMO_J = KCBIO2 6825 KKCMO_K = KMOAOUT 6826 KKCMO_L = KCBIO2 6827* 6828 NOOEXC_TOT = NOOEXC_A + NOOEXC_S 6829* 6830 IF(I_ORBHES_MET .EQ. 1) THEN 6831 CALL ORBHES_VB_FD(E2) 6832 ELSE 6833* A local copy of complete Hessian, BR-vector and kappa 6834 CALL MEMMAN(KLE2,NOOEXC_TOT**2,'ADDL ',2,'E2FULL') 6835 CALL MEMMAN(KLBR,NOOEXC_TOT,'ADDL ',2,'BRVEC ') 6836 CALL MEMMAN(KLKAP,NOOEXC_TOT,'ADDL ',2,'KLKAP ') 6837* 6838* We will evaluate Hessian at current expansion point, so 6839 ZERO = 0.0D0 6840 CALL SETVEC(WORK(KLKAP),ZERO,NOOEXC_TOT) 6841*. FUSK 6842 IREADJ = 0 6843 IF(IREADJ.EQ.1) THEN 6844*. Jacobian is read in rather than constructed ' 6845 WRITE(6,*) ' WARNING: JACO READ IN FROM LU95 ' 6846 LU95 = 95 6847 CALL REWINO(LU95) 6848 NELMNT = NOOEXC_TOT*(NOOEXC_TOT+1)/2 6849 READ(LU95,*) (E2(IJ), IJ = 1, NELMNT) 6850 ELSE 6851* 6852 CALL GENERIC_JAC_FROM_VF(WORK(KLE2),NOOEXC_TOT, 6853 & VB_BR_FOR_KAPPA_WRAP, WORK(KLBR),WORK(KLKAP),1, 6854 & 1, NOOEXC_TOT) 6855C GENERIC_JAC_FROM_VF(JAC,NDIM,E1FUNC,E1,X,IDOSYM) 6856C TRIPAK(AUTPAK,APAK,IWAY,MATDIM,NDIM) 6857 CALL TRIPAK(WORK(KLE2),E2,1,NOOEXC_TOT,NOOEXC_TOT) 6858 END IF ! JACO read in 6859 END IF ! I_ORBHES_MET = 1 6860* 6861 IDUMPJ = 1 6862 IF(IDUMPJ.EQ.1) THEN 6863 WRITE(6,*) ' Jacobian is dumped to file 95 ' 6864 LU95 = 95 6865 CALL REWINO(LU95) 6866 NELMNT = NOOEXC_TOT*(NOOEXC_TOT+1)/2 6867 WRITE(LU95,*) (E2(IJ), IJ = 1, NELMNT) 6868 END IF 6869 6870* 6871 IF(I_ORBHES_MET.LE.2) THEN 6872*. Restore order- and integrals 6873 IE2LIST_A = IE2LIST_FULL_BIO 6874 IOCOBTP_A = 1 6875 INTSM_A = 1 6876 CALL PREPARE_2EI_LIST 6877 CALL GET_CBIO(WORK(KMOAOIN),WORK(KCBIO),WORK(KCBIO2)) 6878* 6879 KKCMO_I = KMOAOIN 6880 KKCMO_J = KCBIO2 6881 KKCMO_K = KMOAOIN 6882 KKCMO_L = KCBIO2 6883* 6884C DO_ORBTRA(IDOTRA,IDOFI,IDOFA,IE2LIST_IN,IOCOBTP_IN,INTSM_IN) 6885 CALL DO_ORBTRA(1,1,0,IE2LIST_FULL_BIO,IOCOBTP_A,INTSM_A) 6886 NINT1_F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 6887 CALL COPVEC(WORK(KFI),WORK(KINT1),NINT1_F) 6888 CALL FLAG_ACT_INTLIST(IE2LIST_FULL_BIO) 6889 END IF 6890* 6891 IF(NTEST.GE.1000) THEN 6892 NOOEXC_TOT = NOOEXC_A + NOOEXC_S 6893 WRITE(6,*) ' Orbital Hessian ' 6894 CALL APRBLM2(E2,NOOEXC_TOT,NOOEXC_TOT,1,1) 6895 END IF 6896* 6897 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'OBE2VB') 6898 RETURN 6899 END 6900 SUBROUTINE ORBHES_VB_FD(E2) 6901* 6902*. Obtain Orbital Hessian for VB by energy Finite difference 6903* 6904*. Jeppe Olsen, July 28, 2011 6905* 6906 INCLUDE 'implicit.inc' 6907 INCLUDE 'mxpdim.inc' 6908 INCLUDE 'wrkspc-static.inc' 6909 INCLUDE 'crun.inc' 6910* EVB_TRANS must have been set outside 6911 COMMON/EVB_TRANS/KLIOOEXC_A, KLKAPPA_A, 6912 & KLIOOEXC_S,KLKAPPA_S, 6913 & KL_C,KL_VEC2,KL_VEC3 6914 EXTERNAL E_VB_FROM_KAPPA_WRAP 6915* 6916*. Output: Hessian in lower packed form 6917* 6918 DIMENSION E2(*) 6919* 6920 IDUM = 0 6921 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'OBE2FD') 6922*. Copy of Hessian in complete form 6923 NOOEXC_T = NOOEXC_A + NOOEXC_S 6924 CALL MEMMAN(KLE2F,NOOEXC_T**2,'ADDL ',2,'E2F ') 6925* 6926 CALL MEMMAN(KLE1,NOOEXC_T,'ADDL ',2,'KLE1') 6927C GENERIC_GRA_HES_FD(E0,E1,E2,X,NX,EFUNC) 6928 KLKAPPA = KLKAPPA_A 6929 ZERO = 0.0D0 6930 CALL SETVEC(WORK(KLKAPPA),ZERO,NOOEXC_T) 6931 CALL GENERIC_GRA_HES_FD(E0,WORK(KLE1),WORK(KLE2F),WORK(KLKAPPA), 6932 & NOOEXC_T,E_VB_FROM_KAPPA_WRAP) 6933*. Pack to lower half 6934 CALL TRIPAK(WORK(KLE2F),E2,1,NOOEXC_T,NOOEXC_T) 6935C TRIPAK(AUTPAK,APAK,IWAY,MATDIM,NDIM) 6936* 6937 NTEST = 1000 6938 IF(NTEST.GE.100) THEN 6939 WRITE(6,*) ' Output from ORBHES_VB_FD ' 6940 WRITE(6,*) ' =========================' 6941 WRITE(6,*) 6942 WRITE(6,'(A,E15.8)') ' Current energy = ', E0 6943 WRITE(6,'(A)') ' Gradient: ' 6944 CALL WRTMAT(WORK(KLE1),1,NOOEXC_T,1,NOOEXC_T) 6945 END IF 6946 IF(NTEST.GE.1000) THEN 6947 WRITE(6,'(A)') ' Hessian: ' 6948 CALL PRSYM(E2,NOOEXC_T) 6949C? CALL WRTMAT(E2,NOOEXC_T,NOOEXC_T,NOOEXC_T,NOOEXC_T) 6950 END IF 6951* 6952 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'OBE2FD') 6953 RETURN 6954 END 6955 SUBROUTINE GET_CMOINI_GEN(CINIAO_UT,CINIUT_INIIN,CINIAO_IN) 6956* 6957* Obtain starting set of orbitals. 6958* May be obtained from fragment orbitals 6959* 6960*. Output: 6961* Expansion of starting orbitals in AO: CINIAO_UT 6962* Expansion of starting orbitals in initial orbitals: CINIUT_INIIN 6963* Input: 6964* Expansion of initial initial orbitals: CINIAO_IN 6965 6966* 6967*. Jeppe Olsen, April 2012, extended June 2012 6968* March 2013, added a bit for supersymmetry 6969* 6970 INCLUDE 'implicit.inc' 6971 INCLUDE 'mxpdim.inc' 6972 INCLUDE 'wrkspc-static.inc' 6973 INCLUDE 'crun.inc' 6974 INCLUDE 'fragmol.inc' 6975 INCLUDE 'glbbas.inc' 6976 INCLUDE 'lucinp.inc' 6977 INCLUDE 'orbinp.inc' 6978 INCLUDE 'cgas.inc' 6979*. Input 6980 DIMENSION CINIAO_IN(*) 6981*. Output 6982 DIMENSION CINIAO_UT(*), CINIUT_INIIN(*) 6983* 6984 IDUM = 0 6985 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUN,'MOING') 6986 NTEST = 10 6987 IF(NTEST.GE.1000) THEN 6988 WRITE(6,*) ' Wellcome to GET_CMOINI_GEN' 6989 WRITE(6,*) ' ==========================' 6990 END IF 6991* 6992 IF(NTEST.GE.2) THEN 6993C WRITE(6,*) ' INI_MO_TP, INI_MO_ORT = ', INI_MO_TP, INI_MO_ORT 6994 WRITE(6,*) 6995 WRITE(6,*) ' ======================= ' 6996 WRITE(6,*) ' Initial set of orbitals ' 6997 WRITE(6,*) ' ======================= ' 6998 WRITE(6,*) 6999* 7000 IF(INI_MO_TP.EQ.1) THEN 7001 WRITE(6,'(4X,A)') ' Atomic orbitals will be used ' 7002 ELSE IF (INI_MO_TP.EQ.2) THEN 7003 WRITE(6,'(4X,A)') 7004 & ' Input MOs in VB space rotated to give diagonal block' 7005 ELSE IF (INI_MO_TP.EQ.3) THEN 7006 WRITE(6,'(4X,A)') 7007 & ' Initial MO orbitals from SIRIFC/91 will be used' 7008 ELSE IF (INI_MO_TP.EQ.4) THEN 7009 WRITE(6,'(4X,A)') 7010 & ' Constructed from fragment orbitals' 7011 ELSE IF (INI_MO_TP.EQ.5) THEN 7012 WRITE(6,'(4X,A)') 7013 & ' Initial MO orbitals from LUCINF_O will be used' 7014 END IF 7015* 7016 IF(INI_MO_TP.NE.3) THEN 7017 WRITE(6,'(4X,A)') 7018 & ' Orbitals in inactive and secondary space will be ort.' 7019 WRITE(6,'(4X,A)') ' Orbitals in GAS orbital spaces(.ne. VB ): ' 7020 IF(INI_MO_ORT.EQ.0) THEN 7021 WRITE(6,'(6X,A)') ' No orthogonalization ' 7022 ELSE IF (INI_MO_ORT.EQ.1) THEN 7023 WRITE(6,'(6X,A)') ' Orthogonalized' 7024 END IF 7025 WRITE(6,'(4X,A)') ' Orbitals in VB orbital space: ' 7026 IF(INI_ORT_VBGAS.EQ.0) THEN 7027 WRITE(6,'(6X,A)') ' No orthogonalization ' 7028 ELSE IF (INI_ORT_VBGAS.EQ.1) THEN 7029 WRITE(6,'(6X,A)') ' Orthogonalized' 7030 END IF 7031 END IF 7032* 7033*. In general, the output form of the orbitals are unknown 7034* 7035 CMO_ORD = 'UNK' 7036* 7037 IF(INI_MO_TP.EQ.4) THEN 7038 WRITE(6,*) ' Distribution of orbitals from fragments:' 7039 DO IFRAG = 1, NFRAG_MOL 7040 NSMOB_L = NSMOB_FRAG(IFRAG) 7041 WRITE(6,'(A,I3)') ' For fragment ', IFRAG 7042 WRITE(6,*) ' ====================' 7043 WRITE(6,*) ' Number of orbitals per GAS (row) and sym (col) ' 7044 CALL IWRTMA 7045 & (N_GS_SM_BAS_FRAG(0,1,IFRAG),NGAS+2,NSMOB_L,MXPNGAS+1,MXPOBS) 7046 END DO 7047 END IF ! End if INI_MO_TP.eq.4 7048 END IF !NTEST test 7049* 7050* Two steps : 0) Orthogonalize to frozen orbitals 7051* 1) Obtain a set of (nonorthogonal) initial orbitals 7052* 2) Perform (partial) orthonormalization to obtain 7053* Final initial orbitals 7054* 7055* Generate set of (nonorthogonal) initial orbitals 7056* 7057 CALL GET_INIMO(CINIAO_UT) 7058C GET_INIMO(CMO_INI) 7059* 7060* 7061 IF(NTEST.GE.100) THEN 7062 WRITE(6,*) ' Expansion of initial MOs in AOs ' 7063 WRITE(6,*) ' ================================' 7064 CALL APRBLM_F7(CINIAO_UT,NTOOBS,NTOOBS,NSMOB,0) 7065 END IF 7066*. MO_TP = 3 => we are done... 7067 IF(INI_MO_TP.EQ.3) GOTO 9999 7068* 7069*. Orthogonalize to frozen orbitals 7070*. Jeppe, I am not sure if this is working in connection with supersymmetry reordering... 7071*. (What are the numbers defining the localized orbitals?) 7072 IF(NFRZ_ORB.NE.0) THEN 7073 CALL ORT_CMO_TO_FROZEN_ORBITALS(CINIAO_UT) 7074 IF(NTEST.GE.100) THEN 7075 WRITE(6,*) ' Orbitals orthogonalized to frozen ' 7076 CALL APRBLM_F7(CINIAO_UT,NTOOBS,NTOOBS,NSMOB,0) 7077 END IF 7078 END IF 7079* 7080 CMO_ORD = 'UNK' 7081* 7082* New initial orbitals in terms of initial initial orbitals(KMOAOIN) 7083* 7084* CINIUT_INIIN = CINIAO_UT* CINIAO_IN**-1 7085* 7086*. Invert CINIAO_IN 7087 LMOMO = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 7088 CALL MEMMAN(KLCMOS,2*LMOMO,'ADDL ',2,'CMOS ') 7089 CALL MEMMAN(KLCMOI, LMOMO,'ADDL ',2,'CMOI ') 7090 IPROBLEM = 0 7091 CALL INV_BLKMT(CINIAO_IN,WORK(KLCMOI),WORK(KLCMOS),NSMOB, 7092 & NTOOBS,IPROBLEM) 7093C INV_BLKMT(A,AINV,SCR,NBLK,LBLK,IPROBLEM) 7094 IF(IPROBLEM.NE.0) THEN 7095 WRITE(6,*) ' Problem inverting CMOAOUT ' 7096 STOP ' Problem inverting CMOAOUT ' 7097 END IF 7098*. And multiply 7099C MULT_H1H2(H1,IH1SM,H2,IH2SM,H12,IH12SM) 7100 CALL MULT_H1H2(WORK(KLCMOI),1,CINIAO_UT,1,CINIUT_INIIN,IUTSM) 7101* 7102 IF(NTEST.GE.100) THEN 7103 WRITE(6,*) 7104 & ' Expansion of initial MOs in Initial initial MOs ' 7105 WRITE(6,*) ' =====================================' 7106 CALL APRBLM_F7(CINIUT_INIIN,NTOOBS,NTOOBS,NSMOB,0) 7107 END IF 7108* 7109* Check of orthogonality of reexpansion of initial orbitals 7110* 7111C MULT_BLOC_MAT(C,A,B,NBLOCK,LCROW,LCCOL, 7112C & LAROW,LACOL,LBROW,LBCOL,ITRNSP) 7113 CALL MULT_BLOC_MAT(WORK(KLCMOS),CINIUT_INIIN,CINIUT_INIIN,NSMOB, 7114 & NTOOBS,NTOOBS,NTOOBS,NTOOBS,NTOOBS,NTOOBS,1) 7115* 7116 IF(NTEST.GE.100) THEN 7117 WRITE(6,*) ' CINIUT_INIIN*CINIUT_INIIN(T) ' 7118 WRITE(6,*) ' =============================' 7119 CALL APRBLM2(WORK(KLCMOS),NTOOBS,NTOOBS,NSMOB,0) 7120 END IF 7121* 7122 9999 CONTINUE 7123* 7124 CALL MEMMAN(IDUM,IDUM,'FLUSM',IDUN,'MOING') 7125* 7126 RETURN 7127 END 7128 SUBROUTINE EXTR_SYMGAS_BLK_FROM_ORBMAT 7129 & (A,ABLK,ISM,IGAS,JSM,JGAS) 7130* 7131* A symmetryblocked (not lower half packed) matrix A over orbitals is given 7132* Extract block referring to GASpaCE IGAS, JGAS and symmetry ISM,JSM 7133* 7134* I_EX_OR_CP = 1 => Extract from A to IGAS 7135* I_EX_OR_CP = 1 => Copy from IGAS to A 7136* 7137*. Jeppe Olsen, May 2012 7138* 7139 INCLUDE 'implicit.inc' 7140 INCLUDE 'mxpdim.inc' 7141 INCLUDE 'orbinp.inc' 7142 INCLUDE 'lucinp.inc' 7143 INCLUDE 'multd2h.inc' 7144*. Specific input and output 7145 DIMENSION A(*), ABLK(*) 7146* 7147 NTEST = 00 7148 IF(NTEST.GE.100) THEN 7149 WRITE(6,*) ' EXTR_SYMGAS_BLK_FROM_ORBMAT ' 7150 WRITE(6,*) ' =========================== ' 7151 END IF 7152 7153*. Symmetry of matrix 7154 IJSM = MULTD2H(ISM,JSM) 7155*. Offsets to symmetry block in full matrix matrix 7156 IOFF_IN = 1 7157 DO IISM = 1, ISM-1 7158 JJSM = MULTD2H(IISM,IJSM) 7159 IOFF_IN = IOFF_IN + NTOOBS(IISM)*NTOOBS(JJSM) 7160 END DO 7161*. Offset to start of orbitals in given gas 7162 IOFF = 1 7163 DO IIGAS = 0, IGAS -1 7164 IOFF = IOFF + NOBPTS_GN(IIGAS,ISM) 7165 END DO 7166* 7167 JOFF = 1 7168 DO JJGAS = 0, JGAS -1 7169 JOFF = JOFF + NOBPTS_GN(JJGAS,JSM) 7170 END DO 7171* 7172 NI = NOBPTS_GN(IGAS,ISM) 7173 NJ = NOBPTS_GN(JGAS,JSM) 7174 NIS = NTOOBS(ISM) 7175 NJS = NTOOBS(JSM) 7176 DO J = 1, NJ 7177 DO I = 1, NI 7178 IJ_OUT = (J-1)*NI + I 7179 IJ_IN = IOFF_IN -1 + (JOFF+J-1-1)*NIS + IOFF+I-1 7180 ABLK(IJ_OUT) = A(IJ_IN) 7181 END DO 7182 END DO 7183* 7184 IF(NTEST.GE.100) THEN 7185 WRITE(6,*) ' Submatrix with ISM, JSM, IGAS, JGAS = ', 7186 & ISM, JSM, IGAS, JGAS 7187 CALL WRTMAT(ABLK,NI,NJ,NI,NJ) 7188 END IF 7189 IF(NTEST.GE.1000) THEN 7190 WRITE(6,*) ' Full matrix ' 7191 CALL APRBLM2(A,NTOOBS,NTOOBS,NSMOB,0) 7192 END IF 7193* 7194 RETURN 7195 END 7196 SUBROUTINE VB_DENSI(RHO1,RHO2,IR12,C,VEC1_CSF,VEC2_CSF) 7197* 7198* 7199* Obtain one-body density matrix over active space for VB function 7200* 7201* 7202* E(IJ) = <0!(E(ij))!0> /<0!0> 7203* 7204* and if IR12 = 2 also the two-body density matrix in mixed basis 7205* E(IJ,KL) = <0!\tilde a+i \sigma \tilde a+k sigma' a l sigma' a j sigma!0> 7206* 7207* Note that whereas the one-eletron density is transformed to the 7208* actual MO-basis, the two-body density is kept in the mixed basis 7209* 7210* So to obtain gradient 7211* 1: construct bioorthogonal expansion of !0> 7212* 2: Set up density matrices <0!E(ij)!0> 7213* where i is in biobase and j in normal 7214* 3: Transform density matrices to standard basis 7215* 7216* The current CI coefficients in the CSF basis are in C, where 7217* VEC1_CSF, VEC2_CSF, must be able to hold these expansions 7218* 7219* This is an initial version, for initial calculations and checks 7220* 7221* Jeppe Olsen, May 2012, for the initial NORTMCSCF program 7222* 7223* Sitting in Palermo, preparing for a talk ... 7224* 7225 INCLUDE 'implicit.inc' 7226 INCLUDE 'mxpdim.inc' 7227 INCLUDE 'wrkspc-static.inc' 7228 INCLUDE 'lucinp.inc' 7229 INCLUDE 'orbinp.inc' 7230 INCLUDE 'clunit.inc' 7231 INCLUDE 'glbbas.inc' 7232 INCLUDE 'crun.inc' 7233 COMMON/SCRFILES_MATVEC/LUSCR1,LUSCR2,LUSCR3, 7234 & LUCBIO_SAVE, LUHCBIO_SAVE,LUC_SAVE 7235 REAL*8 INPRDD 7236*. Input 7237 DIMENSION C(*) 7238*. Scratch 7239 DIMENSION VEC1_CSF(*), VEC2_CSF(*) 7240*. Output 7241 DIMENSION RHO1(*), RHO2(*) 7242* 7243 NTEST = 10 7244*. CSFs are handled explicitly, so 7245 NOCSF = 1 7246* 7247 IF(NTEST.GE.100) THEN 7248 WRITE(6,*) 7249 WRITE(6,*) ' ========' 7250 WRITE(6,*) ' VB_DENSI' 7251 WRITE(6,*) ' ========' 7252 WRITE(6,*) 7253 END IF 7254* 7255 IDUM = 0 7256 CALL MEMMAN(IDUM,IDUM,'MARK ',2,'VBDENS') 7257* 7258 LUSCR1 = LUSC34 7259 LUSCR2 = LUSC35 7260 LUSCR3 = LUSC36 7261 LUCBIO_SAVE = 110 7262 LUC_SAVE = 112 7263* 7264* A bit of scratch 7265* 7266 LEN_1A = NDIM_1EL_MAT(1,NACOBS,NACOBS,NSMOB,0) 7267 CALL MEMMAN(KLRHOB,NACOB**2,'ADDL ',2,'RHOB ') 7268 CALL MEMMAN(KLSCR ,NACOB**2,'ADDL ',2,'SCR ') 7269 CALL MEMMAN(KLCBIOA,LEN_1A,'ADDL ',2,'CBIOAC') 7270*. Preparation: Obtain CBIO over active orbitals only 7271C EXTR_OR_CP_ACT_BLKS_FROM_ORBMAT(A,AGAS,I_EX_OR_CP) 7272 CALL EXTR_OR_CP_ACT_BLKS_FROM_ORBMAT 7273 & (WORK(KCBIO),WORK(KLCBIOA),1) 7274 IF(NTEST.GE.1000) THEN 7275 WRITE(6,*) ' CBIO in active orbitals ' 7276 CALL APRBLM2(WORK(KLCBIOA),NACOBS,NACOBS,NSMOB,0) 7277 END IF 7278* 7279*. Biotransform C 7280* 7281C SIGMA_NORTCI(C,HC,SC,IDOHC,IDOSC) 7282 CALL SIGMA_NORTCI(C,VEC1_CSF,VEC2_CSF,0,1) 7283 IF(NTEST.GE.1000) WRITE(6,*) ' Back from SIGMA_NORTCI' 7284* calculate Overlap from vectors on file - for check 7285 CC = INPRDD(WORK(KVEC1P),WORK(KVEC2P),LUC_SAVE, LUCBIO_SAVE,1,-1) 7286 IF(NTEST.GE.100) WRITE(6,*) ' <0!0> =', CC 7287* 7288*. Set up density <0! a+i(bio) aj!0(bio)> in RHOB 7289* 7290 IF(NTEST.GE.1000) THEN 7291 WRITE(6,*) ' C in SD expansion ' 7292 CALL WRTVCD(WORK(KVEC1P),LUC_SAVE,1,-1) 7293 WRITE(6,*) ' C(bio) in SD expansion ' 7294 CALL WRTVCD(WORK(KVEC1P),LUCBIO_SAVE,1,-1) 7295 END IF 7296 XDUM = 0.0D0 7297 CALL DENSI2(IR12 ,WORK(KLRHOB),RHO2, 7298 &WORK(KVEC1P),WORK(KVEC2P),LUC_SAVE,LUCBIO_SAVE,EXPS2, 7299 &0,XDUM,XDUM,XDUM,XDUM,0) 7300* 7301 FACTOR = 1.0D0/CC 7302C? WRITE(6,*) ' CC = ', CC 7303 CALL SCALVE(WORK(KLRHOB),FACTOR,NACOB**2) 7304 IF(IR12.EQ.2) THEN 7305 LRHO2 = NACOB**2*(NACOB**2+1)/2 7306 CALL SCALVE(RHO2,FACTOR,LRHO2) 7307 END IF 7308 7309 IF(NTEST.GE.1000) THEN 7310 WRITE(6,*) ' Density matrix <0! a+i(bio) aj!bio 0>/<0!0> ' 7311 CALL WRTMAT(WORK(KLRHOB),NACOB,NACOB,NACOB,NACOB) 7312 END IF 7313*. Obtain density as blocked matrix over symmetry blocks of active orbitals 7314C REORHO1(RHO1I,RHO1O,IRHO1SM) 7315 CALL REORHO1(WORK(KLRHOB),WORK(KLSCR),1,1) 7316 CALL COPVEC(WORK(KLSCR),WORK(KLRHOB),LEN_1A) 7317*. Transform the densities from bio, normal to the normal, normal basis 7318C TR_BIOMAT(XIN,XOUT,CBIO,NORB_PSM, 7319C & INB_IN,INB_OUT,JNB_IN,JNB_OUT) 7320 CALL TR_BIOMAT(WORK(KLRHOB),WORK(KLSCR),WORK(KLCBIOA), 7321 & NACOBS,2,1,1,1) 7322*. Transfer back to full matrix over active orbitals 7323 CALL REORHO1(RHO1,WORK(KLSCR),1,2) 7324* 7325 IF(NTEST.GE.100) THEN 7326 WRITE(6,*) ' Density matrix <0! E(ij) !> ' 7327 CALL WRTMAT(RHO1,NACOB,NACOB,NACOB,NACOB) 7328 END IF 7329* 7330 CALL MEMMAN(IDUM,IDUM,'FLUSM ',2,'VBDENS') 7331 RETURN 7332 END 7333 SUBROUTINE GET_SACT(SACT,C) 7334* 7335*. Obtain the overlap matrix of the active orbitals for a MO-AO expansion 7336* given by the MO-AO expansion matric C 7337* 7338*. Jeppe Olsen, May 31 2012 7339* 7340 INCLUDE 'implicit.inc' 7341 INCLUDE 'mxpdim.inc' 7342 INCLUDE 'wrkspc-static.inc' 7343 INCLUDE 'orbinp.inc' 7344 INCLUDE 'lucinp.inc' 7345 INCLUDE 'glbbas.inc' 7346*. Specific input 7347 DIMENSION C(*) 7348*. Specific output: in symmetry-packed lower half form 7349 DIMENSION SACT(*) 7350*. Obtain expansion of active orbitals only 7351 7352 NTEST = 00 7353 IF(NTEST.GE.100) THEN 7354 WRITE(6,*) ' Info from SACT ' 7355 WRITE(6,*) ' ============== ' 7356 END IF 7357* 7358*. It is assumed that SAO resides in WORK(KSAO) 7359 IDUM = 0 7360 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'VB_SAC') 7361* 7362*. Two ways of which IWAY = 1 has a bug... 7363* 7364 LEN_CACT = LEN_BLMAT(NSMOB,NACOBS,NTOOBS,0) 7365 LEN_C = LEN_BLMAT(NSMOB,NTOOBS,NTOOBS,0) 7366* 7367 IWAY = 2 7368 IF(IWAY.EQ.1) THEN 7369 CALL MEMMAN(KLCACT,LEN_CACT,'ADDL ',2,'C_AC ') 7370 CALL MEMMAN(KLSCR ,2*LEN_C,'ADDL ',2,'SCR ') 7371*. Obtain C over active orbitals only 7372C EXTR_OR_CP_ACT_BLKS_FROM_ORBMAT(A,AGAS,I_EX_OR_CP) 7373 CALL EXTR_OR_CP_ACT_BLKS_FROM_ORBMAT 7374 & (C,WORK(KLCACT),1) 7375 IF(NTEST.GE.1000) THEN 7376 WRITE(6,*) ' C over active orbitals ' 7377 CALL APRBLM2(WORK(KLCACT),NACOBS,NACOBS,NSMOB,0) 7378 END IF 7379* 7380 CALL TRAN_SYM_BLOC_MAT4(WORK(KSAO),WORK(KLCACT),WORK(KLCACT), 7381 & NSMOB,NTOOBS,NACOBS,SACT,WORK(KLSCR),1) 7382C TRAN_SYM_BLOC_MAT4 7383C & (AIN,XL,XR,NBLOCK,LX_ROW,LX_COL,AOUT,SCR,ISYM) 7384 ELSE 7385*. Obtain full SMO and extract active blocks 7386 CALL MEMMAN(KLS1,LEN_C,'ADDL ',2,'S_FULL') 7387 CALL MEMMAN(KLS2,LEN_C,'ADDL ',2,'S2FULL') 7388 CALL GET_SMO(WORK(KMOAOUT),WORK(KLS1),0) 7389 IF(NTEST.GE.1000) THEN 7390 WRITE(6,*) ' Full S matrix ' 7391 CALL APRBLM2(WORK(KLS1),NTOOBS,NTOOBS,NSMOB,0) 7392 END IF 7393*. Extract active blocks 7394 CALL EXTR_OR_CP_ACT_BLKS_FROM_ORBMAT 7395 & (WORK(KLS1),WORK(KLS2),1) 7396 IF(NTEST.GE.1000) THEN 7397 WRITE(6,*) ' S matrix over activt orbitals' 7398 CALL APRBLM2(WORK(KLS2),NACOBS,NACOBS,NSMOB,0) 7399 END IF 7400*. And pack these 7401C TRIPAK_BLKM(AUTPAK,APAK,IWAY,LBLOCK,NBLOCK) 7402 CALL TRIPAK_BLKM(WORK(KLS2),SACT,1,NACOBS,NSMOB) 7403 END IF !switch between routes 7404* 7405 IF(NTEST.GE.100) THEN 7406 WRITE(6,*) ' Overlap matrix over active orbitals ' 7407 CALL APRBLM2(SACT,NACOBS,NACOBS,NSMOB,1) 7408 END IF 7409* 7410 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'VB_SAC') 7411* 7412 RETURN 7413 END 7414 SUBROUTINE NONORT_NATORB(SACT,RHO1) 7415 7416* Obtain natural orbitals for a density matrix in a 7417* nonorthogonal basis 7418* 7419*. Jeppe Olsen, May 2012 7420* 7421 INCLUDE 'implicit.inc' 7422 INCLUDE 'mxpdim.inc' 7423 INCLUDE 'wrkspc-static.inc' 7424 INCLUDE 'orbinp.inc' 7425 INCLUDE 'lucinp.inc' 7426*. Specific input: SACT in symmetry-blocked lower half packed form 7427*. and RHO1 over all active orbitals in standard type-symmetry order 7428* 7429 DIMENSION SACT(*),RHO1(NACOB,NACOB) 7430* 7431 NTEST = 10 7432 IF(NTEST.GE.100) THEN 7433 WRITE(6,*) 7434 WRITE(6,*) ' Info from NONORT_NATORB ' 7435 WRITE(6,*) ' ========================' 7436 WRITE(6,*) 7437 END IF 7438* 7439 IDUM = 0 7440 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'NORNAT') 7441* 7442*. Some scratch space 7443* ================== 7444*. Density matrix in symmetry-packed complete form 7445 LEN_CACT = LEN_BLMAT(NSMOB,NACOBS,NACOBS,0) 7446 CALL MEMMAN(KLRH_SYM,LEN_CACT,'ADDL ',2,'RH_SYM') 7447*. Unpacked overlap matrix 7448 CALL MEMMAN(KLSUNP,LEN_CACT,'ADDL ',2,'S_UNP ') 7449*. Expansion coefficient of natural orbitals 7450 CALL MEMMAN(KLCNAT,LEN_CACT,'ADDL ',2,'C_NAT ') 7451*. Matrix for going to orthonormal basis 7452 CALL MEMMAN(KLP,LEN_CACT,'ADDL ',2,'P_TRA ') 7453*. Natural occupation numbers 7454 CALL MEMMAN(KLOCC,NACOB,'ADDL ',2,'P_TRA ') 7455 7456*. Obtain density in blocks of symmetry 7457*. Loop over active orbitals in output order: symmetry type 7458 IOBOFF = 0 7459 IMTOFF = 0 7460 IADD_ST = 0 7461 IADD_TS = NINOB 7462 DO ISMOB = 1, NSMOB 7463 IF(ISMOB.EQ.1) THEN 7464 IOBOFF = 1 7465 IMTOFF = 1 7466 IADD_ST = NINOBS(1) 7467 ELSE 7468 IOBOFF = IOBOFF + NACOBS(ISMOB-1) 7469 IMTOFF = IMTOFF + NACOBS(ISMOB-1)**2 7470 IADD_ST = IADD_ST + NINOBS(ISMOB) + NSCOBS(ISMOB-1) 7471 END IF 7472 LOB = NACOBS(ISMOB) 7473C? WRITE(6,*) ' ISMOB, LOB, = ', ISMOB, LOB 7474C? WRITE(6,*) ' IADD_TS = ', IADD_TS 7475* 7476*. Extract symmetry block of density matrix 7477* 7478*. Loop over active orbitals of symmetry ISMOB in ST order 7479 DO IOB = IOBOFF,IOBOFF + LOB-1 7480 IOB_ABS = IOB + IADD_ST 7481C IOB_TS = ISTREO(IOB_ABS) - IADD_TS 7482 IOB_TS = IREOST(IOB_ABS) - IADD_TS 7483 IOB_REL = IOB - IOBOFF + 1 7484 DO JOB = IOBOFF,IOBOFF + LOB-1 7485 JOB_ABS = JOB + IADD_ST 7486 JOB_TS = IREOST(JOB_ABS) - IADD_TS 7487 JOB_REL = JOB - IOBOFF + 1 7488 IF(NTEST.GE.1000) THEN 7489 WRITE(6,*) ' JOB, JOB_ABS, JOB_TS, IREOST() = ', 7490 & JOB, JOB_ABS, JOB_TS, IREOST(JOB_ABS) 7491 WRITE(6,*) ' IOB_TS, JOB_TS = ', IOB_TS, JOB_TS 7492 WRITE(6,'(A,6I3)') 7493 & ' IOB_TS, JOB_TS, IOB, JOB, IOB_REL, JOB_REL = ', 7494 & IOB_TS, JOB_TS, IOB, JOB, IOB_REL, JOB_REL 7495 END IF 7496 WORK(KLRH_SYM-1+IMTOFF-1+(JOB_REL-1)*LOB+IOB_REL) 7497 & = RHO1(IOB_TS,JOB_TS) 7498 END DO !Job 7499 END DO ! Iob 7500 END DO! Loop over symmetries of orbitals 7501* 7502 IF(NTEST.GE.1000) THEN 7503 WRITE(6,*) ' One-body density matrix in symmetry-blocks ' 7504 CALL APRBLM2(WORK(KLRH_SYM),NACOBS,NACOBS,NSMOB,0) 7505 END IF 7506*. Unpack overlapmatrix 7507C TRIPAK_BLKM(AUTPAK,APAK,IWAY,LBLOCK,NBLOCK) 7508 CALL TRIPAK_BLKM(WORK(KLSUNP),SACT,2,NACOBS,NSMOB) 7509 IF(NTEST.GE.100) THEN 7510 WRITE(6,*) ' Overlap matrix in unpacked form ' 7511 CALL APRBLM2(WORK(KLSUNP),NACOBS,NACOBS,NSMOB,0) 7512 END IF 7513*. Multiply density with -1 to get highest occupation numbers first 7514 ONEM = -1.0D0 7515 CALL SCALVE(WORK(KLRH_SYM),ONEM,LEN_CACT) 7516*. Diagonalize 7517C GENDIA_BLMAT(HIN,SIN,C,E,PVEC,NBLK,LBLK,ISORT) 7518 CALL GENDIA_BLMAT(WORK(KLRH_SYM),WORK(KLSUNP),WORK(KLCNAT), 7519 & WORK(KLOCC),WORK(KLP),NACOBS,NSMOB,1) 7520*. Multiply occupation numbers with -1 to counteract previous multiply 7521 CALL SCALVE(WORK(KLOCC),ONEM,NACOB) 7522* 7523 WRITE(6,*) ' Natural occupation numbers: ' 7524 WRITE(6,*) ' =========================== ' 7525 WRITE(6,*) 7526* 7527 DO ISYM = 1, NSMOB 7528 IF(ISYM.EQ.1) THEN 7529 IOFF_I = 1 7530 IOFF_IJ = 1 7531 ELSE 7532 IOFF_I = IOFF_I + NACOBS(ISYM-1) 7533 IOFF_IJ = IOFF_IJ + NACOBS(ISYM-1)**2 7534 END IF 7535 WRITE(6,*) 7536 WRITE(6,*) 7537 & ' Natural occupation numbers for symmetry = ', ISYM 7538 WRITE(6,*) 7539 & ' ===================================================' 7540 L = NACOBS(ISYM) 7541 CALL WRTMAT(WORK(KLOCC-1+IOFF_I),1,L,1,L) 7542 WRITE(6,*) 7543 & ' Expansion of natural orbitals for symmetry = ', ISYM 7544 WRITE(6,*) 7545 & ' ===================================================' 7546 CALL WRTMAT(WORK(KLCNAT-1+IOFF_IJ),L,L,L,L) 7547 END DO! Loop over symmetries 7548* 7549 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'NORNAT') 7550 RETURN 7551 END 7552 SUBROUTINE VB_BR_FOR_KAPPA_WRAP(KAPPA,BR) 7553* 7554* Outer routine for obtaining generalized Brillouin vector 7555* at a given point 7556* 7557*. Jeppe Olsen, May 31, 2012 in Palermo, (18 hours to talk) 7558* 7559 INCLUDE 'implicit.inc' 7560 INCLUDE 'mxpdim.inc' 7561 INCLUDE 'orbinp.inc' 7562 INCLUDE 'wrkspc-static.inc' 7563 INCLUDE 'crun.inc' 7564* 7565 COMMON/EVB_TRANS/KLIOOEXC_A, KLKAPPA_A, 7566 & KLIOOEXC_S,KLKAPPA_S, 7567 & KL_C,KL_VEC2,KL_VEC3, 7568 & KLOOEXC 7569* 7570* 7571*. Input 7572 REAL*8 KAPPA(*) 7573*. And output 7574 DIMENSION BR(*) 7575 7576 NTEST = 01 7577 IF(NTEST.GE.1) WRITE(6,*) ' Entering VB_BR_FOR_KAPPA_WRAP' 7578* 7579 IF(NTEST.GE.100) THEN 7580 WRITE(6,*) ' Info from VB_BR_FOR_KAPPA_WRAP' 7581 WRITE(6,*) ' ==============================' 7582 WRITE(6,*) 7583 WRITE(6,*) ' Kappa_A, Kappa_S ' 7584 WRITE(6,*) 7585 WRITE(6,*) ' NOOEXC_A, NOOEXC_S = ', 7586 & NOOEXC_A, NOOEXC_S 7587 CALL WRTMAT(KAPPA(1),NOOEXC_A,1,NOOEXC_A) 7588 WRITE(6,*) 7589 CALL WRTMAT(KAPPA(1+NOOEXC_A),1,NOOEXC_S,1,NOOEXC_S) 7590 END IF 7591*. And call the routine that does the job 7592 CALL VB_BR_FROM_KAPPA(BR, 7593 & NOOEXC_A,WORK(KLIOOEXC_A),KAPPA(1), 7594 & NOOEXC_S,WORK(KLIOOEXC_S),KAPPA(1+NOOEXC_A), 7595 & WORK(KLOOEXC), 7596 & WORK(KL_C),WORK(KL_VEC2),WORK(KL_VEC3)) 7597* 7598 IF(NTEST.GE.100) THEN 7599 WRITE(6,*) ' Brillouin vector from VB_BR_FOR_KAPPA_WRAP' 7600 WRITE(6,*) ' ========================================= ' 7601 WRITE(6,*) 7602 N = NOOEXC_A + NOOEXC_S 7603 CALL WRTMAT(BR,1,N,1,N) 7604 END IF 7605* 7606 RETURN 7607 END 7608 SUBROUTINE VB_BR_FROM_KAPPA(BR, 7609 & NOOEXC_A,IOOEXC_A, KAPPA_A, 7610 & NOOEXC_S,IOOEXC_S, KAPPA_S, 7611 & IOOEXC, 7612 & C,VEC2,VEC3) 7613* 7614* Obtain VB Brillouin vector for a given set of Kappa parameters 7615* 7616*. Jeppe Olsen, May 31, Palermo - Finished June 3, Zurich 7617* 7618*.It is assumed that the current MO-AO coefficients are in KMOAOIN. 7619* Integrals etc are overwritten, so the exit from this routine is 7620* not clean. 7621* 7622 INCLUDE 'implicit.inc' 7623 INCLUDE 'mxpdim.inc' 7624 INCLUDE 'wrkspc-static.inc' 7625 INCLUDE 'glbbas.inc' 7626 INCLUDE 'lucinp.inc' 7627 INCLUDE 'orbinp.inc' 7628 INCLUDE 'cintfo.inc' 7629 INCLUDE 'spinfo.inc' 7630*. Explicit input 7631 REAL*8 KAPPA_A(NOOEXC_A),KAPPA_S(NOOEXC_S) 7632 INTEGER IOOEXC_A(2,NOOEXC_A), IOOEXC_S(2,NOOEXC_S), IOOEXC(*) 7633*. Coefficients 7634 DIMENSION C(*) 7635*. Output 7636 DIMENSION BR(*) 7637*. Scratch vectors 7638 DIMENSION VEC2(*),VEC3(*) 7639* 7640*. Common block for communicating with sigma 7641 COMMON/SCRFILES_MATVEC/LUSCR1,LUSCR2,LUSCR3, 7642 & LUCBIO_SAVE, LUHCBIO_SAVE,LUC_SAVE 7643* 7644 NTEST = 000 7645 IF(NTEST.GE.100) THEN 7646 WRITE(6,*) ' Info from VB_BR_FROM_KAPPA ' 7647 WRITE(6,*) ' ===========================' 7648 WRITE(6,*) ' NOOEXC_S, NOOEXC_A = ', 7649 & NOOEXC_S, NOOEXC_A 7650 END IF 7651 IF(NTEST.GE.1000) THEN 7652 WRITE(6,*) ' Antisymmetric and symmetric part of Kappa ' 7653 CALL WRTMAT(KAPPA_A,1,NOOEXC_A,1,NOOEXC_A) 7654 CALL WRTMAT(KAPPA_S,1,NOOEXC_S,1,NOOEXC_S) 7655* 7656 WRITE(6,*) ' IOOEXC: ' 7657 CALL IWRTMA3(IOOEXC,NTOOB,NTOOB,NTOOB,NTOOB) 7658 END IF 7659* 7660 IDUM = 0 7661 CALL MEMMAN(IDUM,IDUM,'MARK ',IDUM,'VBBRKA') 7662* 7663*. Obtain New MO coefficients in MOAOUT: MOAOIN* Exp(-Kappa_A S) Exp(-Kappa_S S) 7664* 7665 CALL NEWMO_FROM_KAPPA_NORT( 7666 & NOOEXC_A,IOOEXC_A,KAPPA_A,NOOEXC_S,IOOEXC_S,KAPPA_S, 7667 & WORK(KMOAOIN),WORK(KMOAOUT)) 7668* 7669* Obtain the set of biorthonormal orbitals 7670* 7671 CALL GET_CBIO(WORK(KMOAOUT),WORK(KCBIO),WORK(KCBIO2)) 7672* 7673* Biorthonormal integral transformaion 7674* 7675 IF(NTEST.GE.10) THEN 7676 WRITE(6,*) ' Bioorthogonal integral transformation ' 7677 END IF 7678* 7679C IE2LIST_A = IE2LIST_FULL_BIO 7680C IOCOBTP_A = 1 7681C INTSM_A = 1 7682 IE2LIST_A = IE2LIST_1G_BIO 7683C IOCOBTP_A = 2 7684 IOCOBTP_A = 1 7685 INTSM_A = 1 7686 CALL PREPARE_2EI_LIST 7687* 7688 KKCMO_I = KMOAOUT 7689 KKCMO_J = KCBIO2 7690 KKCMO_K = KMOAOUT 7691 KKCMO_L = KCBIO2 7692* 7693C DO_ORBTRA(IDOTRA,IDOFI,IDOFA,IE2LIST_IN,IOCOBTP_IN,INTSM_IN) 7694C CALL DO_ORBTRA(1,1,1,IE2LIST_FULL_BIO,IOCOBTP_A,INTSM_A) 7695C CALL FLAG_ACT_INTLIST(IE2LIST_FULL_BIO) 7696 CALL DO_ORBTRA(1,1,1,IE2LIST_1G_BIO,IOCOBTP_A,INTSM_A) 7697 CALL FLAG_ACT_INTLIST(IE2LIST_1G_BIO) 7698 7699 NINT1_F = NDIM_1EL_MAT(1,NTOOBS,NTOOBS,NSMOB,0) 7700 CALL COPVEC(WORK(KFI),WORK(KINT1),NINT1_F) 7701* 7702* And construct the one- and two-body density matrices 7703* 7704 CALL VB_DENSI(WORK(KRHO1),WORK(KRHO2),2,C,VEC2,VEC3) 7705*. Construct Active Fock-matrix 7706 CALL DO_ORBTRA(1,1,1,IE2LIST_FULL_BIO, 7707 & IOCOBTP_A,INTSM_A) 7708* 7709 CALL FOCK_MAT_NORT(WORK(KF),WORK(KF2),2,WORK(KFI),WORK(KFA)) 7710*. And the interspace gradient 7711C E1_FROM_F_NORT(E1,F1,F2,IOPSM,IOOEXC,IOOEXCC, 7712C & NOOEXC,NTOOB,NTOOBS,NSMOB,IBSO,IREOST) 7713 CALL E1_FROM_F_NORT(BR,WORK(KF),WORK(KF2),1, 7714 & IOOEXC,IOOEXC_A,NOOEXC_A,NTOOB, 7715 & NTOOBS,NSMOB,IBSO,IREOST) 7716*. And add the active-active gradient 7717* The interspace excitations 7718C VB_GRAD_ORBVBSPC(NOOEXC,IOOEXC,E1,C,VEC1_CSF,VEC2_CSF) 7719 IF(NTEST.GE.1000) 7720 & WRITE(6,*) ' Active-active gradient will be calculated ' 7721 CALL VB_GRAD_ORBVBSPC(NOOEXC_S,IOOEXC_S, 7722 & BR(1+NOOEXC_A-NOOEXC_S),C,VEC2,VEC3) 7723 7724* And calculate gradient 7725C VB_GRAD_ORBVBSPC(NOOEXCA,IOOEXC,E1,C, 7726C & VEC1_CSF,VEC2_CSF) 7727COLD CALL VB_GRAD_ORBVBSPC(NOOEXC_A,IOOEXC_A,BR,C,VEC2,VEC3) 7728* 7729 IF(NTEST.GE.100) THEN 7730 WRITE(6,*) ' The Brilloin vector as delivered by VEC_BR_FRO..' 7731 WRITE(6,*) ' =================================================' 7732 CALL WRTMAT(BR,NOOEXC_A+NOOEXC_S,1,NOOEXC_A+NOOEXC_S,1) 7733 END IF 7734* 7735 CALL MEMMAN(IDUM,IDUM,'FLUSM ',IDUM,'VBBRKA') 7736 RETURN 7737 END 7738 SUBROUTINE CSDTVC_CONFSPACE(NCONF,VCSF,VSD,ISYM,ISPC,IWAY) 7739* 7740* Transform a CI vector between CSF and SD form for configuration 7741* expansion using on-flight generation of info 7742* 7743*. Jeppe Olsen, Kristiansand, June 11, 2013 7744* 7745 INCLUDE 'implicit.inc' 7746 INCLUDE 'mxpdim.inc' 7747 INCLUDE 'wrkspc-static.inc' 7748 INCLUDE 'glbbas.inc' 7749 INCLUDE 'spinfo.inc' 7750* 7751 PARAMETER (LSCR = 1000) 7752*. Input / output 7753 DIMENSION VCSF(*), VSD(*) 7754* 7755*. Local scratch - is not general pt.... 7756* 7757 DIMENSION IOCC(LSCR), ISIGN(LSCR), ISCR(LSCR) 7758* 7759 NTEST = 100 7760* 7761 WRITE(6,*) ' CSDTVC_CONFSPACE, Preliminary version ' 7762 IF(NTEST.GE.100) THEN 7763 WRITE(6,*) ' Output from CSDTVC_CONFSPACE ' 7764 WRITE(6,*) ' ============================ ' 7765 WRITE(6,*) 7766 WRITE(6,*) ' Space and sym: ', ISPC, ISYM 7767 WRITE(6,*) ' IWAY = ', IWAY 7768 END IF 7769* 7770 INI = 1 7771 IB_CSF = 1 7772 IB_SD = 1 7773* 7774 DO ICONF = 1, NCONF 7775C NEXT_CONF_IN_CONFSPC(IOCC,IOPEN,INUM_OP,INI,ISYM,ISPC,NEW) 7776 CALL NEXT_CONF_IN_CONFSPC(IOCC,IOPEN,INUM_OP,INI,ISYM,ISPC,NEW) 7777 INI = 0 7778 IOCOB = (IOPEN + N_EL_CONF)/2 7779*. Signs for going between configuration and interaction order of dets 7780C SIGN_CONF_SD(ICONF,NOB_CONF,IOP,ISGN,IPDET_LIST,ISCR) 7781 CALL SIGN_CONF_SD(IOCC,IOCOB,IOPEN,ISIGN,WORK(KDFTP),ISCR) 7782 NCSF = NPCSCNF(IOPEN+1) 7783 NSD = NPDTCNF(IOPEN+1) 7784C CSDTVC_CONF(C_SD,C_CSF,NOPEN,ISIGN,IAC,IWAY) 7785 CALL CSDTVC_CONF(VSD(IB_SD),VCSF(IB_CSF),IOPEN,ISIGN,2,IWAY) 7786 IB_CSF = IB_CSF + NCSF 7787 IB_SD = IB_SD + NSD 7788 END DO 7789* 7790 IF(NTEST.GE.100) THEN 7791 WRITE(6,*) ' Output from CSDTVC_CONFSPACE:' 7792 NCSFT = IB_CSF-1 7793 NSDT = IB_SD - 1 7794 WRITE(6,*) ' CSF expansion: ' 7795 CALL WRTMAT(VCSF,1,NCSFT,1,NCSFT) 7796 WRITE(6,*) ' SD expansion ' 7797 CALL WRTMAT(VSD,1,NSDT,1,NSDT) 7798 END IF 7799* 7800 RETURN 7801 END 7802 7803c $Id$ 7804