Skip to content

Commit 30c1287

Browse files
author
andy
committed
Merge branch 'worktree-agent-a133b1aed30f97f9e'
2 parents fa59717 + 97f3e34 commit 30c1287

14 files changed

Lines changed: 5261 additions & 6 deletions

File tree

‎data/client/config/PropertyPanelDescriptor.xml‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,25 @@
279279
<property name="HEXPOLE"/>
280280
</PropertyPanel>
281281

282+
<!-- Gaussian Freq=Anharmonic, offered by the Runtype Details dialog since
283+
issue #110. The harmonic modes keep their own NModePanel; these are
284+
the second-order perturbative fundamentals, one value per mode, and a
285+
two-column table is all they need. Without these two entries the
286+
keys would be extracted and never displayed anywhere. -->
287+
<PropertyPanel>
288+
<name>Anharmonic Frequencies</name>
289+
<class>DefaultVecPanel</class>
290+
<consumer>true</consumer>
291+
<property name="ANHARMFREQ"/>
292+
</PropertyPanel>
293+
294+
<PropertyPanel>
295+
<name>Anharmonic IR Intensities</name>
296+
<class>DefaultVecPanel</class>
297+
<consumer>true</consumer>
298+
<property name="ANHARMIR"/>
299+
</PropertyPanel>
300+
282301

283302
<PropertyPanel>
284303
<name>Partial Charges</name>

‎data/client/config/properties‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,12 @@ Vibration IR Intensities VIBIR IRIntensity PropVector<Normal Mode>
201201
Vibration Raman Activities VIBRAM RamanIntensity PropVector<Normal Mode>
202202
Vibration Vib Mode Symmetries VIBSYM NA PropVecString<Normal Mode>
203203
#
204+
# Freq=Anharmonic (Gaussian 16). Second-order perturbative fundamental
205+
# bands: the anharmonic transition energy and integrated IR intensity,
206+
# one per normal mode. Displayed by DefaultVecPanel.
207+
Vibration Anharmonic Frequencies ANHARMFREQ Frequency PropVector<Normal Mode>
208+
Vibration Anharmonic IR Intensities ANHARMIR IRIntensity PropVector<Normal Mode>
209+
#
204210
#
205211
Derived S**2 S2 NA PropValue
206212
Derived S**2 After Annihilation S2A NA PropValue

‎scripts/codereg/ged16runtype.py‎

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,105 @@ def __init__(self, parent, helpURL):
244244
label = "FD Step Size:")
245245
vibSizer.AddWidget(self.fdStep)
246246

