@@ -123,215 +123,3 @@ def write_workflow_json(wg, file_name):
123123 json .dump (data , f , indent = 2 )
124124
125125 return data
126-
127-
128- def construct_wg_qe (
129- get_bulk_structure ,
130- calculate_qe ,
131- generate_structures ,
132- plot_energy_volume_curve ,
133- strain_lst ,
134- ):
135-
136- from .shared import get_dict
137- from .shared import get_list
138-
139- # NOTE: `get_dict` is `get_input_dict`, to compile the input values for the calc tasks
140- # NOTE: `add_link` must be from outputs to inputs
141- wg = WorkGraph ("wg-qe" )
142-
143- get_bulk_structure_task = wg .add_task (
144- get_bulk_structure ,
145- name = "get_bulk_structure" ,
146- register_pickle_by_value = True ,
147- )
148-
149- relax_task = wg .add_task (
150- calculate_qe ,
151- # ! I don't like the `mini` name...
152- name = "mini" ,
153- register_pickle_by_value = True ,
154- )
155-
156- generate_structures_task = wg .add_task (
157- generate_structures ,
158- name = "generate_structures" ,
159- register_pickle_by_value = True ,
160- )
161-
162- # here we add the structure outputs based on the number of strains
163- del wg .tasks .generate_structures .outputs ["result" ]
164-
165- scf_qe_tasks = []
166- for i , strain in enumerate (strain_lst ):
167- generate_structures_task .add_output ("workgraph.any" , f"s_{ i } " )
168-
169- scf_qe_task = wg .add_task (
170- calculate_qe ,
171- name = f"qe_{ i } " ,
172- register_pickle_by_value = True ,
173- )
174- scf_qe_tasks .append (scf_qe_task )
175-
176- plot_energy_volume_curve_task = wg .add_task (
177- plot_energy_volume_curve ,
178- name = "plot_energy_volume_curve" ,
179- register_pickle_by_value = True ,
180- )
181-
182- pickle_element_task = wg .add_task (
183- pickle_node ,
184- name = "pickle_element" ,
185- value = "Al" ,
186- )
187-
188- pickle_a_task = wg .add_task (
189- pickle_node , name = "pickle_a" , value = 4.05
190- )
191-
192- pickle_cubic_task = wg .add_task (
193- pickle_node , name = "pickle_cubic" , value = True
194- )
195-
196- pickle_relax_workdir_task = wg .add_task (
197- pickle_node ,
198- name = "pickle_relax_workdir" ,
199- value = "mini" ,
200- )
201-
202- # ? relax or SCF, or general? -> Should be relax
203- relax_get_dict_task = wg .add_task (
204- task .pythonjob (
205- # outputs=["structure", "calculation", "kpts", "pseudopotentials", "smearing"]
206- # outputs=["dict"]
207- )(get_dict ),
208- name = "relax_get_dict" ,
209- register_pickle_by_value = True ,
210- )
211-
212- pickle_pp_task = wg .add_task (
213- pickle_node ,
214- name = "pseudopotentials" ,
215- value = {"Al" : "Al.pbe-n-kjpaw_psl.1.0.0.UPF" },
216- )
217-
218- pickle_kpts_task = wg .add_task (
219- pickle_node , name = "kpts_task" , value = [3 , 3 , 3 ] # FIXME: Back to [3, 3, 3]
220- )
221-
222- pickle_calc_type_relax_task = wg .add_task (
223- pickle_node ,
224- name = "calc_type_relax" ,
225- value = "vc-relax" ,
226- )
227-
228- pickle_smearing_task = wg .add_task (
229- pickle_node , name = "smearing" , value = 0.02
230- )
231-
232- strain_lst_task = wg .add_task (
233- pickle_node ,
234- name = "pickle_strain_lst" ,
235- value = strain_lst ,
236- )
237-
238- strain_dir_tasks , scf_get_dict_tasks = [], []
239- for i , strain in enumerate (strain_lst ):
240- strain_dir = f"strain_{ i } "
241-
242- strain_dir_task = wg .add_task (
243- pickle_node ,
244- name = f"pickle_{ strain_dir } _dir" ,
245- value = strain_dir ,
246- register_pickle_by_value = True ,
247- )
248- strain_dir_tasks .append (strain_dir_task )
249-
250- scf_get_dict_task = wg .add_task (
251- task .pythonjob ()(get_dict ),
252- name = f"get_dict_{ i } " ,
253- register_pickle_by_value = True ,
254- )
255- scf_get_dict_tasks .append (scf_get_dict_task )
256-
257- if i == 0 :
258- pickle_calc_type_scf_task = wg .add_task (
259- pickle_node ,
260- name = "calc_type_scf" ,
261- value = "scf" ,
262- )
263-
264- get_volumes_task = wg .add_task (
265- task .pythonjob ()(get_list ),
266- name = "get_volumes" ,
267- register_pickle_by_value = True ,
268- )
269-
270- get_energies_task = wg .add_task (
271- task .pythonjob ()(get_list ),
272- name = "get_energies" ,
273- register_pickle_by_value = True ,
274- )
275-
276- # Add remaining links
277- wg .add_link (
278- pickle_element_task .outputs .result , get_bulk_structure_task .inputs .element
279- )
280- wg .add_link (pickle_a_task .outputs .result , get_bulk_structure_task .inputs .a )
281- wg .add_link (pickle_cubic_task .outputs .result , get_bulk_structure_task .inputs .cubic )
282-
283- # `.set` rather than `.add_link`, as get_dict takes `**kwargs` as input
284- relax_get_dict_task .set (
285- {
286- "structure" : get_bulk_structure_task .outputs .result ,
287- "calculation" : pickle_calc_type_relax_task .outputs .result ,
288- "kpts" : pickle_kpts_task .outputs .result ,
289- "pseudopotentials" : pickle_pp_task .outputs .result ,
290- "smearing" : pickle_smearing_task .outputs .result ,
291- }
292- )
293-
294- wg .add_link (relax_get_dict_task .outputs .result , relax_task .inputs .input_dict )
295- wg .add_link (
296- pickle_relax_workdir_task .outputs .result ,
297- relax_task .inputs .working_directory ,
298- )
299-
300- wg .add_link (relax_task .outputs .structure , generate_structures_task .inputs .structure )
301- wg .add_link (
302- strain_lst_task .outputs .result , generate_structures_task .inputs .strain_lst
303- )
304-
305- for i , (scf_get_dict_task , scf_qe_task , strain_dir_task ) in enumerate (
306- list (zip (scf_get_dict_tasks , scf_qe_tasks , strain_dir_tasks ))
307- ):
308- scf_get_dict_task .set (
309- {
310- "structure" : generate_structures_task .outputs [f"s_{ i } " ],
311- "calculation" : pickle_calc_type_scf_task .outputs .result ,
312- "kpts" : pickle_kpts_task .outputs .result ,
313- "pseudopotentials" : pickle_pp_task .outputs .result ,
314- "smearing" : pickle_smearing_task .outputs .result ,
315- }
316- )
317- wg .add_link (scf_get_dict_task .outputs .result , scf_qe_task .inputs .input_dict )
318- wg .add_link (
319- strain_dir_task .outputs .result , scf_qe_task .inputs .working_directory
320- )
321-
322- # collect energy and volume
323- # wg.add_link(scf_qe_task.outputs.energy, get_energies_task.inputs.kwargs)
324- get_energies_task .set ({f"{ i } " : scf_qe_task .outputs .energy })
325- # wg.add_link(scf_qe_task.outputs.volume, get_volumes_task.inputs.kwargs)
326- get_volumes_task .set ({f"{ i } " : scf_qe_task .outputs .volume })
327-
328- wg .add_link (
329- get_volumes_task .outputs .result ,
330- plot_energy_volume_curve_task .inputs .volume_lst ,
331- )
332- wg .add_link (
333- get_energies_task .outputs .result ,
334- plot_energy_volume_curve_task .inputs .energy_lst ,
335- )
336-
337- return wg
0 commit comments