@@ -10,29 +10,62 @@ import { Made } from "@exabyte-io/made.js";
10
10
import { PERIODIC_TABLE } from "@exabyte-io/periodic-table.js" ;
11
11
import lodash from "lodash" ;
12
12
import { mix } from "mixwith" ;
13
- import _ from "underscore" ;
14
13
import s from "underscore.string" ;
15
14
16
15
import { ExecutableContextProvider } from "../../providers" ;
17
16
18
17
export class QEPWXContextProvider extends mix ( ExecutableContextProvider ) . with (
19
18
MaterialContextMixin ,
19
+ MaterialsContextMixin ,
20
20
MethodDataContextMixin ,
21
21
WorkflowContextMixin ,
22
22
JobContextMixin ,
23
23
) {
24
24
static Material = Made . Material ;
25
25
26
- get atomSymbols ( ) {
27
- return this . material . Basis . uniqueElements ;
26
+ static atomSymbols ( material ) {
27
+ return material . Basis . uniqueElements ;
28
+ }
29
+
30
+ /** Returns the input text block for atomic positions WITH constraints.
31
+ */
32
+ static atomicPositionsWithConstraints ( material ) {
33
+ return material . Basis . atomicPositionsWithConstraints . join ( "\n" ) ;
34
+ }
35
+
36
+ /** Returns the input text block for atomic positions
37
+ * Note: does NOT include constraints
38
+ */
39
+ static atomicPositions ( material ) {
40
+ return material . Basis . atomicPositions . join ( "\n" ) ;
41
+ }
42
+
43
+ static NAT ( material ) {
44
+ return material . Basis . atomicPositions . length ;
45
+ }
46
+
47
+ static NTYP ( material ) {
48
+ return material . Basis . uniqueElements . length ;
28
49
}
29
50
30
- get atomicPositionsWithoutConstraints ( ) {
31
- return this . material . Basis . atomicPositions ;
51
+ buildQEPWXContext ( material ) {
52
+ const IBRAV = 0 ; // use CELL_PARAMETERS to define Bravais lattice
53
+
54
+ return {
55
+ IBRAV ,
56
+ RESTART_MODE : this . RESTART_MODE ,
57
+ ATOMIC_SPECIES : this . ATOMIC_SPECIES ( material ) ,
58
+ NAT : QEPWXContextProvider . NAT ( material ) ,
59
+ NTYP : QEPWXContextProvider . NTYP ( material ) ,
60
+ ATOMIC_POSITIONS : QEPWXContextProvider . atomicPositionsWithConstraints ( material ) ,
61
+ ATOMIC_POSITIONS_WITHOUT_CONSTRAINTS : QEPWXContextProvider . atomicPositions ( material ) ,
62
+ CELL_PARAMETERS : QEPWXContextProvider . CELL_PARAMETERS ( material ) ,
63
+ } ;
32
64
}
33
65
34
- get atomicPositions ( ) {
35
- return this . material . Basis . atomicPositionsWithConstraints ;
66
+ getDataPerMaterial ( ) {
67
+ if ( ! this . materials || this . materials . length <= 1 ) return { } ;
68
+ return { perMaterial : this . materials . map ( ( material ) => this . buildQEPWXContext ( material ) ) } ;
36
69
}
37
70
38
71
/*
@@ -44,17 +77,9 @@ export class QEPWXContextProvider extends mix(ExecutableContextProvider).with(
44
77
// ECUTWFC = 40;
45
78
// ECUTRHO = 200;
46
79
47
- const IBRAV = 0 ;
48
-
49
80
return {
50
- IBRAV ,
51
- RESTART_MODE : this . RESTART_MODE ,
52
- NAT : this . atomicPositions . length ,
53
- NTYP : this . atomSymbols . length ,
54
- ATOMIC_POSITIONS : this . atomicPositions . join ( "\n" ) ,
55
- ATOMIC_POSITIONS_WITHOUT_CONSTRAINTS : this . atomicPositionsWithoutConstraints . join ( "\n" ) ,
56
- CELL_PARAMETERS : this . CELL_PARAMETERS ,
57
- ATOMIC_SPECIES : this . ATOMIC_SPECIES ,
81
+ ...this . buildQEPWXContext ( this . material ) ,
82
+ ...this . getDataPerMaterial ( ) ,
58
83
} ;
59
84
}
60
85
@@ -66,16 +91,25 @@ export class QEPWXContextProvider extends mix(ExecutableContextProvider).with(
66
91
return ( this . methodData . pseudo || [ ] ) . find ( ( p ) => p . element === symbol ) ;
67
92
}
68
93
69
- get ATOMIC_SPECIES ( ) {
70
- // atomic species with pseudopotentials
71
- return _ . map ( this . atomSymbols , ( symbol ) => {
72
- const pseudo = this . getPseudoBySymbol ( symbol ) ;
73
- return QEPWXContextProvider . symbolToAtomicSpecie ( symbol , pseudo ) ;
74
- } ) . join ( "\n" ) ;
94
+ /** Builds ATOMIC SPECIES block of pw.x input in the format
95
+ * X Mass_X PseudoPot_X
96
+ * where X is the atom label
97
+ * Mass_X is the mass of element X [amu]
98
+ * PseudoPot_X is the pseudopotential filename associated with element X
99
+ *
100
+ * Note: assumes this.methodData is defined
101
+ */
102
+ ATOMIC_SPECIES ( material ) {
103
+ return QEPWXContextProvider . atomSymbols ( material )
104
+ . map ( ( symbol ) => {
105
+ const pseudo = this . getPseudoBySymbol ( symbol ) ;
106
+ return QEPWXContextProvider . symbolToAtomicSpecie ( symbol , pseudo ) ;
107
+ } )
108
+ . join ( "\n" ) ;
75
109
}
76
110
77
- get CELL_PARAMETERS ( ) {
78
- return this . material . Lattice . vectorArrays
111
+ static CELL_PARAMETERS ( material ) {
112
+ return material . Lattice . vectorArrays
79
113
. map ( ( x ) => {
80
114
return x
81
115
. map ( ( y ) => {
@@ -114,7 +148,10 @@ export class QENEBContextProvider extends mix(ExecutableContextProvider).with(
114
148
} ) ;
115
149
116
150
return {
117
- ..._ . omit ( PWXContexts [ 0 ] , [ "ATOMIC_POSITIONS" , "ATOMIC_POSITIONS_WITHOUT_CONSTRAINTS" ] ) ,
151
+ ...lodash . omit ( PWXContexts [ 0 ] , [
152
+ "ATOMIC_POSITIONS" ,
153
+ "ATOMIC_POSITIONS_WITHOUT_CONSTRAINTS" ,
154
+ ] ) ,
118
155
FIRST_IMAGE : PWXContexts [ 0 ] . ATOMIC_POSITIONS ,
119
156
LAST_IMAGE : PWXContexts [ PWXContexts . length - 1 ] . ATOMIC_POSITIONS ,
120
157
INTERMEDIATE_IMAGES : PWXContexts . slice ( 1 , PWXContexts . length - 1 ) . map (
0 commit comments