247+
# ---------------------------------------------------------
248+
# Freq= options (issue #110). Every one of these was run
249+
# through the installed Gaussian 16 before being offered
250+
# here, water/B3LYP/STO-3G, and two combinations turn out to
251+
# be FATAL rather than merely ignored -- see CheckDependency
252+
# below, which is what stops the user asking for them:
253+
#
254+
# Freq=(Raman,Numerical) "Unrecognized FrqTyp= 9",
255+
# Error termination in l1.exe
256+
# Freq=(Anharmonic,Projected) "Mismatch between the number
257+
# of normal modes of the current
258+
# calculation and the input
259+
# source: 3 vs 2", l717.exe
260+
#
261+
# Everything else here ran to Normal termination, including
262+
# Raman with EnOnly, Raman with HPModes, Anharmonic with
263+
# Numerical, and Anharmonic with each of VibRot,
264+
# SaveNormalModes and HPModes.
265+
# ---------------------------------------------------------
266+
267+
# Gaussian computes Raman activities by default for HF but
268+
# NOT for DFT, so for the methods most people use the
269+
# VIBRAM property gaussian-16.desc has always parsed was
270+
# simply never produced. Default off: it costs extra work.
271+
self.raman = EcceCheckBox(self,
272+
label = " Raman Activities",
273+
name = "ES.Runtype.Vibration.ComputeRaman",
274+
default = 0)
275+
vibSizer.AddWidget(self.raman)
276+
277+
# Second-order perturbative anharmonic analysis. The
278+
# harmonic block is still printed and still feeds
279+
# VIB/VIBFREQ/...; the fundamentals are extracted separately
280+
# into ANHARMFREQ/ANHARMIR by gaussian-16.anharm.
281+
self.anharmonic = EcceCheckBox(self,
282+
label = " Anharmonic Frequencies",
283+
name = "ES.Runtype.Vibration.Anharmonic",
284+
default = 0)
285+
vibSizer.AddWidget(self.anharmonic)
286+
287+
# High-precision normal modes. Gaussian then prints the
288+
# modes TWICE under an identical header; gaussian-16.vib
289+
# drops the high-precision copy, which it could not read and
290+
# which used to make VIBFREQ come out with twice as many
291+
# values as row labels.
292+
self.hpModes = EcceCheckBox(self,
293+
label = " High-Precision Modes",
294+
name = "ES.Runtype.Vibration.HighPrecisionModes",
295+
default = 0)
296+
vibSizer.AddWidget(self.hpModes)
297+
298+
self.projected = EcceCheckBox(self,
299+
label = " Project Out Translation/Rotation",
300+
name = "ES.Runtype.Vibration.Projected",
301+
default = 0)
302+
vibSizer.AddWidget(self.projected)
303+
304+
self.vibRot = EcceCheckBox(self,
305+
label = " Vibration-Rotation Coupling",
306+
name = "ES.Runtype.Vibration.VibRot",
307+
default = 0)
308+
vibSizer.AddWidget(self.vibRot)
309+
310+
self.saveNormalModes = EcceCheckBox(self,
311+
label = " Save Normal Modes To Checkpoint",
312+
name = "ES.Runtype.Vibration.SaveNormalModes",
313+
default = 0)
314+
vibSizer.AddWidget(self.saveNormalModes)
315+
316+
# Thermochemistry conditions. Same checkbox-enables-a-value
317+
# shape as Max Steps above, so that a deck that does not ask
318+
# for them carries no Temperature=/Pressure= at all and
319+
# Gaussian keeps its own 298.15 K / 1 atm defaults.
320+
self.thermoCheckBox = EcceCheckBox(self,
321+
label = " Thermochemistry At:",
322+
name = "ES.Runtype.Vibration.UseThermochemistry",
323+
default = 0)
324+
vibSizer.AddWidget(self.thermoCheckBox)
325+
326+
self.temperature = EcceFloatInput(self,
327+
unit = "Kelvin",
328+
name = "ES.Runtype.Vibration.Temperature",
329+
default = 298.15,
330+
hardRange = "(0..)",
331+
softRange = "(0..5000]",
332+
label = "Temperature:",
333+
export = 1)
334+
vibSizer.AddWidget(self.temperature)
335+
336+
self.pressure = EcceFloatInput(self,
337+
unit = "Atmosphere",
338+
name = "ES.Runtype.Vibration.Pressure",
339+
default = 1.0,
340+
hardRange = "(0..)",
341+
softRange = "(0..1000]",
342+
label = "Pressure:",
343+
export = 1)
344+
vibSizer.AddWidget(self.pressure)
345+
247346
self.panelSizer.Add(vibSizer)
248347
if EcceGlobals.RunType == "Magnetic":
249348
magneticSizer = EcceBoxSizer(self,
@@ -279,6 +378,24 @@ def CheckDependency(self):
279378
EcceGlobals.RunType == "GeoVib"):
280379
self.fdStep.Enable(self.vibMethod.GetValue() != "Analytic")
281380

381+
# Both of these combinations are fatal in Gaussian 16, not
382+
# merely ignored -- see the comment where the controls are
383+
# built. Disabling rather than warning keeps them
384+
# unaskable; ai.gauss16 refuses them again in its main flow,
385+
# because a calculation saved before this dialog existed can
386+
# still carry the offending pair.
387+
ramanOK = (self.vibMethod.GetValue() != "Numerical 2nd Derivative")
388+
self.raman.Enable(ramanOK)
389+
if not ramanOK:
390+
self.raman.SetValue(0)
391+
392+
self.projected.Enable(not self.anharmonic.GetValue())
393+
if self.anharmonic.GetValue():
394+
self.projected.SetValue(0)
395+
396+
self.temperature.Enable(self.thermoCheckBox.GetValue())
397+
self.pressure.Enable(self.thermoCheckBox.GetValue())
398+
282399

