@mat3ra/wode 2025.10.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/.babelrc +17 -0
  2. package/LICENSE.md +15 -0
  3. package/README.md +164 -0
  4. package/assets/subworkflows/deepmd/deepmd.yml +31 -0
  5. package/assets/subworkflows/deepmd/espresso_cp_md.yml +16 -0
  6. package/assets/subworkflows/espresso/average_electrostatic_potential_find_minima.yml +27 -0
  7. package/assets/subworkflows/espresso/average_electrostatic_potential_via_band_structure.yml +67 -0
  8. package/assets/subworkflows/espresso/band_gap.yml +21 -0
  9. package/assets/subworkflows/espresso/band_gap_hse_dos.yml +30 -0
  10. package/assets/subworkflows/espresso/band_structure.yml +26 -0
  11. package/assets/subworkflows/espresso/band_structure_dos.yml +34 -0
  12. package/assets/subworkflows/espresso/band_structure_hse.yml +30 -0
  13. package/assets/subworkflows/espresso/band_structure_magn.yml +31 -0
  14. package/assets/subworkflows/espresso/band_structure_soc.yml +30 -0
  15. package/assets/subworkflows/espresso/dielectric_tensor.yml +35 -0
  16. package/assets/subworkflows/espresso/dos.yml +24 -0
  17. package/assets/subworkflows/espresso/electronic_density_mesh.yml +19 -0
  18. package/assets/subworkflows/espresso/esm.yml +14 -0
  19. package/assets/subworkflows/espresso/esm_relax.yml +14 -0
  20. package/assets/subworkflows/espresso/espresso_extract_kpoints.yml +16 -0
  21. package/assets/subworkflows/espresso/espresso_xml_get_qpt_irr.yml +12 -0
  22. package/assets/subworkflows/espresso/fixed_cell_relaxation.yml +16 -0
  23. package/assets/subworkflows/espresso/gw_band_structure_band_gap_full_frequency.yml +22 -0
  24. package/assets/subworkflows/espresso/gw_band_structure_band_gap_plasmon_pole.yml +22 -0
  25. package/assets/subworkflows/espresso/hubbard_u_hp.yml +21 -0
  26. package/assets/subworkflows/espresso/kpoint_convergence.yml +86 -0
  27. package/assets/subworkflows/espresso/neb.yml +16 -0
  28. package/assets/subworkflows/espresso/ph_init_qpoints.yml +14 -0
  29. package/assets/subworkflows/espresso/ph_single_irr_qpt.yml +14 -0
  30. package/assets/subworkflows/espresso/phonon_dispersions.yml +29 -0
  31. package/assets/subworkflows/espresso/phonon_dos.yml +29 -0
  32. package/assets/subworkflows/espresso/phonon_dos_dispersion.yml +34 -0
  33. package/assets/subworkflows/espresso/phonon_reduce.yml +29 -0
  34. package/assets/subworkflows/espresso/post_processor.yml +14 -0
  35. package/assets/subworkflows/espresso/pre_processor.yml +14 -0
  36. package/assets/subworkflows/espresso/pw_scf.yml +16 -0
  37. package/assets/subworkflows/espresso/recalculate_bands.yml +19 -0
  38. package/assets/subworkflows/espresso/surface_energy.yml +16 -0
  39. package/assets/subworkflows/espresso/total_energy.yml +16 -0
  40. package/assets/subworkflows/espresso/valence_band_offset_calc_from_previous_esp_vbm.yml +35 -0
  41. package/assets/subworkflows/espresso/variable_cell_relaxation.yml +18 -0
  42. package/assets/subworkflows/espresso/zero_point_energy.yml +19 -0
  43. package/assets/subworkflows/jupyterLab/jupyter_notebook.yml +17 -0
  44. package/assets/subworkflows/nwchem/total_energy.yml +16 -0
  45. package/assets/subworkflows/python/ml/classification_tail.yml +56 -0
  46. package/assets/subworkflows/python/ml/clustering_tail.yml +62 -0
  47. package/assets/subworkflows/python/ml/regression_tail.yml +56 -0
  48. package/assets/subworkflows/python/ml/train_head.yml +61 -0
  49. package/assets/subworkflows/python/python_script.yml +14 -0
  50. package/assets/subworkflows/shell/batch_espresso_pwscf.yml +14 -0
  51. package/assets/subworkflows/shell/hello_world.yml +14 -0
  52. package/assets/subworkflows/vasp/band_gap.yml +21 -0
  53. package/assets/subworkflows/vasp/band_structure.yml +21 -0
  54. package/assets/subworkflows/vasp/band_structure_dos.yml +23 -0
  55. package/assets/subworkflows/vasp/dos.yml +18 -0
  56. package/assets/subworkflows/vasp/fixed_cell_relaxation.yml +16 -0
  57. package/assets/subworkflows/vasp/initial_final_total_energies.yml +25 -0
  58. package/assets/subworkflows/vasp/kpoint_convergence.yml +89 -0
  59. package/assets/subworkflows/vasp/neb_subworkflow.yml +16 -0
  60. package/assets/subworkflows/vasp/prepare_images.yml +16 -0
  61. package/assets/subworkflows/vasp/recalculate_bands.yml +16 -0
  62. package/assets/subworkflows/vasp/surface_energy.yml +18 -0
  63. package/assets/subworkflows/vasp/total_energy.yml +16 -0
  64. package/assets/subworkflows/vasp/variable_cell_relaxation.yml +18 -0
  65. package/assets/subworkflows/vasp/zero_point_energy.yml +16 -0
  66. package/assets/workflows/deepmd/deepmd_md.yml +6 -0
  67. package/assets/workflows/espresso/band_gap.yml +4 -0
  68. package/assets/workflows/espresso/band_gap_dos_hse.yml +4 -0
  69. package/assets/workflows/espresso/band_structure.yml +4 -0
  70. package/assets/workflows/espresso/band_structure_dos.yml +4 -0
  71. package/assets/workflows/espresso/band_structure_hse.yml +14 -0
  72. package/assets/workflows/espresso/band_structure_magn.yml +7 -0
  73. package/assets/workflows/espresso/band_structure_soc.yml +7 -0
  74. package/assets/workflows/espresso/dielectric_tensor.yml +4 -0
  75. package/assets/workflows/espresso/dos.yml +4 -0
  76. package/assets/workflows/espresso/electronic_density_mesh.yml +4 -0
  77. package/assets/workflows/espresso/esm.yml +4 -0
  78. package/assets/workflows/espresso/esm_relax.yml +4 -0
  79. package/assets/workflows/espresso/fixed_cell_relaxation.yml +4 -0
  80. package/assets/workflows/espresso/gw_band_structure_band_gap_full_frequency.yml +4 -0
  81. package/assets/workflows/espresso/gw_band_structure_band_gap_plasmon_pole.yml +4 -0
  82. package/assets/workflows/espresso/hubbard_u_hp.yml +7 -0
  83. package/assets/workflows/espresso/kpoint_convergence.yml +4 -0
  84. package/assets/workflows/espresso/neb.yml +4 -0
  85. package/assets/workflows/espresso/phonon_dispersions.yml +4 -0
  86. package/assets/workflows/espresso/phonon_dos.yml +4 -0
  87. package/assets/workflows/espresso/phonon_dos_dispersion.yml +4 -0
  88. package/assets/workflows/espresso/phonon_map.yml +28 -0
  89. package/assets/workflows/espresso/recalculate_bands.yml +4 -0
  90. package/assets/workflows/espresso/surface_energy.yml +4 -0
  91. package/assets/workflows/espresso/total_energy.yml +4 -0
  92. package/assets/workflows/espresso/valence_band_offset.yml +171 -0
  93. package/assets/workflows/espresso/variable_cell_relaxation.yml +4 -0
  94. package/assets/workflows/espresso/zero_point_energy.yml +4 -0
  95. package/assets/workflows/jupyterLab/jupyter_notebook.yml +4 -0
  96. package/assets/workflows/nwchem/total_energy.yml +4 -0
  97. package/assets/workflows/python/ml/classification_workflow.yml +9 -0
  98. package/assets/workflows/python/ml/clustering_workflow.yml +9 -0
  99. package/assets/workflows/python/ml/regression_workflow.yml +9 -0
  100. package/assets/workflows/python/python_script.yml +4 -0
  101. package/assets/workflows/shell/batch_espresso_pwscf.yml +4 -0
  102. package/assets/workflows/shell/hello_world.yml +4 -0
  103. package/assets/workflows/vasp/band_gap.yml +4 -0
  104. package/assets/workflows/vasp/band_structure.yml +4 -0
  105. package/assets/workflows/vasp/band_structure_dos.yml +4 -0
  106. package/assets/workflows/vasp/dos.yml +4 -0
  107. package/assets/workflows/vasp/fixed_cell_relaxation.yml +4 -0
  108. package/assets/workflows/vasp/kpoint_convergence.yml +4 -0
  109. package/assets/workflows/vasp/neb.yml +8 -0
  110. package/assets/workflows/vasp/recalculate_bands.yml +4 -0
  111. package/assets/workflows/vasp/surface_energy.yml +4 -0
  112. package/assets/workflows/vasp/total_energy.yml +4 -0
  113. package/assets/workflows/vasp/variable_cell_relaxation.yml +4 -0
  114. package/assets/workflows/vasp/zero_point_energy.yml +4 -0
  115. package/build_workflows.js +65 -0
  116. package/dist/context/context.js +49 -0
  117. package/dist/context/mixins/ApplicationContextMixin.js +19 -0
  118. package/dist/context/mixins/JobContextMixin.js +39 -0
  119. package/dist/context/mixins/MaterialContextMixin.js +40 -0
  120. package/dist/context/mixins/MaterialsContextMixin.js +19 -0
  121. package/dist/context/mixins/MaterialsSetContextMixin.js +25 -0
  122. package/dist/context/mixins/MethodDataContextMixin.js +48 -0
  123. package/dist/context/mixins/WorkflowContextMixin.js +28 -0
  124. package/dist/context/providers/BoundaryConditionsFormDataProvider.js +86 -0
  125. package/dist/context/providers/CollinearMagnetizationContextProvider.js +113 -0
  126. package/dist/context/providers/HubbardContextProviderLegacy.js +81 -0
  127. package/dist/context/providers/HubbardJContextProvider.js +74 -0
  128. package/dist/context/providers/HubbardUContextProvider.js +77 -0
  129. package/dist/context/providers/HubbardVContextProvider.js +104 -0
  130. package/dist/context/providers/IonDynamicsContextProvider.js +62 -0
  131. package/dist/context/providers/MLSettingsContextProvider.js +52 -0
  132. package/dist/context/providers/MLTrainTestSplitContextProvider.js +48 -0
  133. package/dist/context/providers/NEBFormDataProvider.js +38 -0
  134. package/dist/context/providers/NonCollinearMagnetizationContextProvider.js +253 -0
  135. package/dist/context/providers/PlanewaveCutoffsContextProvider.js +67 -0
  136. package/dist/context/providers/PointsGridFormDataProvider.js +272 -0
  137. package/dist/context/providers/PointsPathFormDataProvider.js +155 -0
  138. package/dist/context/providers/by_application/ExecutableContextProvider.js +17 -0
  139. package/dist/context/providers/by_application/espresso/QENEBContextProvider.js +60 -0
  140. package/dist/context/providers/by_application/espresso/QEPWXContextProvider.js +149 -0
  141. package/dist/context/providers/by_application/nwchem/NWChemTotalEnergyContextProvider.js +84 -0
  142. package/dist/context/providers/by_application/vasp/VASPContextProvider.js +64 -0
  143. package/dist/context/providers/by_application/vasp/VASPNEBContextProvider.js +56 -0
  144. package/dist/context/providers/settings.js +37 -0
  145. package/dist/context/providers.js +199 -0
  146. package/dist/enums.js +65 -0
  147. package/dist/index.js +64 -0
  148. package/dist/patch.js +19 -0
  149. package/dist/subworkflows/convergence/factory.js +35 -0
  150. package/dist/subworkflows/convergence/non_uniform_kgrid.js +31 -0
  151. package/dist/subworkflows/convergence/parameter.js +70 -0
  152. package/dist/subworkflows/convergence/uniform_kgrid.js +26 -0
  153. package/dist/subworkflows/convergence.js +189 -0
  154. package/dist/subworkflows/create.js +285 -0
  155. package/dist/subworkflows/dynamic/espresso/getQpointIrrep.js +34 -0
  156. package/dist/subworkflows/dynamic/index.js +19 -0
  157. package/dist/subworkflows/dynamic/surfaceEnergy.js +67 -0
  158. package/dist/subworkflows/index.js +19 -0
  159. package/dist/subworkflows/subworkflow.js +279 -0
  160. package/dist/units/assertion.js +37 -0
  161. package/dist/units/assignment.js +42 -0
  162. package/dist/units/base.js +91 -0
  163. package/dist/units/builders/AssertionUnitConfigBuilder.js +34 -0
  164. package/dist/units/builders/AssignmentUnitConfigBuilder.js +41 -0
  165. package/dist/units/builders/ExecutionUnitConfigBuilder.js +67 -0
  166. package/dist/units/builders/IOUnitConfigBuilder.js +54 -0
  167. package/dist/units/builders/UnitConfigBuilder.js +79 -0
  168. package/dist/units/builders/index.js +18 -0
  169. package/dist/units/condition.js +52 -0
  170. package/dist/units/execution.js +222 -0
  171. package/dist/units/factory.js +53 -0
  172. package/dist/units/index.js +82 -0
  173. package/dist/units/io.js +148 -0
  174. package/dist/units/map.js +38 -0
  175. package/dist/units/processing.js +41 -0
  176. package/dist/units/reduce.js +24 -0
  177. package/dist/units/subworkflow.js +23 -0
  178. package/dist/utils.js +92 -0
  179. package/dist/workflows/create.js +312 -0
  180. package/dist/workflows/default.js +41 -0
  181. package/dist/workflows/index.js +108 -0
  182. package/dist/workflows/relaxation.js +37 -0
  183. package/dist/workflows/workflow.js +303 -0
  184. package/package.json +94 -0
  185. package/src/context/context.js +47 -0
  186. package/src/context/mixins/ApplicationContextMixin.js +19 -0
  187. package/src/context/mixins/JobContextMixin.js +36 -0
  188. package/src/context/mixins/MaterialContextMixin.js +41 -0
  189. package/src/context/mixins/MaterialsContextMixin.js +18 -0
  190. package/src/context/mixins/MaterialsSetContextMixin.js +24 -0
  191. package/src/context/mixins/MethodDataContextMixin.js +48 -0
  192. package/src/context/mixins/WorkflowContextMixin.js +25 -0
  193. package/src/context/providers/BoundaryConditionsFormDataProvider.js +80 -0
  194. package/src/context/providers/CollinearMagnetizationContextProvider.js +117 -0
  195. package/src/context/providers/HubbardContextProviderLegacy.js +75 -0
  196. package/src/context/providers/HubbardJContextProvider.js +73 -0
  197. package/src/context/providers/HubbardUContextProvider.js +100 -0
  198. package/src/context/providers/HubbardVContextProvider.js +111 -0
  199. package/src/context/providers/IonDynamicsContextProvider.js +56 -0
  200. package/src/context/providers/MLSettingsContextProvider.js +48 -0
  201. package/src/context/providers/MLTrainTestSplitContextProvider.js +45 -0
  202. package/src/context/providers/NEBFormDataProvider.js +32 -0
  203. package/src/context/providers/NonCollinearMagnetizationContextProvider.js +269 -0
  204. package/src/context/providers/PlanewaveCutoffsContextProvider.js +68 -0
  205. package/src/context/providers/PointsGridFormDataProvider.js +285 -0
  206. package/src/context/providers/PointsPathFormDataProvider.js +165 -0
  207. package/src/context/providers/by_application/ExecutableContextProvider.js +10 -0
  208. package/src/context/providers/by_application/espresso/QENEBContextProvider.js +56 -0
  209. package/src/context/providers/by_application/espresso/QEPWXContextProvider.js +166 -0
  210. package/src/context/providers/by_application/nwchem/NWChemTotalEnergyContextProvider.js +86 -0
  211. package/src/context/providers/by_application/vasp/VASPContextProvider.js +56 -0
  212. package/src/context/providers/by_application/vasp/VASPNEBContextProvider.js +46 -0
  213. package/src/context/providers/settings.js +38 -0
  214. package/src/context/providers.js +140 -0
  215. package/src/enums.js +65 -0
  216. package/src/index.js +17 -0
  217. package/src/patch.js +12 -0
  218. package/src/subworkflows/convergence/factory.js +14 -0
  219. package/src/subworkflows/convergence/non_uniform_kgrid.js +28 -0
  220. package/src/subworkflows/convergence/parameter.js +58 -0
  221. package/src/subworkflows/convergence/uniform_kgrid.js +22 -0
  222. package/src/subworkflows/convergence.js +196 -0
  223. package/src/subworkflows/create.js +201 -0
  224. package/src/subworkflows/dynamic/espresso/getQpointIrrep.js +35 -0
  225. package/src/subworkflows/dynamic/index.js +8 -0
  226. package/src/subworkflows/dynamic/surfaceEnergy.js +124 -0
  227. package/src/subworkflows/index.js +2 -0
  228. package/src/subworkflows/subworkflow.js +329 -0
  229. package/src/units/assertion.js +29 -0
  230. package/src/units/assignment.js +34 -0
  231. package/src/units/base.js +97 -0
  232. package/src/units/builders/AssertionUnitConfigBuilder.js +28 -0
  233. package/src/units/builders/AssignmentUnitConfigBuilder.js +36 -0
  234. package/src/units/builders/ExecutionUnitConfigBuilder.js +59 -0
  235. package/src/units/builders/IOUnitConfigBuilder.js +53 -0
  236. package/src/units/builders/UnitConfigBuilder.js +86 -0
  237. package/src/units/builders/index.js +15 -0
  238. package/src/units/condition.js +47 -0
  239. package/src/units/execution.js +263 -0
  240. package/src/units/factory.js +53 -0
  241. package/src/units/index.js +25 -0
  242. package/src/units/io.js +163 -0
  243. package/src/units/map.js +33 -0
  244. package/src/units/processing.js +39 -0
  245. package/src/units/reduce.js +17 -0
  246. package/src/units/subworkflow.js +15 -0
  247. package/src/utils.js +73 -0
  248. package/src/workflows/create.js +222 -0
  249. package/src/workflows/default.js +39 -0
  250. package/src/workflows/index.js +99 -0
  251. package/src/workflows/relaxation.js +41 -0
  252. package/src/workflows/workflow.js +351 -0
