115 CHARACTER(LEN=default_string_length), &
116 DIMENSION(:),
POINTER :: tmpstringlist
117 INTEGER :: icolvar, ig, isize, isize_old, itype, &
118 jg, msize, msize_old, n_rep, ncons, &
120 INTEGER,
DIMENSION(:),
POINTER :: ilist, tmplist
122 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rlist
125 g3x3_section, g4x6_section, &
126 hbonds_section, vsite_section
129 IF (
ASSOCIATED(constraint_section))
THEN
138 CALL check_restraint(hbonds_section, &
139 is_restraint=cons_info%hbonds_restraint, &
140 k0=cons_info%hbonds_k0, &
146 cons_info%nconst_g33 = ncons
148 ALLOCATE (cons_info%const_g33_mol(ncons))
149 ALLOCATE (cons_info%const_g33_molname(ncons))
150 ALLOCATE (cons_info%const_g33_a(ncons))
151 ALLOCATE (cons_info%const_g33_b(ncons))
152 ALLOCATE (cons_info%const_g33_c(ncons))
153 ALLOCATE (cons_info%const_g33_dab(ncons))
154 ALLOCATE (cons_info%const_g33_dac(ncons))
155 ALLOCATE (cons_info%const_g33_dbc(ncons))
156 ALLOCATE (cons_info%g33_intermolecular(ncons))
157 ALLOCATE (cons_info%g33_restraint(ncons))
158 ALLOCATE (cons_info%g33_k0(ncons))
159 ALLOCATE (cons_info%g33_exclude_qm(ncons))
160 ALLOCATE (cons_info%g33_exclude_mm(ncons))
162 CALL check_restraint(g3x3_section, &
163 is_restraint=cons_info%g33_restraint(ig), &
164 k0=cons_info%g33_k0(ig), &
167 cons_info%const_g33_mol(ig) = 0
168 cons_info%const_g33_molname(ig) =
"UNDEF"
171 l_val=cons_info%g33_exclude_qm(ig))
173 l_val=cons_info%g33_exclude_mm(ig))
176 l_val=cons_info%g33_intermolecular(ig))
179 IF (cons_info%g33_intermolecular(ig))
THEN
188 i_val=cons_info%const_g33_mol(ig))
194 c_val=cons_info%const_g33_molname(ig))
196 IF ((cons_info%const_g33_mol(ig) /= 0) .AND. (cons_info%const_g33_molname(ig) /=
"UNDEF"))
THEN
197 CALL cp_abort(__location__, &
198 "Invalid G3X3 constraint section "//
cp_to_string(ig)//
": "// &
199 "check MOLECULE and MOLNAME setup!")
201 IF ((cons_info%const_g33_mol(ig) == 0) .AND. (cons_info%const_g33_molname(ig) ==
"UNDEF") .AND. &
202 (.NOT. cons_info%g33_intermolecular(ig)))
THEN
203 CALL cp_abort(__location__, &
204 "Invalid G3X3 constraint section "//
cp_to_string(ig)//
": "// &
205 "check MOLECULE and MOLNAME setup!")
211 cons_info%const_g33_a(ig) = ilist(1)
212 cons_info%const_g33_b(ig) = ilist(2)
213 cons_info%const_g33_c(ig) = ilist(3)
215 cons_info%const_g33_dab(ig) = rlist(1)
216 cons_info%const_g33_dac(ig) = rlist(2)
217 cons_info%const_g33_dbc(ig) = rlist(3)
224 cons_info%nconst_g46 = ncons
226 ALLOCATE (cons_info%const_g46_mol(ncons))
227 ALLOCATE (cons_info%const_g46_molname(ncons))
228 ALLOCATE (cons_info%const_g46_a(ncons))
229 ALLOCATE (cons_info%const_g46_b(ncons))
230 ALLOCATE (cons_info%const_g46_c(ncons))
231 ALLOCATE (cons_info%const_g46_d(ncons))
232 ALLOCATE (cons_info%const_g46_dab(ncons))
233 ALLOCATE (cons_info%const_g46_dac(ncons))
234 ALLOCATE (cons_info%const_g46_dbc(ncons))
235 ALLOCATE (cons_info%const_g46_dad(ncons))
236 ALLOCATE (cons_info%const_g46_dbd(ncons))
237 ALLOCATE (cons_info%const_g46_dcd(ncons))
238 ALLOCATE (cons_info%g46_intermolecular(ncons))
239 ALLOCATE (cons_info%g46_restraint(ncons))
240 ALLOCATE (cons_info%g46_k0(ncons))
241 ALLOCATE (cons_info%g46_exclude_qm(ncons))
242 ALLOCATE (cons_info%g46_exclude_mm(ncons))
244 CALL check_restraint(g4x6_section, &
245 is_restraint=cons_info%g46_restraint(ig), &
246 k0=cons_info%g46_k0(ig), &
249 cons_info%const_g46_mol(ig) = 0
250 cons_info%const_g46_molname(ig) =
"UNDEF"
253 l_val=cons_info%g46_exclude_qm(ig))
255 l_val=cons_info%g46_exclude_mm(ig))
258 l_val=cons_info%g46_intermolecular(ig))
261 IF (cons_info%g46_intermolecular(ig))
THEN
270 i_val=cons_info%const_g46_mol(ig))
276 c_val=cons_info%const_g46_molname(ig))
278 IF ((cons_info%const_g46_mol(ig) /= 0) .AND. (cons_info%const_g46_molname(ig) /=
"UNDEF"))
THEN
279 CALL cp_abort(__location__, &
280 "Invalid G4X6 constraint section "//
cp_to_string(ig)//
": "// &
281 "check MOLECULE and MOLNAME setup!")
283 IF ((cons_info%const_g46_mol(ig) == 0) .AND. (cons_info%const_g46_molname(ig) ==
"UNDEF") .AND. &
284 (.NOT. cons_info%g46_intermolecular(ig)))
THEN
285 CALL cp_abort(__location__, &
286 "Invalid G4X6 constraint section "//
cp_to_string(ig)//
": "// &
287 "check MOLECULE and MOLNAME setup!")
293 cons_info%const_g46_a(ig) = ilist(1)
294 cons_info%const_g46_b(ig) = ilist(2)
295 cons_info%const_g46_c(ig) = ilist(3)
296 cons_info%const_g46_d(ig) = ilist(4)
297 cons_info%const_g46_dab(ig) = rlist(1)
298 cons_info%const_g46_dac(ig) = rlist(2)
299 cons_info%const_g46_dad(ig) = rlist(3)
300 cons_info%const_g46_dbc(ig) = rlist(4)
301 cons_info%const_g46_dbd(ig) = rlist(5)
302 cons_info%const_g46_dcd(ig) = rlist(6)
309 cons_info%nconst_vsite = ncons
311 ALLOCATE (cons_info%const_vsite_mol(ncons))
312 ALLOCATE (cons_info%const_vsite_molname(ncons))
313 ALLOCATE (cons_info%const_vsite_a(ncons))
314 ALLOCATE (cons_info%const_vsite_b(ncons))
315 ALLOCATE (cons_info%const_vsite_c(ncons))
316 ALLOCATE (cons_info%const_vsite_d(ncons))
317 ALLOCATE (cons_info%const_vsite_wbc(ncons))
318 ALLOCATE (cons_info%const_vsite_wdc(ncons))
319 ALLOCATE (cons_info%vsite_intermolecular(ncons))
320 ALLOCATE (cons_info%vsite_restraint(ncons))
321 ALLOCATE (cons_info%vsite_k0(ncons))
322 ALLOCATE (cons_info%vsite_exclude_qm(ncons))
323 ALLOCATE (cons_info%vsite_exclude_mm(ncons))
325 CALL check_restraint(vsite_section, &
326 is_restraint=cons_info%vsite_restraint(ig), &
327 k0=cons_info%vsite_k0(ig), &
329 label=
"Virtual_SITE")
330 cons_info%const_vsite_mol(ig) = 0
331 cons_info%const_vsite_molname(ig) =
"UNDEF"
334 l_val=cons_info%vsite_exclude_qm(ig))
336 l_val=cons_info%vsite_exclude_mm(ig))
339 l_val=cons_info%vsite_intermolecular(ig))
342 IF (cons_info%vsite_intermolecular(ig))
THEN
351 i_val=cons_info%const_vsite_mol(ig))
357 c_val=cons_info%const_vsite_molname(ig))
359 IF ((cons_info%const_vsite_mol(ig) /= 0) .AND. (cons_info%const_vsite_molname(ig) /=
"UNDEF"))
THEN
360 CALL cp_abort(__location__, &
361 "Invalid VIRTUAL_SITE constraint section "//
cp_to_string(ig)//
": "// &
362 "check MOLECULE and MOLNAME setup!")
364 IF ((cons_info%const_vsite_mol(ig) == 0) .AND. (cons_info%const_vsite_molname(ig) ==
"UNDEF") .AND. &
365 (.NOT. cons_info%vsite_intermolecular(ig)))
THEN
366 CALL cp_abort(__location__, &
367 "Invalid VIRTUAL_SITE constraint section "//
cp_to_string(ig)//
": "// &
368 "check MOLECULE and MOLNAME setup!")
374 cons_info%const_vsite_a(ig) = ilist(1)
375 cons_info%const_vsite_b(ig) = ilist(2)
376 cons_info%const_vsite_c(ig) = ilist(3)
377 cons_info%const_vsite_d(ig) = ilist(4)
378 cons_info%const_vsite_wbc(ig) = rlist(1)
379 cons_info%const_vsite_wdc(ig) = rlist(2)
383 CALL section_vals_get(fix_atom_section, explicit=explicit, n_repetition=ncons)
385 NULLIFY (tmplist, tmpstringlist)
388 ALLOCATE (cons_info%fixed_atoms(isize))
389 ALLOCATE (cons_info%fixed_type(isize))
390 ALLOCATE (cons_info%fixed_restraint(isize))
391 ALLOCATE (cons_info%fixed_k0(isize))
392 ALLOCATE (cons_info%fixed_molnames(msize))
393 ALLOCATE (cons_info%fixed_mol_type(isize))
394 ALLOCATE (cons_info%fixed_mol_restraint(msize))
395 ALLOCATE (cons_info%fixed_mol_k0(msize))
396 ALLOCATE (cons_info%fixed_exclude_qm(ncons))
397 ALLOCATE (cons_info%fixed_exclude_mm(ncons))
407 i_rep_val=jg, i_vals=tmplist)
408 CALL reallocate(cons_info%fixed_atoms, 1, isize +
SIZE(tmplist))
409 cons_info%fixed_atoms(isize + 1:isize +
SIZE(tmplist)) = tmplist
410 CALL reallocate(cons_info%fixed_restraint, 1, isize +
SIZE(tmplist))
411 CALL reallocate(cons_info%fixed_k0, 1, isize +
SIZE(tmplist))
412 CALL reallocate(cons_info%fixed_type, 1, isize +
SIZE(tmplist))
413 cons_info%fixed_type(isize + 1:isize +
SIZE(tmplist)) = itype
414 isize =
SIZE(cons_info%fixed_atoms)
417 IF ((isize - isize_old) > 0)
THEN
418 CALL check_restraint(fix_atom_section, &
419 is_restraint=cons_info%fixed_restraint(isize_old + 1), &
420 k0=cons_info%fixed_k0(isize_old + 1), &
423 cons_info%fixed_restraint(isize_old + 1:isize) = cons_info%fixed_restraint(isize_old + 1)
424 cons_info%fixed_k0(isize_old + 1:isize) = cons_info%fixed_k0(isize_old + 1)
431 i_rep_val=jg, c_vals=tmpstringlist)
432 CALL reallocate(cons_info%fixed_molnames, 1, msize +
SIZE(tmpstringlist, 1))
433 CALL reallocate(cons_info%fixed_mol_type, 1, msize +
SIZE(tmpstringlist, 1))
434 CALL reallocate(cons_info%fixed_mol_restraint, 1, msize +
SIZE(tmpstringlist, 1))
435 CALL reallocate(cons_info%fixed_mol_k0, 1, msize +
SIZE(tmpstringlist, 1))
436 cons_info%fixed_molnames(msize + 1:msize +
SIZE(tmpstringlist, 1)) = tmpstringlist
437 cons_info%fixed_mol_type(msize + 1:msize +
SIZE(tmpstringlist, 1)) = itype
438 msize =
SIZE(cons_info%fixed_molnames)
441 CALL reallocate(cons_info%fixed_exclude_qm, 1, msize)
442 CALL reallocate(cons_info%fixed_exclude_mm, 1, msize)
444 l_val=cons_info%fixed_exclude_qm(msize_old + 1))
446 l_val=cons_info%fixed_exclude_mm(msize_old + 1))
447 cons_info%fixed_exclude_qm(msize_old + 1:msize) = cons_info%fixed_exclude_qm(msize_old + 1)
448 cons_info%fixed_exclude_mm(msize_old + 1:msize) = cons_info%fixed_exclude_mm(msize_old + 1)
452 CALL check_restraint(fix_atom_section, &
453 is_restraint=cons_info%fixed_mol_restraint(msize_old + 1), &
454 k0=cons_info%fixed_mol_k0(msize_old + 1), &
457 cons_info%fixed_mol_restraint(msize_old + 1:msize) = cons_info%fixed_mol_restraint(msize_old + 1)
458 cons_info%fixed_mol_k0(msize_old + 1:msize) = cons_info%fixed_mol_k0(msize_old + 1)
461 n_rep_val=nrep, explicit=explicit)
462 IF (nrep == 1 .AND. explicit)
THEN
466 cons_info%freeze_mm_type = itype
469 n_rep_val=nrep, explicit=explicit)
470 IF (nrep == 1 .AND. explicit)
THEN
474 cons_info%freeze_qm_type = itype
477 CALL check_restraint(fix_atom_section, &
478 is_restraint=cons_info%fixed_mm_restraint, &
479 k0=cons_info%fixed_mm_k0, &
484 CALL check_restraint(fix_atom_section, &
485 is_restraint=cons_info%fixed_qm_restraint, &
486 k0=cons_info%fixed_qm_k0, &
492 IF ((isize /= 0) .OR. (msize /= 0) .OR. &
499 CALL section_vals_get(collective_section, explicit=explicit, n_repetition=ncons)
504 IF (icolvar >
SIZE(colvar_p))
THEN
505 cpabort(
"More collective constraints than collective variables specified.")
508 cons_info%nconst_colv = ncons
509 ALLOCATE (cons_info%const_colv_mol(ncons))
510 ALLOCATE (cons_info%const_colv_molname(ncons))
511 ALLOCATE (cons_info%const_colv_target(ncons))
512 ALLOCATE (cons_info%const_colv_target_growth(ncons))
513 ALLOCATE (cons_info%colvar_set(ncons))
514 ALLOCATE (cons_info%colv_intermolecular(ncons))
515 ALLOCATE (cons_info%colv_restraint(ncons))
516 ALLOCATE (cons_info%colv_k0(ncons))
517 ALLOCATE (cons_info%colv_exclude_qm(ncons))
518 ALLOCATE (cons_info%colv_exclude_mm(ncons))
520 CALL check_restraint(collective_section, &
521 is_restraint=cons_info%colv_restraint(ig), &
522 k0=cons_info%colv_k0(ig), &
525 cons_info%const_colv_mol(ig) = 0
526 cons_info%const_colv_molname(ig) =
"UNDEF"
529 l_val=cons_info%colv_exclude_qm(ig))
531 l_val=cons_info%colv_exclude_mm(ig))
534 l_val=cons_info%colv_intermolecular(ig))
537 IF (cons_info%colv_intermolecular(ig))
THEN
546 i_val=cons_info%const_colv_mol(ig))
552 c_val=cons_info%const_colv_molname(ig))
554 IF (((cons_info%const_colv_mol(ig) /= 0) .AND. (cons_info%const_colv_molname(ig) /=
"UNDEF")))
THEN
555 cpabort(
"Both MOLNAME and MOLECULE specified for CONSTRAINT section. ")
557 IF ((cons_info%const_colv_mol(ig) == 0) .AND. (cons_info%const_colv_molname(ig) ==
"UNDEF") .AND. &
558 (.NOT. cons_info%colv_intermolecular(ig)))
THEN
559 CALL cp_abort(__location__, &
560 "Constraint section error: you have to specify at least one of the "// &
561 "following keywords: MOLECULE, MOLNAME or INTERMOLECULAR! ")
563 NULLIFY (cons_info%colvar_set(ig)%colvar)
567 colvar_p(icolvar)%colvar)
569 n_rep_val=n_rep, i_rep_section=ig)
572 r_val=cons_info%const_colv_target(ig), i_rep_section=ig)
574 cons_info%const_colv_target(ig) = -huge(0.0_dp)
577 r_val=cons_info%const_colv_target_growth(ig), i_rep_section=ig)