283400
frame = Ged16RunTypeFrame(None,
284401
title = "ECCE Gaussian-16 Editor: Runtype Details",

‎scripts/codereg/ged16theory.py‎

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,26 @@ def __init__(self,parent,helpURL=""):
352352
"PBE 96",
353353
"OPTX",
354354
"TPSS",
355-
# "REvTPSS",
355+
# Was commented out with an "REvTPSS" spelling
356+
# the generator never had a live case for. The
357+
# keyword is revTPSS, and Gaussian 16 echoes it
358+
# back on the SCF Done line, which is how these
359+
# were checked rather than by reading the manual:
360+
#
361+
# E(RrevTPSS-revTPSS) = -75.2990044687
362+
# E(RrevTPSS-LYP) = -75.2831736550
363+
# E(RrevTPSS-P86) = -75.3163932200
364+
# E(RrevTPSS-PBE) = -75.2873811492
365+
# E(RrevTPSS-VWN5) = -75.6159196963
366+
# E(RB-revTPSS) = -75.2933581789
367+
# E(RPBE-revTPSS) = -75.2371756525
368+
# E(RTPSS-revTPSS) = -75.3377718381
369+
#
370+
# (water/STO-3G). The correlation half was
371+
# already live in ai.gauss16 and offered by no
372+
# dialog -- a capability the UI could not reach,
373+
# which tests/dialogs has been reporting.
374+
"RevTPSS",
356375
"Becke89", #BRx -- no space: ai.gauss*.pm matches "Becke89"
357376
"PKZB",
358377
"wPBEh", #aka HSE
@@ -375,7 +394,7 @@ def __init__(self,parent,helpURL=""):
375394
"Becke95 (nonlocal)",
376395
"PBE 96 (nonlocal)",
377396
"TPSS",
378-
# "RevTPSS",
397+
"RevTPSS",
379398
"KCIS",
380399
"BRC",
381400
"PKZB"
@@ -582,7 +601,53 @@ def __init__(self,parent,helpURL=""):
582601
export = 1)
583602
fzSizer.AddWidget(self.exSpin)
584603
self.panelSizer.Add(fzSizer)
585-
604+
605+
# -------------------------------------------------------------
606+
# Additional route options (issue #113).
607+
#
608+
# Gaussian lets a user build a non-standard functional by giving
609+
# the exchange and correlation mixing parameters directly --
610+
# IOp(3/74=), IOp(3/76=), IOp(3/77=), IOp(3/78=) -- which is how
611+
# published reparameterisations are reproduced and how a
612+
# functional Gaussian has no keyword for is run at all. ECCE
613+
# had no way to express that: every route-card token is
614+
# generated from a controlled vocabulary.
615+
#
616+
# This is deliberately ONE free-text field rather than a set of
617+
# numeric mixing-parameter boxes. A box per IOp would cover
618+
# only the functional-definition case and would be a second
619+
# hand-maintained copy of Gaussian's IOp table -- the two-lists
620+
# bug this codebase has been bitten by repeatedly. A verbatim
621+
# passthrough has no list to drift from, and covers IOp plus
622+
# everything else a user currently cannot ask for.
623+
#
624+
# The cost is that it is outside the dialog/generator crosscheck
625+
# tests/dialogs performs, by construction: a typo here becomes a
626+
# Gaussian error rather than a caught mismatch. That is the
627+
# accepted trade for an explicitly expert control, and it is why
628+
# the label says so.
629+
#
630+
# ai.gauss16 appends the text LAST, after every generated token
631+
# and after the MPW1K/BB1K IOp lines, so where it contradicts
632+
# what the dialog generated it is Gaussian's last-wins ordering
633+
# that decides -- and the user's text is the last word.
634+
# -------------------------------------------------------------
635+
routeSizer = EcceBoxSizer(self,
636+
label = "Additional Route Options (expert)",
637+
cols = 1)
638+
self.routeOptions = EcceTextInput(self,
639+
size = (420, -1),
640+
name = "ES.Theory.AdditionalRouteOptions",
641+
default = "",
642+
label = "Append to route card:",
643+
export = 1,
644+
tip = "Text appended verbatim to the "
645+
"end of the Gaussian route card, "
646+
"e.g. IOp(3/76=1000002000). Not "
647+
"checked by ECCE.")
648+
routeSizer.AddWidget(self.routeOptions)
649+
self.panelSizer.Add(routeSizer)
650+
586651
self.AddButtons()
587652

588653

0 commit comments

Comments
 (0)