@@ -0,0 +1,165 @@
1
+ /* eslint-disable max-classes-per-file */
2
+ /* eslint react/prop-types: 0 */
3
+ import JSONSchemaFormDataProvider from "@exabyte-io/ade.js/dist/js/context/JSONSchemaFormDataProvider";
4
+ import { math as codeJSMath } from "@mat3ra/code/dist/js/math";
5
+ import { Made } from "@mat3ra/made";
6
+ import s from "underscore.string";
7
+
8
+ import { applicationContextMixin } from "../mixins/ApplicationContextMixin";
9
+ import { materialContextMixin } from "../mixins/MaterialContextMixin";
10
+
11
+ const defaultPoint = "Г";
12
+ const defaultSteps = 10;
13
+
14
+ export class PointsPathFormDataProvider extends JSONSchemaFormDataProvider {
15
+ constructor(config) {
16
+ super(config);
17
+ this.initMaterialContextMixin();
18
+ this.initApplicationContextMixin();
19
+ this.reciprocalLattice = new Made.ReciprocalLattice(this.material.lattice);
20
+ this.symmetryPoints = this.symmetryPointsFromMaterial;
21
+ }
22
+
23
+ get isEditedIsSetToFalseOnMaterialUpdate() {
24
+ return this.isMaterialUpdated || this.isMaterialCreatedDefault;
25
+ }
26
+
27
+ get defaultData() {
28
+ return this.reciprocalLattice.defaultKpointPath;
29
+ }
30
+
31
+ get symmetryPointsFromMaterial() {
32
+ return this.reciprocalLattice.symmetryPoints;
33
+ }
34
+
35
+ get jsonSchema() {
36
+ // no need to pass context to get symmetry points on client
37
+ const points = [].concat(this.symmetryPoints).map((x) => x.point);
38
+ return {
39
+ $schema: "http://json-schema.org/draft-07/schema#",
40
+ title: " ",
41
+ description: "path in reciprocal space",
42
+ type: "array",
43
+ items: {
44
+ type: "object",
45
+ properties: {
46
+ point: {
47
+ type: "string",
48
+ default: defaultPoint,
49
+ enum: points,
50
+ },
51
+ steps: {
52
+ type: "integer",
53
+ default: defaultSteps,
54
+ },
55
+ },
56
+ },
57
+ minItems: 1,
58
+ };
59
+ }
60
+
61
+ // eslint-disable-next-line class-methods-use-this
62
+ get uiSchema() {
63
+ return {
64
+ items: {},
65
+ };
66
+ }
67
+
68
+ get uiSchemaStyled() {
69
+ return {
70
+ items: {
71
+ point: this.defaultFieldStyles,
72
+ steps: this.defaultFieldStyles,
73
+ },
74
+ };
75
+ }
76
+
77
+ // eslint-disable-next-line class-methods-use-this
78
+ get templates() {
79
+ return {};
80
+ }
81
+
82
+ getBrillouinZoneImageComponent(title) {
83
+ const hasRequiredFn = typeof this.material.getBrillouinZoneImageComponent === "function";
84
+ if (!hasRequiredFn) {
85
+ console.log(
86
+ "PointsPathFormDataProvider: Material class has no function" +
87
+ " 'getBrillouinZoneImageComponent'! Returning empty Object instead.",
88
+ );
89
+ return null;
90
+ }
91
+ return this.material.getBrillouinZoneImageComponent(title);
92
+ }
93
+
94
+ get useExplicitPath() {
95
+ return this.application.name === "vasp";
96
+ }
97
+
98
+ // override yieldData to avoid storing explicit path in saved context
99
+ yieldDataForRendering() {
100
+ return this.yieldData(this.useExplicitPath);
101
+ }
102
+
103
+ transformData(path = [], useExplicitPath = false) {
104
+ const rawData = path.map((p) => {
105
+ const point = this.symmetryPoints.find((sp) => sp.point === p.point);
106
+ return { ...p, coordinates: point.coordinates };
107
+ });
108
+ const processedData = useExplicitPath ? this._convertToExplicitPath(rawData) : rawData;
109
+ // make coordinates into string and add formatting
110
+ return processedData.map((p) => {
111
+ const coordinates = this.is2PIBA
112
+ ? this.get2PIBACoordinates(p.coordinates)
113
+ : p.coordinates;
114
+ p.coordinates = coordinates.map((c) => s.sprintf("%14.9f", c));
115
+ return p;
116
+ });
117
+ }
118
+
119
+ get2PIBACoordinates(point) {
120
+ return this.reciprocalLattice.getCartesianCoordinates(point);
121
+ }
122
+
123
+ // Initially, path contains symmetry points with steps counts.
124
+ // This function explicitly calculates each point between symmetry points by step counts.
125
+ // eslint-disable-next-line class-methods-use-this
126
+ _convertToExplicitPath(path) {
127
+ const points = [];
128
+ for (let i = 0; i < path.length - 1; i++) {
129
+ const startPoint = path[i];
130
+ const endPoint = path[i + 1];
131
+ const middlePoints = codeJSMath.calculateSegmentsBetweenPoints3D(
132
+ startPoint.coordinates,
133
+ endPoint.coordinates,
134
+ startPoint.steps,
135
+ );
136
+ points.push(startPoint.coordinates);
137
+ points.push(...middlePoints);
138
+ // Include endPoint into path for the last section, otherwise it will be included by next loop iteration
139
+ if (path.length - 2 === i) points.push(endPoint.coordinates);
140
+ }
141
+ return points.map((x) => {
142
+ return {
143
+ coordinates: x,
144
+ steps: 1,
145
+ };
146
+ });
147
+ }
148
+ }
149
+
150
+ export class ExplicitPointsPathFormDataProvider extends PointsPathFormDataProvider {
151
+ // eslint-disable-next-line class-methods-use-this
152
+ get useExplicitPath() {
153
+ return true;
154
+ }
155
+ }
156
+
157
+ export class ExplicitPointsPath2PIBAFormDataProvider extends ExplicitPointsPathFormDataProvider {
158
+ // eslint-disable-next-line class-methods-use-this
159
+ get is2PIBA() {
160
+ return true;
161
+ }
162
+ }
163
+
164
+ materialContextMixin(PointsPathFormDataProvider.prototype);
165
+ applicationContextMixin(PointsPathFormDataProvider.prototype);
@@ -0,0 +1,10 @@
1
+ import ContextProvider from "@exabyte-io/ade.js/dist/js/context/ContextProvider";
2
+
3
+ export default class ExecutableContextProvider extends ContextProvider {
4
+ constructor(config) {
5
+ super({
6
+ ...config,
7
+ domain: "executable",
8
+ });
9
+ }
10
+ }
@@ -0,0 +1,56 @@
1
+ import lodash from "lodash";
2
+
3
+ import { jobContextMixin } from "../../../mixins/JobContextMixin";
4
+ import { materialContextMixin } from "../../../mixins/MaterialContextMixin";
5
+ import { materialsContextMixin } from "../../../mixins/MaterialsContextMixin";
6
+ import { materialsSetContextMixin } from "../../../mixins/MaterialsSetContextMixin";
7
+ import { methodDataContextMixin } from "../../../mixins/MethodDataContextMixin";
8
+ import { workflowContextMixin } from "../../../mixins/WorkflowContextMixin";
9
+ import ExecutableContextProvider from "../ExecutableContextProvider";
10
+ import QEPWXContextProvider from "./QEPWXContextProvider";
11
+
12
+ export default class QENEBContextProvider extends ExecutableContextProvider {
13
+ _material = undefined;
14
+
15
+ _materials = [];
16
+
17
+ _materialsSet = undefined;
18
+
19
+ constructor(config) {
20
+ super(config);
21
+ this.initJobContextMixin();
22
+ this.initMaterialsContextMixin();
23
+ this.initMethodDataContextMixin();
24
+ this.initWorkflowContextMixin();
25
+ this.initMaterialContextMixin();
26
+ this.initMaterialsSetContextMixin();
27
+ }
28
+
29
+ getData() {
30
+ const sortedMaterials = this.sortMaterialsByIndexInSet(this.materials);
31
+ const PWXContexts = sortedMaterials.map((material) => {
32
+ const context = { ...this.config.context, material };
33
+ const config = { ...this.config, context };
34
+ return new QEPWXContextProvider(config).getData();
35
+ });
36
+
37
+ return {
38
+ ...lodash.omit(PWXContexts[0], [
39
+ "ATOMIC_POSITIONS",
40
+ "ATOMIC_POSITIONS_WITHOUT_CONSTRAINTS",
41
+ ]),
42
+ FIRST_IMAGE: PWXContexts[0].ATOMIC_POSITIONS,
43
+ LAST_IMAGE: PWXContexts[PWXContexts.length - 1].ATOMIC_POSITIONS,
44
+ INTERMEDIATE_IMAGES: PWXContexts.slice(1, PWXContexts.length - 1).map(
45
+ (data) => data.ATOMIC_POSITIONS,
46
+ ),
47
+ };
48
+ }
49
+ }
50
+
51
+ materialContextMixin(QENEBContextProvider.prototype);
52
+ materialsContextMixin(QENEBContextProvider.prototype);
53
+ methodDataContextMixin(QENEBContextProvider.prototype);
54
+ workflowContextMixin(QENEBContextProvider.prototype);
55
+ jobContextMixin(QENEBContextProvider.prototype);
56
+ materialsSetContextMixin(QENEBContextProvider.prototype);
@@ -0,0 +1,166 @@
1
+ import { PERIODIC_TABLE } from "@exabyte-io/periodic-table.js";
2
+ import path from "path";
3
+ import s from "underscore.string";
4
+
5
+ import { jobContextMixin } from "../../../mixins/JobContextMixin";
6
+ import { materialContextMixin } from "../../../mixins/MaterialContextMixin";
7
+ import { materialsContextMixin } from "../../../mixins/MaterialsContextMixin";
8
+ import { methodDataContextMixin } from "../../../mixins/MethodDataContextMixin";
9
+ import { workflowContextMixin } from "../../../mixins/WorkflowContextMixin";
10
+ import ExecutableContextProvider from "../ExecutableContextProvider";
11
+
12
+ export default class QEPWXContextProvider extends ExecutableContextProvider {
13
+ _material = undefined;
14
+
15
+ _materials = [];
16
+
17
+ constructor(config) {
18
+ super(config);
19
+ this.initMaterialsContextMixin();
20
+ this.initMethodDataContextMixin();
21
+ this.initWorkflowContextMixin();
22
+ this.initJobContextMixin();
23
+ this.initMaterialContextMixin();
24
+ }
25
+
26
+ static atomSymbols(material) {
27
+ return material.Basis.uniqueElements;
28
+ }
29
+
30
+ static uniqueElementsWithLabels(material) {
31
+ // return unique items
32
+ return [...new Set(material.Basis.elementsWithLabelsArray)];
33
+ }
34
+
35
+ /** Returns the input text block for atomic positions WITH constraints.
36
+ */
37
+ static atomicPositionsWithConstraints(material) {
38
+ return material.Basis.getAtomicPositionsWithConstraintsAsStrings().join("\n");
39
+ }
40
+
41
+ /** Returns the input text block for atomic positions
42
+ * Note: does NOT include constraints
43
+ */
44
+ static atomicPositions(material) {
45
+ return material.Basis.atomicPositions.join("\n");
46
+ }
47
+
48
+ static NAT(material) {
49
+ return material.Basis.atomicPositions.length;
50
+ }
51
+
52
+ static NTYP(material) {
53
+ return material.Basis.uniqueElements.length;
54
+ }
55
+
56
+ static NTYP_WITH_LABELS(material) {
57
+ return this.uniqueElementsWithLabels(material).length;
58
+ }
59
+
60
+ buildQEPWXContext(material) {
61
+ const IBRAV = 0; // use CELL_PARAMETERS to define Bravais lattice
62
+
63
+ return {
64
+ IBRAV,
65
+ RESTART_MODE: this.RESTART_MODE,
66
+ ATOMIC_SPECIES: this.ATOMIC_SPECIES(material),
67
+ ATOMIC_SPECIES_WITH_LABELS: this.ATOMIC_SPECIES_WITH_LABELS(material),
68
+ NAT: QEPWXContextProvider.NAT(material),
69
+ NTYP: QEPWXContextProvider.NTYP(material),
70
+ NTYP_WITH_LABELS: QEPWXContextProvider.NTYP_WITH_LABELS(material),
71
+ ATOMIC_POSITIONS: QEPWXContextProvider.atomicPositionsWithConstraints(material),
72
+ ATOMIC_POSITIONS_WITHOUT_CONSTRAINTS: QEPWXContextProvider.atomicPositions(material),
73
+ CELL_PARAMETERS: QEPWXContextProvider.CELL_PARAMETERS(material),
74
+ };
75
+ }
76
+
77
+ getDataPerMaterial() {
78
+ if (!this.materials || this.materials.length <= 1) return {};
79
+ return { perMaterial: this.materials.map((material) => this.buildQEPWXContext(material)) };
80
+ }
81
+
82
+ /*
83
+ * @NOTE: Overriding getData makes this provider "stateless", ie. delivering data from scratch each time and not
84
+ * considering the content of `this.data`, and `this.isEdited` field(s).
85
+ */
86
+ getData() {
87
+ // the below values are read from PlanewaveDataManager instead
88
+ // ECUTWFC = 40;
89
+ // ECUTRHO = 200;
90
+
91
+ return {
92
+ ...this.buildQEPWXContext(this.material),
93
+ ...this.getDataPerMaterial(),
94
+ };
95
+ }
96
+
97
+ get RESTART_MODE() {
98
+ return this.job.parentJob || this.workflow.hasRelaxation ? "restart" : "from_scratch";
99
+ }
100
+
101
+ getPseudoBySymbol(symbol) {
102
+ return (this.methodData.pseudo || []).find((p) => p.element === symbol);
103
+ }
104
+
105
+ /** Builds ATOMIC SPECIES block of pw.x input in the format
106
+ * X Mass_X PseudoPot_X
107
+ * where X is the atom label
108
+ * Mass_X is the mass of element X [amu]
109
+ * PseudoPot_X is the pseudopotential filename associated with element X
110
+ *
111
+ * Note: assumes this.methodData is defined
112
+ */
113
+ ATOMIC_SPECIES(material) {
114
+ return QEPWXContextProvider.atomSymbols(material)
115
+ .map((symbol) => {
116
+ const pseudo = this.getPseudoBySymbol(symbol);
117
+ return QEPWXContextProvider.symbolToAtomicSpecie(symbol, pseudo);
118
+ })
119
+ .join("\n");
120
+ }
121
+
122
+ ATOMIC_SPECIES_WITH_LABELS(material) {
123
+ return QEPWXContextProvider.uniqueElementsWithLabels(material)
124
+ .map((symbol) => {
125
+ const symbolWithoutLabel = symbol.replace(/\d$/, "");
126
+ const label = symbol.match(/\d$/g) ? symbol.match(/\d$/g)?.[0] : "";
127
+ const pseudo = this.getPseudoBySymbol(symbolWithoutLabel);
128
+ return QEPWXContextProvider.elementAndPseudoToAtomicSpecieWithLabels(
129
+ symbolWithoutLabel,
130
+ pseudo,
131
+ label,
132
+ );
133
+ })
134
+ .join("\n");
135
+ }
136
+
137
+ static CELL_PARAMETERS(material) {
138
+ return material.Lattice.vectorArrays
139
+ .map((x) => {
140
+ return x
141
+ .map((y) => {
142
+ return s.sprintf("%14.9f", y).trim();
143
+ })
144
+ .join(" ");
145
+ })
146
+ .join("\n");
147
+ }
148
+
149
+ static symbolToAtomicSpecie(symbol, pseudo) {
150
+ const el = PERIODIC_TABLE[symbol];
151
+ const filename = pseudo?.filename || path.basename(pseudo?.path || "");
152
+ return s.sprintf("%s %f %s", symbol, el.atomic_mass, filename) || "";
153
+ }
154
+
155
+ static elementAndPseudoToAtomicSpecieWithLabels(symbol, pseudo, label = "") {
156
+ const el = PERIODIC_TABLE[symbol];
157
+ const filename = pseudo?.filename || path.basename(pseudo?.path || "");
158
+ return s.sprintf("%s%s %f %s", symbol, label, el.atomic_mass, filename) || "";
159
+ }
160
+ }
161
+
162
+ materialContextMixin(QEPWXContextProvider.prototype);
163
+ materialsContextMixin(QEPWXContextProvider.prototype);
164
+ methodDataContextMixin(QEPWXContextProvider.prototype);
165
+ workflowContextMixin(QEPWXContextProvider.prototype);
166
+ jobContextMixin(QEPWXContextProvider.prototype);
@@ -0,0 +1,86 @@
1
+ import { PERIODIC_TABLE } from "@exabyte-io/periodic-table.js";
2
+ import lodash from "lodash";
3
+ import _ from "underscore";
4
+ import s from "underscore.string";
5
+
6
+ import { jobContextMixin } from "../../../mixins/JobContextMixin";
7
+ import { materialContextMixin } from "../../../mixins/MaterialContextMixin";
8
+ import { methodDataContextMixin } from "../../../mixins/MethodDataContextMixin";
9
+ import { workflowContextMixin } from "../../../mixins/WorkflowContextMixin";
10
+ import ExecutableContextProvider from "../ExecutableContextProvider";
11
+
12
+ export default class NWChemTotalEnergyContextProvider extends ExecutableContextProvider {
13
+ _material = undefined;
14
+
15
+ constructor(config) {
16
+ super(config);
17
+ this.initMethodDataContextMixin();
18
+ this.initWorkflowContextMixin();
19
+ this.initJobContextMixin();
20
+ this.initMaterialContextMixin();
21
+ }
22
+
23
+ get atomicPositionsWithoutConstraints() {
24
+ return this.material.Basis.atomicPositions;
25
+ }
26
+
27
+ get atomicPositions() {
28
+ const basis = this.material.Basis;
29
+ basis.toCartesian();
30
+ return basis.getAtomicPositionsWithConstraintsAsStrings();
31
+ }
32
+
33
+ get atomSymbols() {
34
+ return this.material.Basis.uniqueElements;
35
+ }
36
+
37
+ get cartesianAtomicPositions() {
38
+ return this.material.Basis.toCartesian !== undefined;
39
+ }
40
+
41
+ get ATOMIC_SPECIES() {
42
+ return _.map(this.atomSymbols, (symbol) => {
43
+ return NWChemTotalEnergyContextProvider.symbolToAtomicSpecies(symbol);
44
+ }).join("\n");
45
+ }
46
+
47
+ /*
48
+ * @NOTE: Overriding getData makes this provider "stateless", ie. delivering data from scratch each time and not
49
+ * considering the content of `this.data`, and `this.isEdited` field(s).
50
+ */
51
+ getData() {
52
+ /*
53
+ TODO: Create ability for user to define CHARGE, MULT, BASIS and FUNCTIONAL parameters.
54
+ */
55
+ const CHARGE = 0;
56
+ const MULT = 1;
57
+ const BASIS = "6-31G";
58
+ const FUNCTIONAL = "B3LYP";
59
+
60
+ return {
61
+ CHARGE,
62
+ MULT,
63
+ BASIS,
64
+ NAT: this.atomicPositions.length,
65
+ NTYP: this.atomSymbols.length,
66
+ ATOMIC_POSITIONS: this.atomicPositions.join("\n"),
67
+ ATOMIC_POSITIONS_WITHOUT_CONSTRAINTS: this.atomicPositionsWithoutConstraints.join("\n"),
68
+ ATOMIC_SPECIES: this.ATOMIC_SPECIES,
69
+ FUNCTIONAL,
70
+ CARTESIAN: this.cartesianAtomicPositions,
71
+ };
72
+ }
73
+
74
+ static symbolToAtomicSpecies(symbol, pseudo) {
75
+ const el = PERIODIC_TABLE[symbol];
76
+ const filename = pseudo
77
+ ? lodash.get(pseudo, "filename", s.strRightBack(pseudo.path || "", "/"))
78
+ : "";
79
+ return el ? s.sprintf("%s %f %s", symbol, el.atomic_mass, filename) : undefined;
80
+ }
81
+ }
82
+
83
+ materialContextMixin(NWChemTotalEnergyContextProvider.prototype);
84
+ methodDataContextMixin(NWChemTotalEnergyContextProvider.prototype);
85
+ workflowContextMixin(NWChemTotalEnergyContextProvider.prototype);
86
+ jobContextMixin(NWChemTotalEnergyContextProvider.prototype);
@@ -0,0 +1,56 @@
1
+ import { jobContextMixin } from "../../../mixins/JobContextMixin";
2
+ import { materialContextMixin } from "../../../mixins/MaterialContextMixin";
3
+ import { materialsContextMixin } from "../../../mixins/MaterialsContextMixin";
4
+ import { methodDataContextMixin } from "../../../mixins/MethodDataContextMixin";
5
+ import { workflowContextMixin } from "../../../mixins/WorkflowContextMixin";
6
+ import ExecutableContextProvider from "../ExecutableContextProvider";
7
+
8
+ export default class VASPContextProvider extends ExecutableContextProvider {
9
+ _material = undefined;
10
+
11
+ _materials = [];
12
+
13
+ constructor(config) {
14
+ super(config);
15
+ this.initJobContextMixin();
16
+ this.initMaterialsContextMixin();
17
+ this.initMethodDataContextMixin();
18
+ this.initWorkflowContextMixin();
19
+ this.initMaterialContextMixin();
20
+ }
21
+
22
+ // eslint-disable-next-line class-methods-use-this
23
+ buildVASPContext(material) {
24
+ return {
25
+ // TODO: figure out whether we need two separate POSCARS, maybe one is enough
26
+ POSCAR: material.getAsPOSCAR(true, true),
27
+ POSCAR_WITH_CONSTRAINTS: material.getAsPOSCAR(true),
28
+ };
29
+ }
30
+
31
+ getDataPerMaterial() {
32
+ if (!this.materials || this.materials.length <= 1) return {};
33
+ return { perMaterial: this.materials.map((material) => this.buildVASPContext(material)) };
34
+ }
35
+
36
+ /*
37
+ * @NOTE: Overriding getData makes this provider "stateless", ie. delivering data from scratch each time and not
38
+ * considering the content of `this.data`, and `this.isEdited` field(s).
39
+ */
40
+ getData() {
41
+ // consider adjusting so that below values are read from PlanewaveDataManager
42
+ // ECUTWFC;
43
+ // ECUTRHO;
44
+
45
+ return {
46
+ ...this.buildVASPContext(this.material),
47
+ ...this.getDataPerMaterial(),
48
+ };
49
+ }
50
+ }
51
+
52
+ materialContextMixin(VASPContextProvider.prototype);
53
+ materialsContextMixin(VASPContextProvider.prototype);
54
+ methodDataContextMixin(VASPContextProvider.prototype);
55
+ workflowContextMixin(VASPContextProvider.prototype);
56
+ jobContextMixin(VASPContextProvider.prototype);
@@ -0,0 +1,46 @@
1
+ import { jobContextMixin } from "../../../mixins/JobContextMixin";
2
+ import { materialContextMixin } from "../../../mixins/MaterialContextMixin";
3
+ import { materialsContextMixin } from "../../../mixins/MaterialsContextMixin";
4
+ import { materialsSetContextMixin } from "../../../mixins/MaterialsSetContextMixin";
5
+ import { methodDataContextMixin } from "../../../mixins/MethodDataContextMixin";
6
+ import { workflowContextMixin } from "../../../mixins/WorkflowContextMixin";
7
+ import ExecutableContextProvider from "../ExecutableContextProvider";
8
+ import VASPContextProvider from "./VASPContextProvider";
9
+
10
+ export default class VASPNEBContextProvider extends ExecutableContextProvider {
11
+ _materials = [];
12
+
13
+ constructor(config) {
14
+ super(config);
15
+ this.initMaterialContextMixin();
16
+ this.initMaterialsContextMixin();
17
+ this.initMaterialsSetContextMixin();
18
+ this.initMethodDataContextMixin();
19
+ this.initWorkflowContextMixin();
20
+ this.initJobContextMixin();
21
+ }
22
+
23
+ getData() {
24
+ const sortedMaterials = this.sortMaterialsByIndexInSet(this.materials);
25
+ const VASPContexts = sortedMaterials.map((material) => {
26
+ const context = { ...this.config.context, material };
27
+ const config = { ...this.config, context };
28
+ return new VASPContextProvider(config).getData();
29
+ });
30
+
31
+ return {
32
+ FIRST_IMAGE: VASPContexts[0].POSCAR_WITH_CONSTRAINTS,
33
+ LAST_IMAGE: VASPContexts[VASPContexts.length - 1].POSCAR_WITH_CONSTRAINTS,
34
+ INTERMEDIATE_IMAGES: VASPContexts.slice(1, VASPContexts.length - 1).map(
35
+ (data) => data.POSCAR_WITH_CONSTRAINTS,
36
+ ),
37
+ };
38
+ }
39
+ }
40
+
41
+ materialContextMixin(VASPNEBContextProvider.prototype);
42
+ materialsContextMixin(VASPNEBContextProvider.prototype);
43
+ materialsSetContextMixin(VASPNEBContextProvider.prototype);
44
+ methodDataContextMixin(VASPNEBContextProvider.prototype);
45
+ workflowContextMixin(VASPNEBContextProvider.prototype);
46
+ jobContextMixin(VASPNEBContextProvider.prototype);
@@ -0,0 +1,38 @@
1
+ import { Application } from "@exabyte-io/ade.js";
2
+ import { Made } from "@mat3ra/made";
3
+
4
+ class GlobalSettings {
5
+ "PointsGridFormDataProvider.defaultKPPRA" = 5;
6
+
7
+ Material = Made.Material;
8
+
9
+ Application = Application;
10
+
11
+ constructor() {
12
+ this.resetDefaults();
13
+ }
14
+
15
+ get defaultKPPRA() {
16
+ return this["PointsGridFormDataProvider.defaultKPPRA"];
17
+ }
18
+
19
+ setApplication(application) {
20
+ this.Application = application;
21
+ }
22
+
23
+ setMaterial(material) {
24
+ this.Material = material;
25
+ }
26
+
27
+ setDefaultKPPRA(kppra) {
28
+ this["PointsGridFormDataProvider.defaultKPPRA"] = kppra;
29
+ }
30
+
31
+ resetDefaults() {
32
+ this.Material = Made.Material;
33
+ this.Application = Application;
34
+ this["PointsGridFormDataProvider.defaultKPPRA"] = 5;
35
+ }
36
+ }
37
+
38
+ export const globalSettings = new GlobalSettings();