Skip to content

Commit ab45660

Browse files
authored
Merge pull request #79 from Exabyte-io/feat/SOF-7298
SOF-7298: non-collinear magnetization context provider
2 parents bdef079 + 4db1ee6 commit ab45660

13 files changed

+296
-20
lines changed

package-lock.json

+9-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@
4646
"underscore.string": "^3.3.4"
4747
},
4848
"devDependencies": {
49-
"@exabyte-io/ade.js": "2024.4.19-0",
50-
"@exabyte-io/application-flavors.js": "2024.4.19-0",
49+
"@exabyte-io/ade.js": "2024.4.27-0",
50+
"@exabyte-io/application-flavors.js": "2024.4.27-0",
5151
"@exabyte-io/eslint-config": "^2022.11.17-0",
5252
"@exabyte-io/ide.js": "2024.3.26-0",
53-
"@exabyte-io/mode.js": "2024.4.19-0",
53+
"@exabyte-io/mode.js": "2024.4.23-0",
5454
"@mat3ra/code": "2024.3.25-3",
5555
"@mat3ra/esse": "2024.4.19-1",
5656
"@mat3ra/made": "2024.3.26-0",

src/context/context.js

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { IonDynamicsContextProvider } from "./providers/IonDynamicsContextProvid
88
import { MLSettingsContextProvider } from "./providers/MLSettingsContextProvider";
99
import { MLTrainTestSplitContextProvider } from "./providers/MLTrainTestSplitContextProvider";
1010
import { NEBFormDataProvider } from "./providers/NEBFormDataProvider";
11+
import { NonCollinearMagnetizationContextProvider } from "./providers/NonCollinearMagnetizationContextProvider";
1112
import { PlanewaveCutoffsContextProvider } from "./providers/PlanewaveCutoffsContextProvider";
1213
import { PointsGridFormDataProvider } from "./providers/PointsGridFormDataProvider";
1314
import {
@@ -32,4 +33,5 @@ export default {
3233
HubbardContextProviderLegacy,
3334
IonDynamicsContextProvider,
3435
CollinearMagnetizationContextProvider,
36+
NonCollinearMagnetizationContextProvider,
3537
};

src/context/providers.js

+5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const {
1616
HubbardContextProviderLegacy,
1717
IonDynamicsContextProvider,
1818
CollinearMagnetizationContextProvider,
19+
NonCollinearMagnetizationContextProvider,
1920
} = context;
2021

2122
const CONTEXT_DOMAINS = {
@@ -107,4 +108,8 @@ export const wodeProviders = {
107108
providerCls: CollinearMagnetizationContextProvider,
108109
config: _makeImportant({ name: "collinearMagnetization" }),
109110
},
111+
NonCollinearMagnetizationDataManager: {
112+
providerCls: NonCollinearMagnetizationContextProvider,
113+
config: _makeImportant({ name: "nonCollinearMagnetization" }),
114+
},
110115
};

src/context/providers/BoundaryConditionsFormDataProvider.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class BoundaryConditionsFormDataProvider extends mix(JSONSchemaFormDataPr
4747

4848
get jsonSchema() {
4949
return {
50-
$schema: "http://json-schema.org/draft-04/schema#",
50+
$schema: "http://json-schema.org/draft-07/schema#",
5151
type: "object",
5252
properties: {
5353
type: {

src/context/providers/CollinearMagnetizationContextProvider.js

-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ export class CollinearMagnetizationContextProvider extends mix(JSONSchemaFormDat
5050
};
5151
};
5252

53-
// eslint-disable-next-line class-methods-use-this
5453
get uiSchemaStyled() {
5554
return {
5655
startingMagnetization: {

src/context/providers/MLSettingsContextProvider.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export class MLSettingsContextProvider extends mix(ContextProvider).with(Applica
2323

2424
get jsonSchema() {
2525
return {
26-
$schema: "http://json-schema.org/draft-04/schema#",
26+
$schema: "http://json-schema.org/draft-07/schema#",
2727
title: " ",
2828
description: "Settings important to machine learning runs.",
2929
type: "object",

src/context/providers/MLTrainTestSplitContextProvider.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export class MLTrainTestSplitContextProvider extends mix(ContextProvider).with(
2424

2525
get jsonSchema() {
2626
return {
27-
$schema: "http://json-schema.org/draft-04/schema#",
27+
$schema: "http://json-schema.org/draft-07/schema#",
2828
title: " ",
2929
description:
3030
"Fraction held as the test set. For example, a value of 0.2 corresponds to an 80/20 train/test split.",

src/context/providers/NEBFormDataProvider.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export class NEBFormDataProvider extends JSONSchemaFormDataProvider {
1717

1818
get jsonSchema() {
1919
return {
20-
$schema: "http://json-schema.org/draft-04/schema#",
20+
$schema: "http://json-schema.org/draft-07/schema#",
2121
title: " ",
2222
description: "Number of intermediate NEB images.",
2323
type: "object",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,270 @@
1+
import { JSONSchemaFormDataProvider, MaterialContextMixin } from "@mat3ra/code/dist/js/context";
2+
import { Made } from "@mat3ra/made";
3+
import lodash from "lodash";
4+
import { mix } from "mixwith";
5+
6+
export class NonCollinearMagnetizationContextProvider extends mix(JSONSchemaFormDataProvider).with(
7+
MaterialContextMixin,
8+
) {
9+
static Material = Made.Material;
10+
11+
constructor(config) {
12+
super(config);
13+
this.isStartingMagnetization = lodash.get(this.data, "isStartingMagnetization", true);
14+
this.isConstrainedMagnetization = lodash.get(
15+
this.data,
16+
"isConstrainedMagnetization",
17+
false,
18+
);
19+
this.isExistingChargeDensity = lodash.get(this.data, "isExistingChargeDensity", false);
20+
this.isArbitrarySpinDirection = lodash.get(this.data, "isArbitrarySpinDirection", false);
21+
this.isFixedMagnetization = lodash.get(this.data, "isFixedMagnetization", false);
22+
this.constrainedMagnetization = lodash.get(this.data, "constrainedMagnetization", {});
23+
}
24+
25+
get uniqueElementsWithLabels() {
26+
const elementsWithLabelsArray = this.material?.Basis?.elementsWithLabelsArray || [];
27+
return [...new Set(elementsWithLabelsArray)];
28+
}
29+
30+
get defaultData() {
31+
const startingMagnetization = this.uniqueElementsWithLabels.map((element, index) => {
32+
return {
33+
index: index + 1,
34+
atomicSpecies: element,
35+
value: 0.0,
36+
};
37+
});
38+
39+
const spinAngles = this.uniqueElementsWithLabels.map((element, index) => {
40+
return {
41+
index: index + 1,
42+
atomicSpecies: element,
43+
angle1: 0.0,
44+
angle2: 0.0,
45+
};
46+
});
47+
48+
return {
49+
isExistingChargeDensity: false,
50+
isStartingMagnetization: true,
51+
isConstrainedMagnetization: false,
52+
isArbitrarySpinAngle: false,
53+
isFixedMagnetization: false,
54+
lforcet: true,
55+
spinAngles,
56+
startingMagnetization,
57+
constrainedMagnetization: {
58+
lambda: 0.0,
59+
constrainType: "atomic direction",
60+
},
61+
fixedMagnetization: {
62+
x: 0.0,
63+
y: 0.0,
64+
z: 0.0,
65+
},
66+
};
67+
}
68+
69+
get uiSchemaStyled() {
70+
return {
71+
isExistingChargeDensity: {},
72+
lforcet: {
73+
"ui:readonly": !this.isExistingChargeDensity,
74+
"ui:widget": "radio",
75+
"ui:options": {
76+
inline: true,
77+
},
78+
},
79+
isArbitrarySpinDirection: {},
80+
spinAngles: {
81+
items: {
82+
atomicSpecies: {
83+
...this.defaultFieldStyles,
84+
"ui:readonly": true,
85+
},
86+
angle1: this.defaultFieldStyles,
87+
angle2: this.defaultFieldStyles,
88+
},
89+
"ui:readonly": !this.isArbitrarySpinDirection,
90+
"ui:options": {
91+
addable: false,
92+
orderable: false,
93+
removable: false,
94+
},
95+
},
96+
isStartingMagnetization: {},
97+
startingMagnetization: {
98+
items: {
99+
atomicSpecies: {
100+
...this.defaultFieldStyles,
101+
"ui:readonly": true,
102+
},
103+
value: {
104+
"ui:classNames": "col-xs-6",
105+
},
106+
},
107+
"ui:readonly": !this.isStartingMagnetization,
108+
"ui:options": {
109+
addable: false,
110+
orderable: false,
111+
removable: false,
112+
},
113+
},
114+
isConstrainedMagnetization: {},
115+
constrainedMagnetization: {
116+
constrainType: this.defaultFieldStyles,
117+
lambda: this.defaultFieldStyles,
118+
"ui:readonly": !this.isConstrainedMagnetization,
119+
},
120+
isFixedMagnetization: {
121+
"ui:readonly": !(
122+
this.isConstrainedMagnetization &&
123+
this.constrainedMagnetization?.constrainType === "total"
124+
),
125+
},
126+
fixedMagnetization: {
127+
x: this.defaultFieldStyles,
128+
y: this.defaultFieldStyles,
129+
z: this.defaultFieldStyles,
130+
"ui:readonly": !(
131+
this.isFixedMagnetization &&
132+
this.isConstrainedMagnetization &&
133+
this.constrainedMagnetization?.constrainType === "total"
134+
),
135+
},
136+
};
137+
}
138+
139+
get jsonSchema() {
140+
return {
141+
$schema: "http://json-schema.org/draft-07/schema#",
142+
title: "",
143+
description:
144+
"Set initial parameters for non-collinear spin magnetic (SOC) calculation.",
145+
type: "object",
146+
properties: {
147+
isStartingMagnetization: {
148+
type: "boolean",
149+
title: "Set starting magnetization",
150+
default: true,
151+
},
152+
startingMagnetization: {
153+
type: "array",
154+
minItems: this.uniqueElementsWithLabels.length,
155+
maxItems: this.uniqueElementsWithLabels.length,
156+
items: {
157+
type: "object",
158+
properties: {
159+
atomicSpecies: {
160+
type: "string",
161+
title: "Atomic species",
162+
},
163+
value: {
164+
type: "number",
165+
title: "Starting magnetization",
166+
default: 0.0,
167+
minimum: -1.0,
168+
maximum: 1.0,
169+
},
170+
},
171+
},
172+
},
173+
isExistingChargeDensity: {
174+
type: "boolean",
175+
title: "Start calculation from existing charge density",
176+
default: false,
177+
},
178+
lforcet: {
179+
title: "Set lforcet to",
180+
type: "boolean",
181+
oneOf: [
182+
{ const: true, title: "True" },
183+
{ const: false, title: "False" },
184+
],
185+
},
186+
isArbitrarySpinDirection: {
187+
type: "boolean",
188+
title: "Set spin directions",
189+
default: false,
190+
},
191+
spinAngles: {
192+
type: "array",
193+
minItems: this.uniqueElementsWithLabels.length,
194+
maxItems: this.uniqueElementsWithLabels.length,
195+
items: {
196+
type: "object",
197+
properties: {
198+
atomicSpecies: {
199+
type: "string",
200+
title: "Atomic species",
201+
},
202+
angle1: {
203+
type: "number",
204+
title: "Angle1 (deg)",
205+
default: 0.0,
206+
},
207+
angle2: {
208+
type: "number",
209+
title: "Angle2 (deg)",
210+
default: 0.0,
211+
},
212+
},
213+
},
214+
},
215+
isConstrainedMagnetization: {
216+
type: "boolean",
217+
title: "Set constrained magnetization",
218+
default: false,
219+
},
220+
constrainedMagnetization: {
221+
type: "object",
222+
properties: {
223+
constrainType: {
224+
type: "string",
225+
title: "Constrain type",
226+
enum: [
227+
"none",
228+
"total",
229+
"atomic",
230+
"total direction",
231+
"atomic direction",
232+
],
233+
default: "atomic direction",
234+
},
235+
lambda: {
236+
type: "number",
237+
title: "lambda",
238+
default: 0.0,
239+
},
240+
},
241+
},
242+
isFixedMagnetization: {
243+
type: "boolean",
244+
title: "Set Fixed magnetization (only applicable to constrained magnetization of 'total' type)",
245+
default: true,
246+
},
247+
fixedMagnetization: {
248+
type: "object",
249+
properties: {
250+
x: {
251+
type: "number",
252+
title: "X-component",
253+
default: 0.0,
254+
},
255+
y: {
256+
type: "number",
257+
title: "Y-component",
258+
default: 0.0,
259+
},
260+
z: {
261+
type: "number",
262+
title: "Z-component",
263+
default: 0.0,
264+
},
265+
},
266+
},
267+
},
268+
};
269+
}
270+
}

0 commit comments

Comments
 (0)