root / src / CalcBMat_mixed.f90 @ 4
Historique | Voir | Annoter | Télécharger (2,88 ko)
1 | 1 | equemene | subroutine CalcBMat_mixed (natoms, xyzatm, indzmat, dzdc, atmass,atome) |
---|---|---|---|
2 | 1 | equemene | |
3 | 1 | equemene | use Io_module |
4 | 1 | equemene | use Path_module, only : MW, NCart |
5 | 1 | equemene | |
6 | 1 | equemene | IMPLICIT NONE |
7 | 1 | equemene | |
8 | 1 | equemene | |
9 | 1 | equemene | integer(KINT) :: natoms, indzmat(natoms,5),atome(natoms) |
10 | 1 | equemene | real(KREAL) :: xyzatm(3,natoms), dzdc(3*natoms,3*natoms),atmass(natoms) |
11 | 1 | equemene | |
12 | 1 | equemene | |
13 | 1 | equemene | !!!!!!!!!!!!!!!!!!!!! |
14 | 1 | equemene | ! |
15 | 1 | equemene | ! This routine computes the derivatives of the internal coordinates |
16 | 1 | equemene | ! with respect to the cartesian coordinates. |
17 | 1 | equemene | ! This is what is called the B matrix in Baker coordinates : |
18 | 1 | equemene | ! B(i,j)=dz_i/dx_j |
19 | 1 | equemene | ! |
20 | 1 | equemene | ! it uses the same routines as Calc_baker |
21 | 1 | equemene | ! |
22 | 1 | equemene | ! Here, it is used for mixed Cart+Z-mat system |
23 | 1 | equemene | ! |
24 | 1 | equemene | !!!!!!!!!!!!!!!!!!!!!! |
25 | 1 | equemene | ! |
26 | 1 | equemene | ! Input: |
27 | 1 | equemene | ! natoms: number of atoms |
28 | 1 | equemene | ! xyzatm(3,natoms): cartesian geometry |
29 | 1 | equemene | ! indzmat(natoms,5): index of the Z-matrix definition |
30 | 1 | equemene | ! atmass(natoms): mass of the atoms |
31 | 1 | equemene | ! atome(natoms): ?? |
32 | 1 | equemene | ! |
33 | 1 | equemene | ! Output: |
34 | 1 | equemene | ! dzdc(3*natoms,3*natoms): B matrix |
35 | 1 | equemene | ! |
36 | 1 | equemene | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
37 | 1 | equemene | |
38 | 1 | equemene | |
39 | 1 | equemene | INTERFACE |
40 | 1 | equemene | function valid(string) result (isValid) |
41 | 1 | equemene | CHARACTER(*), intent(in) :: string |
42 | 1 | equemene | logical :: isValid |
43 | 1 | equemene | END function VALID |
44 | 1 | equemene | END INTERFACE |
45 | 1 | equemene | |
46 | 1 | equemene | LOGICAL :: debug |
47 | 1 | equemene | INTEGER(KINT) :: i,j,k,iat, istart |
48 | 1 | equemene | INTEGER(KINT) :: iat1, iat2, iat3, iat4 |
49 | 1 | equemene | |
50 | 1 | equemene | |
51 | 1 | equemene | |
52 | 1 | equemene | ! ====================================================================== |
53 | 1 | equemene | |
54 | 1 | equemene | debug=valid('CalcBMat').OR.valid('CalcBMat_mixed') |
55 | 1 | equemene | |
56 | 1 | equemene | if (debug) Call Header('Entering CalcBMat_mixed') |
57 | 1 | equemene | if (debug) THEN |
58 | 1 | equemene | WRITE(*,*) 'DBG CalcBMat_mixed Xyzatm ' |
59 | 1 | equemene | DO iat=1,natoms |
60 | 1 | equemene | write(*,'(1X,I5,3(1X,F15.6))') iat, xyzatm(1:3,iat) |
61 | 1 | equemene | END DO |
62 | 1 | equemene | WRITE(*,*) 'DBG CalcBMat_mixed IndZmat' |
63 | 1 | equemene | DO iat=1,natoms |
64 | 1 | equemene | write(*,'(6(1X,I5))') iat, indzmat(iat,1:4) |
65 | 1 | equemene | END DO |
66 | 1 | equemene | END IF |
67 | 1 | equemene | |
68 | 1 | equemene | dzdc=0.d0 |
69 | 1 | equemene | do i = 1, NCart |
70 | 1 | equemene | iat=indzmat(i,1) |
71 | 1 | equemene | do j=1,3 |
72 | 1 | equemene | k=(iat-1)*3+j |
73 | 1 | equemene | dzdc(k,k)=1.d0 |
74 | 1 | equemene | END DO |
75 | 1 | equemene | END DO |
76 | 1 | equemene | |
77 | 1 | equemene | IF (NCart.EQ.1) THEN |
78 | 1 | equemene | if (natoms.ge.2) THEN |
79 | 1 | equemene | iat1=indzmat(2,1) |
80 | 1 | equemene | iat2=indzmat(2,2) |
81 | 1 | equemene | Call CONSTRAINTS_BONDLENGTH_DER(Natoms,iat1,iAT2, xyzatm, dzdc(1,4)) |
82 | 1 | equemene | END IF |
83 | 1 | equemene | END IF |
84 | 1 | equemene | IF (NCart.LE.2) THEN |
85 | 1 | equemene | if (natoms.ge.3) THEN |
86 | 1 | equemene | iat1=indzmat(3,1) |
87 | 1 | equemene | iat2=indzmat(3,2) |
88 | 1 | equemene | iat3=indzmat(3,3) |
89 | 1 | equemene | Call CONSTRAINTS_BONDLENGTH_DER(Natoms,iat1,iAT2, xyzatm, dzdc(1,7)) |
90 | 1 | equemene | CALL CONSTRAINTS_BONDANGLE_DER(Natoms,iAt1,iAT2,iAt3, xyzatm, dzdc(1,8)) |
91 | 1 | equemene | END IF |
92 | 1 | equemene | END IF |
93 | 1 | equemene | |
94 | 1 | equemene | IStart=max(NCart+1,4) |
95 | 1 | equemene | k=(IStart-1)*3+1 |
96 | 1 | equemene | DO I=IStart, Natoms |
97 | 1 | equemene | iat1=indzmat(i,1) |
98 | 1 | equemene | iat2=indzmat(i,2) |
99 | 1 | equemene | iat3=indzmat(i,3) |
100 | 1 | equemene | iat4=indzmat(i,4) |
101 | 1 | equemene | Call CONSTRAINTS_BONDLENGTH_DER(Natoms,iat1,iAT2, xyzatm, dzdc(1,k)) |
102 | 1 | equemene | k=k+1 |
103 | 1 | equemene | CALL CONSTRAINTS_BONDANGLE_DER(Natoms,iAt1,iAT2,iAt3, xyzatm, dzdc(1,k)) |
104 | 1 | equemene | k=k+1 |
105 | 1 | equemene | CALL CONSTRAINTS_TORSION_DER2(Natoms,iat1,iat2,iat3,iat4, xyzatm, dzdc(1,k)) |
106 | 1 | equemene | k=k+1 |
107 | 1 | equemene | END DO |
108 | 1 | equemene | |
109 | 1 | equemene | |
110 | 1 | equemene | |
111 | 1 | equemene | |
112 | 1 | equemene | |
113 | 1 | equemene | if (debug) Call Header('CalcBMat_mixed over') |
114 | 1 | equemene | |
115 | 1 | equemene | ! ====================================================================== |
116 | 1 | equemene | |
117 | 1 | equemene | end subroutine CalcBMat_mixed |