10
10
11
11
Additional functionality:
12
12
13
- - Setting ``'align_to_fermi': True `` in the inputs will ensure that the energy range is centred around the Fermi
14
- energy when `Emin` and `Emax` are provided for both the `dos` and `projwfc` inputs . This is useful when you are only
15
- interested in a certain energy range around the Fermi energy. By default the energy range is extracted from the
16
- NSCF calculation .
13
+ - Setting ``'energy_range_vs_fermi' `` in the inputs allows to specify an energy range around the Fermi level that should
14
+ be covered by the DOS and PDOS . This is useful when you are only interested in a certain energy range around the
15
+ Fermi energy. By default, this is not specified and the energy range given in the `dos.x` and `projwfc.x`
16
+ inputs will be used .
17
17
18
18
Storage memory management:
19
19
@@ -97,7 +97,6 @@ def validate_inputs(value, _):
97
97
98
98
- Check that either the `scf` or `nscf.pw.parent_folder` inputs is provided.
99
99
- Check that the `Emin`, `Emax` and `DeltaE` inputs are the same for the `dos` and `projwfc` namespaces.
100
- - Check that `Emin` and `Emax` are provided in case `align_to_fermi` is set to `True`.
101
100
"""
102
101
# Check that either the `scf` input or `nscf.pw.parent_folder` is provided.
103
102
import warnings
@@ -113,10 +112,13 @@ def validate_inputs(value, _):
113
112
if value ['dos' ]['parameters' ]['DOS' ].get (par , None ) != value ['projwfc' ]['parameters' ]['PROJWFC' ].get (par , None ):
114
113
return f'The `{ par } `` parameter has to be equal for the `dos` and `projwfc` inputs.'
115
114
116
- if value .get ('align_to_fermi ' , False ):
115
+ if value .get ('energy_range_vs_fermi ' , False ):
117
116
for par in ['Emin' , 'Emax' ]:
118
- if value ['dos' ]['parameters' ]['DOS' ].get (par , None ) is None :
119
- return f'The `{ par } `` parameter must be set in case `align_to_fermi` is set to `True`.'
117
+ if value ['dos' ]['parameters' ]['DOS' ].get (par , None ):
118
+ warnings .warn (
119
+ f'The `{ par } ` parameter and `energy_range_vs_fermi` were specified.'
120
+ 'The value in `energy_range_vs_fermi` will be used.'
121
+ )
120
122
121
123
if 'nbands_factor' in value and 'nbnd' in value ['nscf' ]['pw' ]['parameters' ].base .attributes .get ('SYSTEM' , {}):
122
124
return PdosWorkChain .exit_codes .ERROR_INVALID_INPUT_NUMBER_OF_BANDS .message
@@ -160,6 +162,17 @@ def validate_projwfc(value, _):
160
162
jsonschema .validate (value ['parameters' ].get_dict ()['PROJWFC' ], get_parameter_schema ())
161
163
162
164
165
+ def validate_energy_range_vs_fermi (value , _ ):
166
+ """Validate specified energy_range_vs_fermi.
167
+
168
+ - List needs to consist of two float values.
169
+ """
170
+ if len (value ) != 2 :
171
+ return f'`energy_range_vs_fermi` should be a `List` of length two, but got: { value } '
172
+ if not all (isinstance (val , (float , int )) for val in value ):
173
+ return f'`energy_range_vs_fermi` should be a `List` of floats, but got: { value } '
174
+
175
+
163
176
def clean_calcjob_remote (node ):
164
177
"""Clean the remote directory of a ``CalcJobNode``."""
165
178
cleaned = False
@@ -220,14 +233,15 @@ def define(cls, spec):
220
233
help = 'Terminate workchain steps before submitting calculations (test purposes only).'
221
234
)
222
235
spec .input (
223
- 'align_to_fermi' ,
224
- valid_type = orm .Bool ,
236
+ 'energy_range_vs_fermi' ,
237
+ valid_type = orm .List ,
238
+ required = False ,
225
239
serializer = to_aiida_type ,
226
- default = lambda : orm . Bool ( False ) ,
240
+ validator = validate_energy_range_vs_fermi ,
227
241
help = (
228
- 'If true, Emin=>Emin-Efermi & Emax=>Emax-Efermi, where Efermi is taken from the `nscf` calculation. '
229
- 'Note that it only makes sense to align ` Emax` and `Emin` to the fermi level in case they are actually '
230
- 'provided by in the `dos` and `projwfc` inputs, since otherwise the '
242
+ 'Energy range with respect to the Fermi level that should be covered in DOS and PROJWFC calculation.'
243
+ 'If not specified but Emin and Emax are specified in the input parameters, these values will be used. '
244
+ 'Otherwise, the default values are extracted from the NSCF calculation. '
231
245
)
232
246
)
233
247
spec .input ('nbands_factor' , valid_type = orm .Float , required = False ,
@@ -383,6 +397,9 @@ def setup(self):
383
397
"""Initialize context variables that are used during the logical flow of the workchain."""
384
398
self .ctx .serial_clean = 'serial_clean' in self .inputs and self .inputs .serial_clean .value
385
399
self .ctx .dry_run = 'dry_run' in self .inputs and self .inputs .dry_run .value
400
+ self .ctx .energy_range_vs_fermi = (
401
+ self .inputs .energy_range_vs_fermi if 'energy_range_vs_fermi' in self .inputs else None
402
+ )
386
403
387
404
def serial_clean (self ):
388
405
"""Return whether dos and projwfc calculations should be run in serial.
@@ -491,9 +508,12 @@ def _generate_dos_inputs(self):
491
508
dos_inputs .parent_folder = self .ctx .nscf_parent_folder
492
509
dos_parameters = self .inputs .dos .parameters .get_dict ()
493
510
494
- if dos_parameters .pop ('align_to_fermi' , False ):
495
- dos_parameters ['DOS' ]['Emin' ] = dos_parameters ['Emin' ] + self .ctx .nscf_fermi
496
- dos_parameters ['DOS' ]['Emax' ] = dos_parameters ['Emax' ] + self .ctx .nscf_fermi
511
+ if self .ctx .energy_range_vs_fermi :
512
+ dos_parameters ['DOS' ]['Emin' ] = self .ctx .energy_range_vs_fermi [0 ] + self .ctx .nscf_fermi
513
+ dos_parameters ['DOS' ]['Emax' ] = self .ctx .energy_range_vs_fermi [1 ] + self .ctx .nscf_fermi
514
+ else :
515
+ dos_parameters ['DOS' ].setdefault ('Emin' , self .ctx .nscf_emin )
516
+ dos_parameters ['DOS' ].setdefault ('Emax' , self .ctx .nscf_emax )
497
517
498
518
dos_inputs .parameters = orm .Dict (dos_parameters )
499
519
dos_inputs ['metadata' ]['call_link_label' ] = 'dos'
@@ -505,9 +525,12 @@ def _generate_projwfc_inputs(self):
505
525
projwfc_inputs .parent_folder = self .ctx .nscf_parent_folder
506
526
projwfc_parameters = self .inputs .projwfc .parameters .get_dict ()
507
527
508
- if projwfc_parameters .pop ('align_to_fermi' , False ):
509
- projwfc_parameters ['PROJWFC' ]['Emin' ] = projwfc_parameters ['Emin' ] + self .ctx .nscf_fermi
510
- projwfc_parameters ['PROJWFC' ]['Emax' ] = projwfc_parameters ['Emax' ] + self .ctx .nscf_fermi
528
+ if self .ctx .energy_range_vs_fermi :
529
+ projwfc_parameters ['PROJWFC' ]['Emin' ] = self .ctx .energy_range_vs_fermi [0 ] + self .ctx .nscf_fermi
530
+ projwfc_parameters ['PROJWFC' ]['Emax' ] = self .ctx .energy_range_vs_fermi [1 ] + self .ctx .nscf_fermi
531
+ else :
532
+ projwfc_parameters ['PROJWFC' ].setdefault ('Emin' , self .ctx .nscf_emin )
533
+ projwfc_parameters ['PROJWFC' ].setdefault ('Emax' , self .ctx .nscf_emax )
511
534
512
535
projwfc_inputs .parameters = orm .Dict (projwfc_parameters )
513
536
projwfc_inputs ['metadata' ]['call_link_label' ] = 'projwfc'
0 commit comments