atomes 1.2.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
dlp_control.c
Go to the documentation of this file.
1/* This file is part of the 'atomes' software
2
3'atomes' is free software: you can redistribute it and/or modify it under the terms
4of the GNU Affero General Public License as published by the Free Software Foundation,
5either version 3 of the License, or (at your option) any later version.
6
7'atomes' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9See the GNU General Public License for more details.
10
11You should have received a copy of the GNU Affero General Public License along with 'atomes'.
12If not, see <https://www.gnu.org/licenses/>
13
14Copyright (C) 2022-2025 by CNRS and University of Strasbourg */
15
22/*
23* This file: 'dlp_control.c'
24*
25* Contains:
26*
27
28 - The functions to handle the creation of the DL-POLY CONTROL file
29
30*
31* List of functions:
32
33 G_MODULE_EXPORT void set_order (GtkComboBox * box, gpointer data);
34 G_MODULE_EXPORT void set_thermo_param (GtkEntry * res, gpointer data);
35 G_MODULE_EXPORT void check_nvs (GtkCheckButton * but, gpointer data);
36 G_MODULE_EXPORT void check_nvs (GtkToggleButton * but, gpointer data);
37 G_MODULE_EXPORT void check_semi (GtkCheckButton * but, gpointer data);
38 G_MODULE_EXPORT void check_semi (GtkToggleButton * but, gpointer data);
39 G_MODULE_EXPORT void set_thermostat (GtkComboBox * box, gpointer data);
40 G_MODULE_EXPORT void set_ensemble (GtkComboBox * box, gpointer data);
41 G_MODULE_EXPORT void set_md_param (GtkEntry * res, gpointer data);
42 G_MODULE_EXPORT void show_advance_time_step (GtkButton * but, gpointer data);
43 G_MODULE_EXPORT void set_md_combo (GtkComboBox * box, gpointer data);
44 G_MODULE_EXPORT void check_impact (GtkCheckButton * but, gpointer data);
45 G_MODULE_EXPORT void check_impact (GtkToggleButton * but, gpointer data);
46 G_MODULE_EXPORT void show_impact_dialog (GtkButton * but, gpointer data);
47 G_MODULE_EXPORT void set_equi_combo (GtkComboBox * box, gpointer data);
48 G_MODULE_EXPORT void set_equi_param (GtkEntry * res, gpointer data);
49 G_MODULE_EXPORT void check_equi (GtkCheckButton * but, gpointer data);
50 G_MODULE_EXPORT void check_equi (GtkToggleButton * but, gpointer data);
51 G_MODULE_EXPORT void set_out_param (GtkEntry * res, gpointer data);
52 G_MODULE_EXPORT void check_out (GtkCheckButton * but, gpointer data);
53 G_MODULE_EXPORT void check_out (GtkToggleButton * but, gpointer data);
54 G_MODULE_EXPORT void set_print_level (GtkComboBox * box, gpointer data);
55 G_MODULE_EXPORT void set_ana_param (GtkEntry * res, gpointer data);
56 G_MODULE_EXPORT void check_ana (GtkCheckButton * but, gpointer data);
57 G_MODULE_EXPORT void check_ana (GtkToggleButton * but, gpointer data);
58 G_MODULE_EXPORT void set_io_param (GtkEntry * res, gpointer data);
59 G_MODULE_EXPORT void check_io (GtkCheckButton * but, gpointer data);
60 G_MODULE_EXPORT void check_io (GtkToggleButton * but, gpointer data);
61 G_MODULE_EXPORT void set_io_method (GtkComboBox * box, gpointer data);
62 G_MODULE_EXPORT void set_elec_param (GtkEntry * res, gpointer data);
63 G_MODULE_EXPORT void adjust_precision (GtkSpinButton * res, gpointer data);
64 G_MODULE_EXPORT void set_elec_eval (GtkComboBox * box, gpointer data);
65 G_MODULE_EXPORT void check_elec (GtkCheckButton * but, gpointer data);
66 G_MODULE_EXPORT void check_elec (GtkToggleButton * but, gpointer data);
67 G_MODULE_EXPORT void set_vdw_param (GtkEntry * res, gpointer data);
68 G_MODULE_EXPORT void set_vdw_mix (GtkComboBox * box, gpointer data);
69 G_MODULE_EXPORT void check_vdw (GtkCheckButton * but, gpointer data);
70 G_MODULE_EXPORT void check_vdw (GtkToggleButton * but, gpointer data);
71 G_MODULE_EXPORT void check_met (GtkCheckButton * but, gpointer data);
72 G_MODULE_EXPORT void check_met (GtkToggleButton * but, gpointer data);
73 G_MODULE_EXPORT void set_sys_param (GtkEntry * res, gpointer data);
74 G_MODULE_EXPORT void set_sys_restart (GtkComboBox * box, gpointer data);
75 G_MODULE_EXPORT void check_sys (GtkCheckButton * but, gpointer data);
76 G_MODULE_EXPORT void check_sys (GtkToggleButton * but, gpointer data);
77
78 GtkWidget * create_thermo_options (int ensemble, int thermo);
79 GtkWidget * create_thermo_box (int ensemble);
80 GtkWidget * create_ensemble_box ();
81 GtkWidget * create_md_box ();
82 GtkWidget * create_equi_box ();
83 GtkWidget * create_traj_box ();
84 GtkWidget * create_dump_box ();
85 GtkWidget * create_out_box ();
86 GtkWidget * create_overall_box ();
87 GtkWidget * create_analyze_box ();
88 GtkWidget * create_job_box ();
89 GtkWidget * create_io_box ();
90 GtkWidget * create_misc_box ();
91 GtkWidget * create_elec_param_box ();
92 GtkWidget * create_electro_box ();
93 GtkWidget * create_vdws_box ();
94 GtkWidget * create_metal_box ();
95 GtkWidget * create_sys_box ();
96 GtkWidget * create_restart_box ();
97 GtkWidget * vbox_control (int f);
98
99*/
100
101#include "dlp_field.h"
102#include "callbacks.h"
103#include "interface.h"
104#include "project.h"
105#include "glwindow.h"
106#include "glview.h"
107#include "bind.h"
108
109extern ColRGBA init_color (int id, int numid);
110extern gboolean print_ana ();
111
112gchar * celemts[MAXDATC] = {"System information",
113 "Calculation details",
114 "Non-bonded interactions",
115 "Equilibration",
116 "Thermodynamics",
117 "Molecular dynamics",
118 "Output options",
119 "Computational details"};
120
121gchar * celets[MAXDATC] = {"system information",
122 "calculation details",
123 "non-bonded interactions",
124 "equilibration",
125 "thermodynamics",
126 "molecular dynamics",
127 "output options",
128 "computational details"};
129
130#define DLP_ENS 4
131#define DLP_ENS_TYPE 10
132gchar * md_ensemble[DLP_ENS] = {"NVE", "NVT", "NPT", "NST"};
133gchar * md_thermo[DLP_ENS_TYPE] = {"Evans", "Langevin", "Andersen", "Berendsen", "Nosë-Hoover", "Gentle Stochastic", "DPD", "Martyna-Tuckerman-Klein", "Two temperature model", "Inhomogeneous Langevin"};
134
135// In the following, 0 = no thermo, > 0 = thermo and num of opts + 1
136int md_ens_opt[DLP_ENS][DLP_ENS_TYPE] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
137 {1, 2, 3, 2, 2, 3, 3, 0, 4, 4},
138 {0, 3, 0, 3, 3, 0, 0, 3, 0, 0},
139 {0, 3, 0, 3, 3, 0, 0, 3, 0, 0}};
140
141gchar * opts_nvt[9][3]={{NULL, NULL, NULL},
142 {"Relaxation speed constant (friction):", NULL, NULL},
143 {"Relaxation time:", "Softness [0.0 - 1.0]:", NULL},
144 {"Relaxation constant:", NULL, NULL},
145 {"Relaxation constant:", NULL, NULL},
146 {"Relaxation constant:", "Langevin friction:", NULL},
147 {"Shardlow's splitting order:", "Global drag coefficient:", NULL},
148 {"Relaxation constant:", "Enhancement of relaxation constant:", "Cut-off particle velocity for friction enhancement:"},
149 {"Relaxation constant:", "Enhancement of relaxation constant:", "Cut-off particle velocity for friction enhancement:"}};
150
151gchar * unit_nvt[9][3]={{NULL, NULL, NULL},
152 {"<b>ps<sup>-1</sup></b>", NULL, NULL},
153 {"<b>ps</b>", NULL, NULL},
154 {"<b>ps</b>", NULL, NULL},
155 {"<b>ps</b>", NULL, NULL},
156 {"<b>ps</b>", "<b>ps<sup>-1</sup></b>", NULL},
157 {NULL, "<b>Dalton ps<sup>-1</sup></b>", NULL},
158 {"<b>ps<sup>-1</sup></b>", "<b>ps<sup>-1</sup></b>", "<b>&#xC5; ps<sup>-1</sup></b>"},
159 {"<b>ps<sup>-1</sup></b>", "<b>ps<sup>-1</sup></b>", "<b>&#xC5; ps<sup>-1</sup></b>"}};
160
161gchar * opts_npt_nvs[2][3] = {{"Thermostat relaxation speed constant (friction):", "Barostat relaxation speed constant (friction):", NULL},
162 {"Thermostat relaxation time:", "Barostat relaxation time:", "Target surface tension:"}};
163
164gchar * unit_npt_nvs[2][3] = {{"<b>ps<sup>-1</sup></b>", "<b>ps<sup>-1</sup></b>", NULL}, {"<b>ps</b>", "<b>ps</b>", "<b>dyn cm<sup>-1</sup></b>"}};
165
166gchar * extra_nvs[4] = {"Standard", "Area", "Tension", "Orthorhombic"};
167
168GtkWidget * check_nvs_butt[4];
169GtkWidget * nvs_label;
170GtkWidget * nvs_entry;
171GtkWidget * nvs_unit;
172GtkWidget * nvs_check[2];
173GtkWidget * o_ent_vbox;
174GtkWidget * o_vbox;
175GtkWidget * e_vbox;
176GtkWidget * ens_box;
177GtkWidget * bath_box;
179
188G_MODULE_EXPORT void set_order (GtkComboBox * box, gpointer data)
189{
190 tmp_field -> thermo_opts[0] = combo_get_active ((GtkWidget *)box);
191}
192
201G_MODULE_EXPORT void set_thermo_param (GtkEntry * res, gpointer data)
202{
203 int i;
204 i = GPOINTER_TO_INT(data);
205 const gchar * m = entry_get_text (res);
206 double v = string_to_double ((gpointer)m);
207 if (i == 9)
208 {
209 if ((v == 0.0 || v >= 1.0) && v != tmp_field -> thermo_opts[i])
210 {
211 tmp_field -> thermo_opts[i] = v;
212 }
213 else if (v < 1.0 && v != 0.0)
214 {
215 show_warning ("Target temperature for the pseudo bath must be &#8805; 1.0 K,\n"
216 "Alternatively set value to 0.0 K to system temperature.", field_assistant);
217 }
218 }
219 else if (v >= 0.0 && v != tmp_field -> thermo_opts[i])
220 {
221 tmp_field -> thermo_opts[i] = v;
222 }
223 update_entry_double(res, tmp_field -> thermo_opts[i]);
224}
225
226#ifdef GTK4
235G_MODULE_EXPORT void check_nvs (GtkCheckButton * but, gpointer data)
236#else
245G_MODULE_EXPORT void check_nvs (GtkToggleButton * but, gpointer data)
246#endif
247{
248 int i, j;
249 i = GPOINTER_TO_INT(data);
250 tmp_field -> thermo_opts[3] = (double) i;
251 for (j=0; j<2; j++)
252 {
254 }
255 for (j=0; j<4; j++)
256 {
257 if (j != i)
258 {
259 if (j == 2)
260 {
261 update_entry_text (GTK_ENTRY(nvs_entry), "");
265 }
266 }
267 else if (j == i && i == 2)
268 {
272 update_entry_double (GTK_ENTRY(nvs_entry), 0.0);
273 tmp_field -> thermo_opts[4] = 0.0;
275 }
276 else if (j == i && i == 3)
277 {
279 }
280 }
281}
282
283#ifdef GTK4
292G_MODULE_EXPORT void check_semi (GtkCheckButton * but, gpointer data)
293#else
302G_MODULE_EXPORT void check_semi (GtkToggleButton * but, gpointer data)
303#endif
304{
305 int i = GPOINTER_TO_INT(data);
306 gboolean j = button_get_status ((GtkWidget *)but);
307 tmp_field -> thermo_opts[i] = j;
308 if (i == 6) widget_set_sensitive (bath_box, j);
309}
310
319GtkWidget * create_thermo_options (int ensemble, int thermo)
320{
321 GtkWidget * vbox = create_vbox (5);
322 GtkWidget * hbox;
323 GtkWidget * entry;
324 gboolean val;
325 int i, j;
326 switch (ensemble)
327 {
328 case 1:
329 for (i=0; i<3; i++)
330 {
331 if (opts_nvt[thermo][i] != NULL)
332 {
333 hbox = create_hbox (5);
334 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(opts_nvt[thermo][i], 350, -1, 1.0, 0.5), FALSE, FALSE, 50);
335 if (thermo == 6 && i == 0)
336 {
337 GtkWidget * o_combo = create_combo();
338 combo_text_append (o_combo, "s1");
339 combo_text_append (o_combo, "s2");
340 combo_set_active (o_combo, (int)tmp_field -> thermo_opts[i]);
341 g_signal_connect (G_OBJECT (o_combo), "changed", G_CALLBACK(set_order), NULL);
342 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, o_combo, FALSE, FALSE, 5);
343 }
344 else
345 {
346 entry = create_entry(G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(i));
347 update_entry_double (GTK_ENTRY(entry), tmp_field -> thermo_opts[i]);
348 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
349 }
350 if (unit_nvt[thermo][i] != NULL) add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(unit_nvt[thermo][i], 20, -1, 0.0, 0.5), FALSE, FALSE, 10);
351 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
352 }
353 }
354 break;
355 default:
356 for (i=0; i<2; i++)
357 {
358 hbox = create_hbox (5);
359 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(opts_npt_nvs[(thermo) ? 1 : 0][i], 310, -1, 1.0, 0.5), FALSE, FALSE, 50);
360 entry = create_entry(G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(i));
361 update_entry_double (GTK_ENTRY(entry), tmp_field -> thermo_opts[i]);
362 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
363 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(unit_npt_nvs[(thermo) ? 1 : 0][i], 20, -1, 0.0, 0.5), FALSE, FALSE, 0);
364 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
365 }
366 if (ensemble == 3)
367 {
368 GtkWidget * hhbox = create_hbox (0);
369 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hhbox, FALSE, FALSE, 0);
370 GtkWidget * vvbox = create_vbox (5);
371 add_box_child_start (GTK_ORIENTATION_VERTICAL, hhbox, vvbox, FALSE, FALSE, 50);
372 gtk_box_set_homogeneous (GTK_BOX (vvbox), TRUE);
373 for (i=0; i<4; i++)
374 {
375 hbox = create_hbox (5);
376 val = ((int)tmp_field -> thermo_opts[3] == i) ? TRUE : FALSE;
377#ifdef GTK4
378 check_nvs_butt[i] = check_button (extra_nvs[i], 100, -1, val, G_CALLBACK(check_nvs), GINT_TO_POINTER(i));
379 if (i)
380 {
381 gtk_check_button_set_group ((GtkCheckButton *)extra_nvs[i], (GtkCheckButton *)extra_nvs[0]);
382 }
383#else
384 if (! i)
385 {
386 check_nvs_butt[i] = radio_button (extra_nvs[i], 100, -1, val, G_CALLBACK(check_nvs), GINT_TO_POINTER(i));
387 }
388 else
389 {
390 check_nvs_butt[i] = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(check_nvs_butt[0]), extra_nvs[i]);
391 }
392#endif
393 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_nvs_butt[i], FALSE, FALSE, 20);
394 if (i == 2)
395 {
396 nvs_label = markup_label(opts_npt_nvs[1][2], 150, -1, 0.0, 0.5);
398 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_label, FALSE, FALSE, 0);
399 j = 4;
400 nvs_entry = create_entry(G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(j));
402 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_entry, FALSE, FALSE, 10);
403 if (val) update_entry_double (GTK_ENTRY(nvs_entry), tmp_field -> thermo_opts[4]);
404 nvs_unit = markup_label(unit_npt_nvs[1][2], 50, -1, 0.0, 0.5);
406 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_unit, FALSE, FALSE, 0);
407 }
408 if (i > 1)
409 {
410 val = (((int)tmp_field -> thermo_opts[3] == i) && tmp_field -> thermo_opts[5] == 1.0) ? TRUE : FALSE;
411 nvs_check[i-2] = check_button("Semi-anisotropic constraint", 200, -1, val, G_CALLBACK(check_semi), GINT_TO_POINTER(5));
413 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_check[i-2], FALSE, FALSE, 10);
414 }
415 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, hbox, FALSE, FALSE, 0);
416 }
417 }
418 break;
419 }
420 return vbox;
421}
422
431G_MODULE_EXPORT void set_thermostat (GtkComboBox * box, gpointer data)
432{
433 int i, j;
434 i = GPOINTER_TO_INT(data);
435 switch (i)
436 {
437 case 0:
438 tmp_field -> thermostat = combo_get_active ((GtkWidget *)box);
439 for (j=0; j<6; j++) tmp_field -> thermo_opts[j] = 0.0;
440 if (tmp_field -> ensemble)
441 {
444 add_box_child_start (GTK_ORIENTATION_VERTICAL, o_vbox, o_ent_vbox, FALSE, FALSE, 0);
446 }
447 break;
448 case 1:
449 tmp_field -> thermo_opts[7] = combo_get_active ((GtkWidget *)box);
450 break;
451 }
452}
453
461GtkWidget * create_thermo_box (int ensemble)
462{
463 GtkWidget * vbox = create_vbox (5);
464 GtkWidget * hbox = create_hbox (5);
465 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
466 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Thermostat:", 100, -1, 0.0, 0.5), FALSE, FALSE, 30);
467 GtkWidget * thermo_box = create_combo();
468 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, thermo_box, FALSE, FALSE, 0);
469 int i;
470 for (i=0; i<DLP_ENS_TYPE; i++)
471 {
472 if (md_ens_opt[ensemble][i]) combo_text_append (thermo_box, md_thermo[i]);
473 }
475 g_signal_connect (G_OBJECT (thermo_box), "changed", G_CALLBACK(set_thermostat), GINT_TO_POINTER(0));
476 if (ensemble)
477 {
479 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, o_vbox, FALSE, FALSE, 0);
481 add_box_child_start (GTK_ORIENTATION_VERTICAL, o_vbox, o_ent_vbox, FALSE, FALSE, 0);
482 }
483 return vbox;
484}
485
494G_MODULE_EXPORT void set_ensemble (GtkComboBox * box, gpointer data)
495{
496 int i;
497 if (tmp_field -> ensemble)
498 {
499 for (i=0; i<4; i++)
500 {
502 }
504 }
505 tmp_field -> ensemble = combo_get_active ((GtkWidget *)box);
506 tmp_field -> thermostat = 0;
507
508 for (i=0; i<6; i++) tmp_field -> thermo_opts[i] = 0.0;
509 if (tmp_field -> ensemble)
510 {
513 add_box_child_start (GTK_ORIENTATION_VERTICAL, ens_box, thermo_option_box, FALSE, FALSE, 0);
514 }
515}
516
523{
524 GtkWidget * vbox = create_vbox (5);
525 GtkWidget * hbox = create_hbox (5);
526 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
527 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Ensemble:", 100, -1, 0.0, 0.5), FALSE, FALSE, 30);
528 GtkWidget * ensemble = create_combo ();
529 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ensemble, FALSE, FALSE, 0);
530 int i;
531 for (i=0; i<DLP_ENS; i++)
532 {
533 combo_text_append (ensemble, md_ensemble[i]);
534 }
535 combo_set_active (ensemble, tmp_field -> ensemble);
536 g_signal_connect (G_OBJECT (ensemble), "changed", G_CALLBACK(set_ensemble), NULL);
537
539 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, ens_box, FALSE, FALSE, 0);
540 if (tmp_field -> ensemble)
541 {
543 add_box_child_start (GTK_ORIENTATION_VERTICAL, ens_box, thermo_option_box, FALSE, FALSE, 0);
544 }
545 gtk_widget_set_size_request (vbox, -1, 390);
546
547 gboolean val = (tmp_field -> thermo_opts[6] == 1.0) ? TRUE : FALSE;
548 bath_box = create_hbox (5);
549 add_box_child_end (vbox, bath_box, FALSE, FALSE, 0);
550 add_box_child_end (vbox, check_button("Use pseudo thermal bath", 100, -1, val, G_CALLBACK(check_semi), GINT_TO_POINTER(6)), FALSE, FALSE, 5);
552 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label("Thermostat type:", 150, -1, 0.0, 0.5), FALSE, FALSE, 0);
553 GtkWidget * combo = create_combo();
554 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, combo, FALSE, FALSE, 00);
555 combo_text_append (combo, "Langevin + Direct");
556 combo_text_append (combo, "Langevin");
557 combo_text_append (combo, "Gauss");
558 combo_text_append (combo, "Direct");
559 combo_set_active (combo, (int)tmp_field -> thermo_opts[7]);
560 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_thermostat), GINT_TO_POINTER(1));
561 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label("Thickness:", 100, -1, 1.0, 0.5), FALSE, FALSE, 0);
562 GtkWidget * entry = create_entry(G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(8));
563 update_entry_double (GTK_ENTRY(entry), tmp_field -> thermo_opts[8]);
564 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, entry, FALSE, FALSE, 5);
565 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label("<b>&#xC5;</b>", 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
566 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label("Target T°:", 100, -1, 1.0, 0.5), FALSE, FALSE, 0);
567 entry = create_entry (G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(9));
568 update_entry_double (GTK_ENTRY(entry), tmp_field -> thermo_opts[9]);
569 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, entry, FALSE, FALSE, 5);
570 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label("<b>K</b>", 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
571 return vbox;
572}
573
574GtkWidget * step_button;
575GtkWidget * extra_vbox[2];
576GtkWidget * extra_lab[4];
577gchar * md_data[6] = {"Target temperature:", "Verlet integrator:", "Number of steps:", "Time step δt:", "Target pressure:", ""};
578gchar * md_extra[2][4] = {{"Shake iterations limit:", "Shake tolerance:", "", ""},
579 {"Rattle iterations limit:", "Rattle tolerance:", "FIQA iterations limit:", "FIQA quaternions tolerance:"}};
580gchar * md_unit[6] = {"<b>K</b>", "", "", "<b>ps</b>", "<b>katms</b>", ""};
581gchar * extra_unit[4] = {"<b>cycle(s)</b>", "", "<b>cycle(s)</b>", ""};
582gchar * dt_data[3] = {"Maximum time step:", "Maximum distance allowed:", "Minimum distance allowed:"};
583gchar * dt_unit[3] = {"<b>ps</b>", "<b>&#xC5;</b>", "<b>&#xC5;</b>"};
584gchar * md_combo[2][2] = {{"Velocity", "Leapfrog"}, {"Fixed", "Variable"}};
585
594G_MODULE_EXPORT void set_md_param (GtkEntry * res, gpointer data)
595{
596 int i;
597 i = GPOINTER_TO_INT(data);
598 const gchar * m = entry_get_text (res);
599 double v = string_to_double ((gpointer)m);
600 if (i == 14)
601 {
602 if (v >= 1.0 && v <= tmp_proj -> natomes)
603 {
604 tmp_field -> md_opts[i] = v;
605 }
606 }
607 else if (v >= 0.0 && v != tmp_field -> md_opts[i])
608 {
609 tmp_field -> md_opts[i] = v;
610 }
611 if (i == 2 || i == 9 || i == 11 || i == 14 || i == 15)
612 {
613 update_entry_int (res, (int)tmp_field -> md_opts[i]);
614 }
615 else
616 {
617 update_entry_double (res, tmp_field -> md_opts[i]);
618 }
619}
620
629G_MODULE_EXPORT void show_advance_time_step (GtkButton * but, gpointer data)
630{
631 GtkWidget * dialog = dialogmodal ("Variable time step information", GTK_WINDOW(field_assistant));
632 GtkWidget * vbox = dialog_get_content_area (dialog);
633 GtkWidget * hbox;
634 GtkWidget * entry;
635 int i, j;
636 i = 6;
637 for (j=0; j<3; j++)
638 {
639 hbox = create_hbox (0);
640 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 2);
641 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(dt_data[j], 250, -1, 1.0, 0.5), FALSE, FALSE, 5);
642 entry = create_entry (G_CALLBACK(set_md_param), 100, 10, FALSE, GINT_TO_POINTER(i+j));
643 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[i+j]);
644 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
645 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(dt_unit[j], 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
646 }
647 run_this_gtk_dialog (dialog, G_CALLBACK(run_destroy_dialog), NULL);
648}
649
658G_MODULE_EXPORT void set_md_combo (GtkComboBox * box, gpointer data)
659{
660 int i, j;
661 i = GPOINTER_TO_INT(data);
662 tmp_field -> md_opts[i] = combo_get_active ((GtkWidget *)box);
663 if (i == 3) widget_set_sensitive (step_button, (int)tmp_field -> md_opts[i]);
664 if (i == 3 && tmp_field -> md_opts[i] == 1.0) show_advance_time_step (NULL, NULL);
665 if (i == 1)
666 {
667 gtk_widget_set_visible (extra_vbox[1], (int)tmp_field -> md_opts[1]);
668 for (j=0 ;j<2; j++)
669 {
670 gtk_label_set_text (GTK_LABEL(extra_lab[2*j]), md_extra[(int)tmp_field -> md_opts[i]][2*j]);
671 gtk_label_set_text (GTK_LABEL(extra_lab[2*j+1]), md_extra[(int)tmp_field -> md_opts[i]][2*j+1]);
672 }
673 }
674}
675
676GtkWidget * impact_but;
677gchar * imp_dir[3] = {"on x:", "on y:", "on z:"};
678
679#ifdef GTK4
688G_MODULE_EXPORT void check_impact (GtkCheckButton * but, gpointer data)
689#else
698G_MODULE_EXPORT void check_impact (GtkToggleButton * but, gpointer data)
699#endif
700{
701 gboolean i = button_get_status ((GtkWidget *)but);
702 tmp_field -> md_opts[13] = (i) ? 1.0 : 0.0;
704}
705
714G_MODULE_EXPORT void show_impact_dialog (GtkButton * but, gpointer data)
715{
716 GtkWidget * dialog = dialogmodal ("Initiate impact on particle", GTK_WINDOW(field_assistant));
717 GtkWidget * vbox = dialog_get_content_area (dialog);
718 GtkWidget * hbox, * hhbox;
719 GtkWidget * entry;
720 int i, j;
721 gchar * str;
722 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
723 gchar * imp_info[4] = {"Index of the particle to impact: ", "Time step of impact:", "Energy of impact:", "Direction (from center of mass):"};
724 gchar * imp_unit[2] = {"<b>n<sup>th</sup> step</b>", "<b>k eV</b>"};
725 gchar * imp_dir[3] = {"on x:", "on y:", "on z:"};
726 for (i=0; i<4; i++)
727 {
728 hbox = create_hbox (5);
729 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 2);
730 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(imp_info[i], 200, -1, 1.0, 0.5), FALSE, FALSE, 5);
731 if (i < 3)
732 {
733 j = (i < 2) ? 5 : 10;
734 entry = create_entry (G_CALLBACK(set_md_param), j*10, j + j/6, FALSE, GINT_TO_POINTER(i+14));
735 if (i < 2)
736 {
737 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> md_opts[i+14]);
738 }
739 else
740 {
741 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[i+14]);
742 }
743 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
744 if (! i)
745 {
746 str = g_strdup_printf ("<b>in [1-%d]</b>", tmp_proj -> natomes);
747 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(str, 30, -1, 0.0, 0.5), FALSE, FALSE, 0);
748 g_free (str);
749 }
750 else
751 {
752 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(imp_unit[i-1], 30, -1, 0.0, 0.5), FALSE, FALSE, 0);
753 }
754 }
755 else
756 {
757 hbox = create_hbox (5);
758 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 2);
759 hhbox = create_hbox (5);
760 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 50);
761 for (j=0; j<3; j++)
762 {
763 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(imp_dir[j], 50, -1, 1.0, 0.5), FALSE, FALSE, 0);
764 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(j+17));
765 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[j+17]);
766 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, entry, FALSE, FALSE, 5);
767
768 }
769 }
770 }
771 run_this_gtk_dialog (dialog, G_CALLBACK(run_destroy_dialog), NULL);
772}
773
779GtkWidget * create_md_box ()
780{
781 GtkWidget * vbox = create_vbox (BSEP);
782 gtk_widget_set_size_request (vbox, -1, 450);
783 GtkWidget * hbox;
784 GtkWidget * combo;
785 GtkWidget * entry;
786 int i, j, k, l;
787 l = 0;
788 for (i=0; i<3; i++)
789 {
790 hbox = create_hbox (5);
791 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
792 for (j=0; j<2; j++, l++)
793 {
794 k = (j) ? 110 : 150;
795 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(md_data[2*i+j], k, -1, 1.0, 0.5), FALSE, FALSE, 5);
796 if (j)
797 {
798 if (i < 2)
799 {
800 combo = create_combo ();
801 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 0);
802 for (k=0; k<2; k++)
803 {
804 combo_text_append (combo, md_combo[i][k]);
805 }
806 combo_set_active (combo, 0);
807 gtk_widget_set_size_request (combo, 100, -1);
808 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_md_combo), GINT_TO_POINTER(l));
809 if (i)
810 {
811 l ++;
812 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(l));
813 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[l]);
814 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
815 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(md_unit[l-1], 30, -1, 0.0, 0.5), FALSE, FALSE, 0);
816 }
817 }
818 else
819 {
820 step_button = create_button ("Time step details", IMG_NONE, NULL, 100, -1, GTK_RELIEF_NORMAL, G_CALLBACK(show_advance_time_step), NULL);
821 widget_set_sensitive (step_button, (int)tmp_field -> md_opts[3]);
822 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, step_button, FALSE, FALSE, 10);
823 }
824 }
825 else
826 {
827 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(l));
828 if (i == 1 && j == 0)
829 {
830 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> md_opts[l]);
831 }
832 else
833 {
834 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[l]);
835 }
836 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
837 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(md_unit[2*i+j], 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
838 }
839 }
840 }
841
842 k = (int)tmp_field -> md_opts[1];
843 l = 9;
844 gchar * extra_info[2] = {"<b>Bond constraint(s) dynamics:</b>", "<b>Rotational motion of rigid body(ies):</b>"};
845 for (i=0; i<2; i++)
846 {
847 extra_vbox[i] = create_vbox (5);
848 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, extra_vbox[i], FALSE, FALSE, 20);
849 add_box_child_start (GTK_ORIENTATION_VERTICAL, extra_vbox[i], markup_label(extra_info[i], 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
850 hbox = create_hbox (5);
851 add_box_child_start (GTK_ORIENTATION_VERTICAL, extra_vbox[i], hbox, FALSE, FALSE, 0);
852 for (j=0; j<2; j++, l++)
853 {
854 extra_lab[2*i+j] = markup_label(md_extra[k][2*i+j], 150+j*100, -1, 1.0, 0.5);
855 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, extra_lab[2*i+j], FALSE, FALSE, 5);
856 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(l));
857 if (j)
858 {
859 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[l]);
860 }
861 else
862 {
863 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> md_opts[l]);
864 }
865 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
866 if (! j) add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(extra_unit[2*i+j], 30, -1, 0.0, 0.5), FALSE, FALSE, 0);
867 }
868 }
869 gtk_widget_set_visible (extra_vbox[1], (int)tmp_field -> md_opts[1]);
870 for (i=0 ;i<2; i++)
871 {
872 gtk_label_set_text (GTK_LABEL(extra_lab[2*i]), md_extra[(int)tmp_field -> md_opts[1]][2*i]);
873 gtk_label_set_text (GTK_LABEL(extra_lab[2*i+1]), md_extra[(int)tmp_field -> md_opts[1]][2*i+1]);
874 }
875
876 hbox = create_hbox (5);
877 add_box_child_end (vbox, hbox, FALSE, FALSE, 0);
878 gboolean val = (tmp_field -> md_opts[13] == 1.0) ? TRUE : FALSE;
879 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button("<b>Initiate impact on particle</b>", 100, -1, val, G_CALLBACK(check_impact), NULL), FALSE, FALSE, 10);
880 impact_but = create_button ("Impact details", IMG_NONE, NULL, 100, -1, GTK_RELIEF_NORMAL, G_CALLBACK(show_impact_dialog), NULL);
882 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, impact_but, FALSE, FALSE, 10);
883 return vbox;
884}
885
886GtkWidget * equi_lab[6];
887GtkWidget * equi_entry[3];
888GtkWidget * equi_box[9];
889
890gchar * equi_info[8]= {"Equilibrate for the first:", "Scale temperature:", "Cap forces:",
891 "Resample the momenta distribution:", "Minimize system configuration:",
892 "Optimize system configuration from start:", "Perform zero temperature (10 K) optimization", "Include equilibration data in statistics"};
893gchar * equi_data[5]= {"Every:", "f<sub>max</sub>=", "During:", "Minimize:", "Optimize"};
894gchar * equi_unit[3]= {"<b>step(s)</b>", "<b>k<sub><i>B</i></sub>T / &#xC5;</b>", "<b>step(s)</b>"};
895gchar * equi_min[3]= {"Force", "Energy", "Distance"};
896gchar * equi_minu[3]= {"<b>k<sub><i>B</i></sub>T / &#xC5;</b>", "", "<b>&#xC5;</b>"};
897
898double equi_lim[2][3] = {{1.0, 0.0, 0.000001}, {1000.0, 0.01, 0.1}};
899float init_minop[3]={50.0, 0.005, 0.005};
900
909G_MODULE_EXPORT void set_equi_combo (GtkComboBox * box, gpointer data)
910{
911 int i, j, k;
912 i = GPOINTER_TO_INT(data);
913 tmp_field -> equi_opts[i] = combo_get_active ((GtkWidget *)box);
914 j = (i == 9) ? 11 : 14;
915 k = (i == 9) ? 0 : 1;
916 tmp_field -> equi_opts[j] = init_minop[(int)tmp_field -> equi_opts[i]];
917 update_entry_double (GTK_ENTRY(equi_entry[2*k]), tmp_field -> equi_opts[j]);
918 gtk_label_set_text (GTK_LABEL(equi_lab[4*k]), g_strdup_printf ("%s:", equi_min[(int)tmp_field -> equi_opts[i]]));
919 gtk_label_set_text (GTK_LABEL(equi_lab[4*k+1]), g_strdup_printf ("<b>%s</b>", equi_minu[(int)tmp_field -> equi_opts[i]]));
920 gtk_label_set_use_markup (GTK_LABEL(equi_lab[4*k+1]), TRUE);
921}
922
931G_MODULE_EXPORT void set_equi_param (GtkEntry * res, gpointer data)
932{
933 int i, j;
934 i = GPOINTER_TO_INT(data);
935 const gchar * m = entry_get_text (res);
936 double v = string_to_double ((gpointer)m);
937 if (i == 10 || i == 14)
938 {
939 j = (i == 10) ? 9 : 13;
940 if (v >= equi_lim[0][(int)tmp_field -> equi_opts[j]] && v <= equi_lim[1][(int)tmp_field -> equi_opts[j]])
941 {
942 tmp_field -> equi_opts[i] = v;
943 }
944 else
945 {
946 gchar * str = g_strdup_printf ("Minimization parameter must be in [ %f - %f ]",
947 equi_lim[0][(int)tmp_field -> equi_opts[j]], equi_lim[1][(int)tmp_field -> equi_opts[j]]);
949 g_free (str);
950 }
951 }
952 else if (v >= 0.0 && v != tmp_field -> equi_opts[i])
953 {
954 tmp_field -> equi_opts[i] = v;
955 }
956 if (i == 1 || i == 3 || i == 7 || i == 11)
957 {
958 update_entry_int (res, (int)tmp_field -> equi_opts[i]);
959 }
960 else
961 {
962 update_entry_double (res, tmp_field -> equi_opts[i]);
963 }
964}
965
966#ifdef GTK4
975G_MODULE_EXPORT void check_equi (GtkCheckButton * but, gpointer data)
976#else
985G_MODULE_EXPORT void check_equi (GtkToggleButton * but, gpointer data)
986#endif
987{
988 int i, k;
989 i = GPOINTER_TO_INT(data);
990 gboolean j = button_get_status ((GtkWidget *)but);
991 k = 2*i + 2*(i/5) + i/6 - i/7;
992 tmp_field -> equi_opts[k] = (j) ? 1.0 : 0.0;
993 if (i < 6) widget_set_sensitive (equi_box[i], j);
994}
995
1001GtkWidget * create_equi_box ()
1002{
1003 GtkWidget * vbox = create_vbox (5);
1004 GtkWidget * hbox, * hhbox;
1005 GtkWidget * entry;
1006 GtkWidget * combo;
1007 gboolean val;
1008 int i, j, k, l, m;
1009 hbox = create_hbox (5);
1010 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1011 val = (tmp_field -> equi_opts[0] == 1.0) ? TRUE : FALSE;
1012 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button("Equilibrate", 100, -1, val, G_CALLBACK(check_equi), GINT_TO_POINTER(0)), FALSE, FALSE, 5);
1013 equi_box[0] = create_vbox (5);
1015 gtk_box_set_homogeneous (GTK_BOX (equi_box[0]), TRUE);
1016 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, equi_box[0], FALSE, FALSE, 0);
1017 for (i=0; i<8; i++)
1018 {
1019 hbox = create_hbox (5);
1020 j = 2*i + 2*(i/5) - i/7;
1021 k = (i != 2) ? 5 : 10;
1022 l = j + 1;
1023
1024 add_box_child_start (GTK_ORIENTATION_VERTICAL, equi_box[0], hbox, FALSE, FALSE, 0);
1025
1026 if (i < 4)
1027 {
1028 entry = create_entry (G_CALLBACK(set_equi_param), k*10, k + k/6, FALSE, GINT_TO_POINTER(l));
1029 if (i == 2)
1030 {
1031 update_entry_double (GTK_ENTRY(entry), tmp_field -> equi_opts[l]);
1032 }
1033 else
1034 {
1035 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> equi_opts[l]);
1036 }
1037 }
1038 if (i)
1039 {
1040 val = (tmp_field -> equi_opts[j] == 1.0) ? TRUE : FALSE;
1041 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button(equi_info[i], 300, -1, val, G_CALLBACK(check_equi), GINT_TO_POINTER(i)), FALSE, FALSE, 5);
1042 if (i == 4 || i == 5)
1043 {
1044 hhbox = create_hbox (5);
1045 add_box_child_start (GTK_ORIENTATION_VERTICAL, equi_box[0], hhbox, FALSE, FALSE, 0);
1046 hbox = create_hbox (5);
1047 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, hbox, FALSE, FALSE, 50);
1048 }
1049 equi_box[i] = create_hbox (5);
1051 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, equi_box[i], FALSE, FALSE, 5);
1052 if (i < 6) add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], markup_label(equi_data[i-1], 100, -1, 0.8, 0.5), FALSE, FALSE, 0);
1053 if (i < 4)
1054 {
1055 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], entry, FALSE, FALSE, 5);
1056 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], markup_label(equi_unit[i-1], 100, -1, 0.0, 0.5), FALSE, FALSE, 0);
1057 }
1058 else if (i < 6)
1059 {
1060 combo = create_combo();
1061 for (m=0; m<3; m++) combo_text_append (combo, equi_min[m]);
1062 combo_set_active (combo, (int)tmp_field -> equi_opts[l]);
1063 gtk_widget_set_size_request (combo, 100, -1);
1064 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_equi_combo), GINT_TO_POINTER(l));
1065 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], combo, FALSE, FALSE, 5);
1066 for (m=i-4; m<2; m++, l++)
1067 {
1068 equi_lab[(i-4)*2+2*m] = markup_label((i == 4 && m) ? equi_data[0] : g_strdup_printf ("%s:", equi_min[(int)tmp_field -> equi_opts[l]]), 75, -1, 0.8, 0.5);
1069 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], equi_lab[(i-4)*2+2*m], FALSE, FALSE, 0);
1070 k = (i == 4 && m) ? 5 : 10;
1071 equi_entry[i-4+m] = create_entry (G_CALLBACK(set_equi_param), k*10, k + k/6, FALSE, GINT_TO_POINTER(l+1+m/2));
1072 if (i == 4 && m)
1073 {
1074 update_entry_int (GTK_ENTRY(equi_entry[i-4+m]), (int)tmp_field -> equi_opts[l+1+m/2]);
1075 }
1076 else
1077 {
1078 update_entry_double (GTK_ENTRY(equi_entry[i-4+m]), tmp_field -> equi_opts[l+1+m/2]);
1079 }
1080 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], equi_entry[i-4+m], FALSE, FALSE, 5);
1081 equi_lab[(i-4)*2+2*m+1] = markup_label((i == 4 && m) ? equi_unit[0] : equi_minu[(int)tmp_field -> equi_opts[l]], 50, -1, 0.0, 0.5);
1082 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], equi_lab[(i-4)*2+2*m+1], FALSE, FALSE, 0);
1083 }
1084 }
1085 }
1086 else
1087 {
1088 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(equi_info[i], 250, -1, 0.8, 0.5), FALSE, FALSE, 0);
1089 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
1090 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(equi_unit[i], 100, -1, 0.0, 0.5), FALSE, FALSE, 0);
1091 }
1092 }
1093 return vbox;
1094}
1095
1096gchar * traj_data[4] = {"Defects:",
1097 "Displacements:",
1098 "History:",
1099 "Atom's MSD:"};
1100
1101gchar * traj_info[4][3] = {{"From step:", "Every:", "Site interstitial cutoff:"},
1102 {"From step:", "Every:", "Qualifying cutoff:"},
1103 {"From step:", "Every:", "Data level:"},
1104 {"From step:", "Every:", NULL}};
1105
1106gchar * traj_level[3]={"0", "1", "2"};
1107
1108gchar * out_print[3]={"Radial distribution functions (RDFs):",
1109 "Velocity autocorrelation functions (VAFs):",
1110 "Z density profile:"};
1111
1112GtkWidget * out_hbox[11];
1113GtkWidget * out_entry[3];
1114
1123G_MODULE_EXPORT void set_out_param (GtkEntry * res, gpointer data)
1124{
1125 int i;
1126 i = GPOINTER_TO_INT(data);
1127 const gchar * m = entry_get_text (res);
1128 double v = string_to_double ((gpointer)m);
1129 if (i == 3 || i == 7 || i == 23)
1130 {
1131 if (v >= 0.0 && v != tmp_field -> out_opts[i])
1132 {
1133 tmp_field -> out_opts[i] = v;
1134 }
1135 update_entry_double (res, tmp_field -> out_opts[i]);
1136 if (i == 23)
1137 {
1138 update_entry_double (GTK_ENTRY(out_entry[0]), tmp_field -> out_opts[i]);
1139 update_entry_double (GTK_ENTRY(out_entry[2]), tmp_field -> out_opts[i]);
1140 }
1141 }
1142 else
1143 {
1144 if ((int)v != (int)tmp_field -> out_opts[i])
1145 {
1146 tmp_field -> out_opts[i] = (int)v;
1147 }
1148 update_entry_int (res, (int)tmp_field -> out_opts[i]);
1149 }
1150}
1151
1152#ifdef GTK4
1161G_MODULE_EXPORT void check_out (GtkCheckButton * but, gpointer data)
1162#else
1171G_MODULE_EXPORT void check_out (GtkToggleButton * but, gpointer data)
1172#endif
1173{
1174 int i, k;
1175 i = GPOINTER_TO_INT(data);
1176 gboolean j = button_get_status ((GtkWidget *)but);
1177 if (i < 7)
1178 {
1179 k = 4*i - i/4 - 2*(i/5) - 2*(i/6);
1180 tmp_field -> out_opts[k] = (j) ? 1.0 : 0.0;
1182 }
1183 else
1184 {
1185 tmp_field -> out_opts[i] = (j) ? 1.0 : 0.0;
1186 if (i < 29)
1187 {
1188 k = (i == 21) ? 7 : (i == 24) ? 8 : 9;
1190 if (i == 24) widget_set_sensitive (out_hbox[10], j);
1191 }
1192 }
1193}
1194
1203G_MODULE_EXPORT void set_print_level (GtkComboBox * box, gpointer data)
1204{
1205 tmp_field -> out_opts[12] = combo_get_active ((GtkWidget *)box);
1206}
1207
1213GtkWidget * create_traj_box ()
1214{
1215 GtkWidget * vbox = create_vbox (5);
1216 GtkWidget * hbox;
1217 GtkWidget * combo;
1218 GtkWidget * entry;
1219 gboolean val;
1220 int i, j, k, l;
1221 for (i=0; i<4; i++)
1222 {
1223 hbox = create_hbox (0);
1224 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1225 k = (i < 4) ? 4*i : 15;
1226 val = (tmp_field -> out_opts[k] == 1.0) ? TRUE : FALSE;
1227 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button(traj_data[i], 150, -1, val, G_CALLBACK(check_out), GINT_TO_POINTER(i)), FALSE, FALSE, 5);
1228 out_hbox[i] = create_hbox (5);
1229 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[i], FALSE, FALSE, 0);
1231
1232 for (j=0; j<3-i/3; j++)
1233 {
1234 l = (j == 2) ? 150 : 50;
1235 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], markup_label(traj_info[i][j], l, -1, 1.0, 0.5), FALSE, FALSE, 5);
1236 if (i != 2 || j != 2)
1237 {
1238 l = (j<2) ? 50 : 100;
1239 entry = create_entry (G_CALLBACK(set_out_param), l, l/10, FALSE, GINT_TO_POINTER(k+j+1));
1240 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], entry, FALSE, FALSE, 0);
1241 if (j == 2)
1242 {
1243 update_entry_double (GTK_ENTRY(entry), tmp_field -> out_opts[k+j+1]);
1244 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1245 }
1246 else
1247 {
1248 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[k+j+1]);
1249 if (j) add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], markup_label("<b>step(s)</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1250 }
1251 }
1252 else
1253 {
1254 combo = create_combo();
1255 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], combo, FALSE, FALSE, 0);
1256 for (l=0; l<3; l++) combo_text_append (combo, traj_level[l]);
1257 combo_set_active (combo, (int)tmp_field -> out_opts[k+j+1]);
1258 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_print_level), NULL);
1259 }
1260 }
1261 }
1262 return vbox;
1263}
1264
1270GtkWidget * create_dump_box ()
1271{
1272 GtkWidget * vbox = create_vbox (5);
1273 GtkWidget * hbox;
1274 GtkWidget * entry;
1275
1276 hbox = create_hbox (0);
1277 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1278 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Dump restart information every:", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
1279 entry = create_entry (G_CALLBACK(set_out_param), 50, 6, FALSE, GINT_TO_POINTER(30));
1280 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
1281 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[30]);
1282 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>step(s)</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1283
1284 return vbox;
1285}
1286
1287gchar * out_data[3] = {"Print system data:",
1288 "Accumulate statistics data:",
1289 "Rolling average stack:"};
1290
1291gchar * out_info[3] = {"Every:", "Every:", " "};
1292
1298GtkWidget * create_out_box ()
1299{
1300 GtkWidget * vbox = create_vbox (5);
1301 GtkWidget * hbox;
1302 GtkWidget * entry;
1303 gboolean val;
1304 int i, j;
1305 for (i=4; i<7; i++)
1306 {
1307 hbox = create_hbox (0);
1308 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1309 j = 2*(i-4)+15;
1310 val = (tmp_field -> out_opts[j] == 1.0) ? TRUE : FALSE;
1311 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button(out_data[i-4], 200, -1, val, G_CALLBACK(check_out), GINT_TO_POINTER(i)), FALSE, FALSE, 5);
1312 out_hbox[i] = create_hbox (5);
1313 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[i], FALSE, FALSE, 0);
1315 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], markup_label(out_info[i-4], 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1316 entry = create_entry (G_CALLBACK(set_out_param), 50, 5, FALSE, GINT_TO_POINTER(j+1));
1317 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], entry, FALSE, FALSE, 0);
1318 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[j+1]);
1319 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], markup_label("<b>step(s)</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1320 }
1321 return vbox;
1322}
1323
1330{
1331 GtkWidget * vbox = create_vbox (5);
1332 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
1333 GtkWidget * hbox, * hhbox;
1334 GtkWidget * entry;
1335 gboolean val;
1336 int i, k, l, m, n;
1337 i = 6;
1338 for (l=0; l<3; l++)
1339 {
1340 k = 21 + 3*l;
1341 hbox = create_hbox (5);
1342 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1343 val = (tmp_field -> out_opts[k] == 1.0) ? TRUE : FALSE;
1344 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button(out_print[l], 300, -1, val, G_CALLBACK(check_out), GINT_TO_POINTER(k)), FALSE, FALSE, 5);
1345 out_hbox[i+l+1] = create_hbox (5);
1347 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[i+l+1], FALSE, FALSE, 5);
1348 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], markup_label("Every:", 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1349 entry = create_entry (G_CALLBACK(set_out_param), 50, 5, FALSE, GINT_TO_POINTER(k+1));
1350 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[k+1]);
1351 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], entry, FALSE, FALSE, 0);
1352 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], markup_label("<b>step(s)</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1353 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], markup_label("Bin size:", 100, -1, 1.0, 0.5), FALSE, FALSE, 5);
1354 m = (l==1) ? k + 2 : 23;
1355 n = (l==1) ? 1 : 2;
1356 out_entry[l] = create_entry (G_CALLBACK(set_out_param), n*50, n*5, FALSE, GINT_TO_POINTER(m));
1357 if (l != 1)
1358 {
1359 update_entry_double (GTK_ENTRY(out_entry[l]), tmp_field -> out_opts[m]);
1360 }
1361 else
1362 {
1363 update_entry_int (GTK_ENTRY(out_entry[l]), (int)tmp_field -> out_opts[m]);
1364 }
1365 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], out_entry[l], FALSE, FALSE, 0);
1366 if (l != 1)
1367 {
1368 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1369 }
1370 if (l == 1)
1371 {
1372 hbox = create_hbox (0);
1373 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1374 out_hbox[10] = create_hbox (0);
1375 hhbox = create_hbox (0);
1376 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 0);
1377 gtk_widget_set_size_request (hhbox, 330, -1);
1378 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[10], FALSE, FALSE, 0);
1379 val = (tmp_field -> out_opts[29] == 1.0) ? TRUE : FALSE;
1380 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[10], check_button("Ignore time-averaging for the VAFs", 100, -1, val, G_CALLBACK(check_out), GINT_TO_POINTER(29)), FALSE, FALSE, 5);
1382 }
1383 }
1384 return vbox;
1385}
1386
1387GtkWidget * ana_box[5];
1388gchar * ana_info[5]={"All:", "Bonds:", "Angles:", "Dihedrals:", "Inversions:"};
1389gchar * ana_param[3]={"Every:", "Num. δ", "Cutoff = "};
1390
1399G_MODULE_EXPORT void set_ana_param (GtkEntry * res, gpointer data)
1400{
1401 int i;
1402 i = GPOINTER_TO_INT(data);
1403 const gchar * m = entry_get_text (res);
1404 double v = string_to_double ((gpointer)m);
1405 if (v >= 0.0 && v != tmp_field -> ana_opts[i])
1406 {
1407 tmp_field -> ana_opts[i] = v;
1408 }
1409 if (i == 3 || i == 7)
1410 {
1411 update_entry_double (GTK_ENTRY(res), tmp_field -> ana_opts[i]);
1412 }
1413 else
1414 {
1415 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> ana_opts[i]);
1416 }
1417}
1418
1419#ifdef GTK4
1428G_MODULE_EXPORT void check_ana (GtkCheckButton * but, gpointer data)
1429#else
1438G_MODULE_EXPORT void check_ana (GtkToggleButton * but, gpointer data)
1439#endif
1440{
1441 int i, k;
1442 i = GPOINTER_TO_INT(data);
1443 gboolean j = button_get_status ((GtkWidget *)but);
1444 tmp_field -> ana_opts[i] = (j) ? 1.0 : 0.0;
1445 switch (i)
1446 {
1447 case 14:
1448 k = 4;
1449 break;
1450 case 11:
1451 k = 3;
1452 break;
1453 default:
1454 k = i / 4;
1455 break;
1456 }
1458}
1459
1466{
1467 GtkWidget * vbox = create_vbox (5);
1468 GtkWidget * hbox;
1469 GtkWidget * entry;
1470 gboolean val;
1471 gchar * str;
1472
1473 int i, j;
1474 for (i=0; i<5; i++)
1475 {
1476 hbox = create_hbox (5);
1477 j = (i < 3) ? 4*i: 11 + 3*(i-3);
1478 val = (tmp_field -> ana_opts[j] == 1.0) ? TRUE : FALSE;
1479 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1480 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button(ana_info[i], 100, -1, val, G_CALLBACK(check_ana), GINT_TO_POINTER(j)), FALSE, FALSE, 5);
1481 ana_box[i] = create_hbox (5);
1482
1484 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ana_box[i], FALSE, FALSE, 0);
1485
1486 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(ana_param[0], 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1487 entry = create_entry (G_CALLBACK(set_ana_param), 50, 5, FALSE, GINT_TO_POINTER(j+1));
1488
1489 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> ana_opts[j+1]);
1490 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], entry, FALSE, FALSE, 0);
1491 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label("<b>step(s)</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1492 if (i < 2)
1493 {
1494 str = g_strdup_printf ("%sr in [0 : r]", ana_param[1]);
1495 }
1496 else if (i == 3)
1497 {
1498 str = g_strdup_printf ("%s° in [-180 : 180]", ana_param[1]);
1499 }
1500 else
1501 {
1502 str = g_strdup_printf ("%s° in [0 : 180]", ana_param[1]);
1503 }
1504 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(str, 160, -1, 1.0, 0.5), FALSE, FALSE, 5);
1505 g_free (str);
1506 entry = create_entry (G_CALLBACK(set_ana_param), 50, 5, FALSE, GINT_TO_POINTER(j+2));
1507 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> ana_opts[j+2]);
1508 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], entry, FALSE, FALSE, 0);
1509 if (i < 2)
1510 {
1511 str = g_strdup_printf ("<b>δr</b>");
1512 }
1513 else
1514 {
1515 str = g_strdup_printf ("<b>δ°</b>");
1516 }
1517 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(str, 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1518 g_free (str);
1519 if (i < 2)
1520 {
1521 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(ana_param[2], 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1522 entry = create_entry (G_CALLBACK(set_ana_param), 100, 11, FALSE, GINT_TO_POINTER(j+3));
1523 update_entry_double (GTK_ENTRY(entry), tmp_field -> ana_opts[j+3]);
1524 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], entry, FALSE, FALSE, 0);
1525 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1526 }
1527
1528 }
1529 return vbox;
1530}
1531
1532GtkWidget * time_box[2];
1533GtkWidget * io_box[2];
1534GtkWidget * io_pre;
1535GtkWidget * misc_box;
1536gchar * time_info[2]={"Set job time:", "Set job closure time:"};
1537gchar * tps_info[2]={"run time:", "closure time:"};
1538gchar * io_rw_m[4] = {"MPI I/O", "FORTRAN I/O", "Traditional master I/O", "netCDF I/O"};
1539gchar * io_info[2] = {"<b>General Input/Output (I/O) read interface:</b>", "<b>General Input/Output (I/O) write interface:</b>"};
1540gchar * io_para[4] = {"Reader count:", "Batch size:", "Buffer size:", "// error check"};
1541gchar * io_pres[2] = {"Float - 32 bit", "Double - 64 bit"};
1542gchar * io_type[2] = {"Sorted", "Unsorted"};
1543GtkWidget * io_hp[2][4];
1544GtkWidget * check_e[2];
1545
1554G_MODULE_EXPORT void set_io_param (GtkEntry * res, gpointer data)
1555{
1556 int i;
1557 i = GPOINTER_TO_INT(data);
1558 const gchar * m = entry_get_text (res);
1559 double v = string_to_double ((gpointer)m);
1560 if (i < 2)
1561 {
1562 if (v >= 0.0 && v != tmp_field -> io_opts[2*i+1])
1563 {
1564 tmp_field -> io_opts[2*i+1] = v;
1565 }
1566 update_entry_double (GTK_ENTRY(res), tmp_field -> io_opts[2*i+1]);
1567 }
1568 else
1569 {
1570 if (i == 7 || i == 15)
1571 {
1572 if (v >= 1.0 && v <= 100000000.0)
1573 {
1574 if (v != tmp_field -> io_opts[i])
1575 {
1576 tmp_field -> io_opts[i] = v;
1577 }
1578 }
1579 else
1580 {
1581 show_warning ("The batch size or max. number of particles by batch\n"
1582 "must be in [1 - 10 000 000]", field_assistant);
1583 }
1584 }
1585 else if (i == 8 || i == 16)
1586 {
1587 if (v >= 100.0 && v <= 100000.0)
1588 {
1589 if (v != tmp_field -> io_opts[i])
1590 {
1591 tmp_field -> io_opts[i] = v;
1592 }
1593 }
1594 else
1595 {
1596 show_warning ("The buffer size or max. number of ASCII line records by batch\n"
1597 "must be in [100 - 100 000]", field_assistant);
1598 }
1599 }
1600 else if (i == 19 || i == 20 || i == 21)
1601 {
1602 if (v != tmp_field -> io_opts[i])
1603 {
1604 tmp_field -> io_opts[i] = v;
1605 }
1606 }
1607 else if (v > 0.0 && v != tmp_field -> io_opts[i])
1608 {
1609 tmp_field -> io_opts[i] = v;
1610 }
1611 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> io_opts[i]);
1612 }
1613}
1614
1615#ifdef GTK4
1624G_MODULE_EXPORT void check_io (GtkCheckButton * but, gpointer data)
1625#else
1634G_MODULE_EXPORT void check_io (GtkToggleButton * but, gpointer data)
1635#endif
1636{
1637 int i, k;
1638 i = GPOINTER_TO_INT(data);
1639 gboolean j = button_get_status ((GtkWidget *)but);
1640 if (i < 2)
1641 {
1642 tmp_field -> io_opts[2*i] = (j) ? 1.0 : 0.0;
1644 }
1645 else
1646 {
1647 tmp_field -> io_opts[i] = (j) ? 1.0 : 0.0;
1648 if (i < 18)
1649 {
1650 k = (i == 4) ? 0 : 1;
1652 }
1653 else if (i == 18)
1654 {
1656 }
1657 }
1658}
1659
1668G_MODULE_EXPORT void set_io_method (GtkComboBox * box, gpointer data)
1669{
1670 int i, j, k;
1671 gboolean l;
1672 i = GPOINTER_TO_INT(data);
1673 j = combo_get_active ((GtkWidget *)box);
1674 tmp_field -> io_opts[i] = (double)j;
1675 if (i < 12)
1676 {
1677 k = (i == 5) ? 0 : 1;
1678 l = (j == 2) ? FALSE : TRUE;
1679 widget_set_sensitive (io_hp[k][0], l);
1680 widget_set_sensitive (io_hp[k][2], l);
1682 if (i == 11)
1683 {
1684 l = (j == 3) ? TRUE : FALSE;
1686 }
1687 }
1688}
1689
1695GtkWidget * create_job_box ()
1696{
1697 GtkWidget * vbox = create_vbox (BSEP);
1698 GtkWidget * hbox;
1699 GtkWidget * entry;
1700 gboolean val;
1701 int i;
1702 for (i=0; i<2; i++)
1703 {
1704 hbox = create_hbox (5);
1705 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
1706 val = (tmp_field -> io_opts[2*i] == 1.0) ? TRUE : FALSE;
1707 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button(time_info[i], 200, -1, val, G_CALLBACK(check_io), GINT_TO_POINTER(i)), FALSE, FALSE, 5);
1708 time_box[i] = create_hbox (5);
1710 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, time_box[i], FALSE, FALSE, 0);
1711 entry = create_entry (G_CALLBACK(set_io_param), 100, 11, FALSE, GINT_TO_POINTER(i));
1712 update_entry_double (GTK_ENTRY(entry), tmp_field -> io_opts[i*2+1]);
1713 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, time_box[i], entry, FALSE, FALSE, 5);
1714 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, time_box[i], markup_label("<b>s</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1715 }
1716 return vbox;
1717}
1718
1724GtkWidget * create_io_box ()
1725{
1726 GtkWidget * vbox = create_vbox (BSEP);
1727 GtkWidget * hbox;
1728 GtkWidget * combo;
1729 GtkWidget * entry;
1730 gboolean val;
1731 int i, j, k;
1732 gboolean l, m;
1733 k = 4;
1734 for (i=0; i<2; i++)
1735 {
1736 hbox = create_hbox (5);
1737 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
1738 val = (tmp_field -> io_opts[k] == 1.0) ? TRUE : FALSE;
1739 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button(io_info[i], 200, -1, val, G_CALLBACK(check_io), GINT_TO_POINTER(k)), FALSE, FALSE, 5);
1740 io_box[i] = create_vbox (5);
1742 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, io_box[i], FALSE, FALSE, 0);
1743 hbox = create_hbox (5);
1744 add_box_child_start (GTK_ORIENTATION_VERTICAL, io_box[i], hbox, FALSE, FALSE, 0);
1745 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Method:", 100, -1, 1.0, 0.5), FALSE, FALSE, 5);
1746 combo = create_combo();
1747 for (j=0; j<4; j++)
1748 {
1749 combo_text_append(combo, io_rw_m[j]);
1750 }
1751 k ++;
1752 combo_set_active (combo, (int)tmp_field -> io_opts[k]);
1753 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_io_method), GINT_TO_POINTER(k));
1754 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 5);
1755 l = tmp_field -> io_opts[k] == 2.0 ? FALSE : TRUE;
1756 m = tmp_field -> io_opts[k] == 3.0 ? TRUE : FALSE;
1757 if (i)
1758 {
1759 io_pre = create_hbox(5);
1760 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, io_pre, FALSE, FALSE, 0);
1761 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, io_pre, markup_label("Real precision:", 150, -1, 1.0, 0.5), FALSE, FALSE, 5);
1762 combo = create_combo();
1763 for (j=0; j<2; j++) combo_text_append(combo, io_pres[j]);
1764 k ++;
1765 combo_set_active (combo, (int)tmp_field -> io_opts[k]);
1766 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_io_method), GINT_TO_POINTER(k));
1767 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, io_pre, combo, FALSE, FALSE, 5);
1769 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Type:", 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1770 combo = create_combo();
1771 for (j=0; j<2; j++) combo_text_append(combo, io_type[j]);
1772 k ++;
1773 combo_set_active (combo, (int)tmp_field -> io_opts[k]);
1774 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_io_method), GINT_TO_POINTER(k));
1775 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 5);
1776 }
1777 hbox = create_hbox (5);
1778 add_box_child_start (GTK_ORIENTATION_VERTICAL, io_box[i], hbox, FALSE, FALSE, 0);
1779 for (j=0; j<3; j++)
1780 {
1781 io_hp[i][j] = create_hbox (5);
1782 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, io_hp[i][j], FALSE, FALSE, 0);
1783 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, io_hp[i][j], markup_label(io_para[j], 100, -1, 1.0, 0.5), FALSE, FALSE, 5);
1784 k++;
1785 entry = create_entry (G_CALLBACK(set_io_param), 70, 8, FALSE, GINT_TO_POINTER(k));
1786 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> io_opts[k]);
1787 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, io_hp[i][j], entry, FALSE, FALSE, 5);
1788 if (j == 1) widget_set_sensitive (io_hp[i][j], l);
1789 }
1790 k++;
1791 check_e[i] = check_button(io_para[j], 50, -1, val, G_CALLBACK(check_io), GINT_TO_POINTER(k));
1792 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_e[i], FALSE, FALSE, 20);
1794 k ++;
1795 }
1796 return vbox;
1797}
1798
1804GtkWidget * create_misc_box ()
1805{
1806 GtkWidget * vbox = create_vbox (BSEP);
1807 GtkWidget * hbox;
1808 GtkWidget * entry;
1809 gchar * str;
1810 gboolean val;
1811 int i;
1812 hbox = create_hbox (5);
1813 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
1814 val = (tmp_field -> io_opts[18] == 1.0) ? TRUE : FALSE;
1815 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button("Random number generator seeds:", 200, -1, val, G_CALLBACK(check_io), GINT_TO_POINTER(18)), FALSE, FALSE, 5);
1816 misc_box = create_hbox (5);
1818 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, misc_box, FALSE, FALSE, 0);
1819 for (i=19; i<22; i++)
1820 {
1821 str = g_strdup_printf ("<i>n</i><sub>%d</sub>", i-18);
1822 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, misc_box, markup_label(str, 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1823 g_free (str);
1824 entry = create_entry (G_CALLBACK(set_io_param), 70, 10, FALSE, GINT_TO_POINTER(i));
1825 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> io_opts[i]);
1826 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, misc_box, entry, FALSE, FALSE, 5);
1827 }
1828 hbox = create_hbox (5);
1829 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
1830 val = (tmp_field -> io_opts[22] == 1.0) ? TRUE : FALSE;
1831 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button("Limits to 2 the number of processors in <i>z</i> direction for slab simulations", 200, -1, val, G_CALLBACK(check_io), GINT_TO_POINTER(22)), FALSE, FALSE, 5);
1832 return vbox;
1833}
1834
1835
1836GtkWidget * elec_box[4];
1837GtkWidget * pres_spin;
1838gchar * eval_m[10] = {"Direct Coulomb sum", "Distance dependent dielectric Coulomb sum",
1839 "Ewald sum (auto)", "Ewald sum",
1840 "Reaction field electrostatics", "Reaction field with Fennel damping",
1841 "Reaction field with Fennel damping (auto)",
1842 "Force-shifted Coulomb sum", "Force-shifted Coulomb sum with Fennel damping",
1843 "Force-shifted Coulomb sum with Fennel damping (auto)"};
1844
1853G_MODULE_EXPORT void set_elec_param (GtkEntry * res, gpointer data)
1854{
1855 int i;
1856 i = GPOINTER_TO_INT(data);
1857 const gchar * m = entry_get_text (res);
1858 double v = string_to_double ((gpointer)m);
1859 if (i == 1)
1860 {
1861 if (v > 0.0 && v != tmp_field -> elec_opts[i])
1862 {
1863 tmp_field -> elec_opts[i] = v;
1864 }
1865 else if (v < 0.0)
1866 {
1867 show_warning ("Cutoff must be > 0.0 &#xC5;", field_assistant);
1868 }
1869 }
1870 else if (i == 3)
1871 {
1872 if (v > 0.0 && v != tmp_field -> elec_opts[i])
1873 {
1874 if (v >= min(0.05, 0.5*tmp_field -> elec_opts[1]/100.0))
1875 {
1876 tmp_field -> elec_opts[i] = v;
1877 }
1878 else
1879 {
1880 show_warning ("Padding must be &#8805; min(0.05, 0.5%r<sub>cut</sub>) &#xC5;", field_assistant);
1881 }
1882 }
1883 else if (v < 0.0)
1884 {
1885 show_warning ("Padding must be > 0.0 &#xC5;", field_assistant);
1886 }
1887 }
1888 else
1889 {
1890 if (i != 6 && (v >= 0.0 && v != tmp_field -> elec_opts[i]))
1891 {
1892 tmp_field -> elec_opts[i] = v;
1893 }
1894 else if (i == 6)
1895 {
1896 if (tmp_field -> elec_opts[5] == 2.0 || tmp_field -> elec_opts[5] == 6.0 || tmp_field -> elec_opts[5] == 9.0)
1897 {
1898 int j = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(pres_spin));
1899 double w = v * pow (10, j);
1900 if ((w >= 1e-20 && w <= 0.5) && w != tmp_field -> elec_opts[i])
1901 {
1902 tmp_field -> elec_opts[i] = w;
1903 w = v;
1904 }
1905 else if (w < 1e-20 || w > 0.5)
1906 {
1907 show_warning ("Precision must be in [10<sup>-20</sup> - 0.5]", field_assistant);
1908 w = tmp_field -> elec_opts[i] / pow (10, j);
1909 }
1910 }
1911 else if (v >= 0.0 && v != tmp_field -> elec_opts[i])
1912 {
1913 tmp_field -> elec_opts[i] = v;
1914 }
1915 }
1916 }
1917 if (i == 10)
1918 {
1919 if (tmp_field -> elec_opts[i] == 0.0) tmp_field -> elec_opts[i] = 1.0;
1920 if (tmp_field -> elec_opts[i] > 10.0) tmp_field -> elec_opts[i] = 4.0;
1921 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> elec_opts[i]);
1922 }
1923 else if (i == 7 || i == 8 || i == 9)
1924 {
1925 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> elec_opts[i]);
1926 }
1927 else
1928 {
1929 if (i == 6)
1930 {
1931 update_entry_double (GTK_ENTRY(res), v);
1932 }
1933 else
1934 {
1935 update_entry_double (GTK_ENTRY(res), tmp_field -> elec_opts[i]);
1936 }
1937 }
1938}
1939
1948G_MODULE_EXPORT void adjust_precision (GtkSpinButton * res, gpointer data)
1949{
1950 int powa = gtk_spin_button_get_value_as_int(res);
1951 double v = tmp_field -> elec_opts[6];
1952 while (v < 0.1)
1953 {
1954 v = v*10;
1955 }
1956 v = v*10;
1957 tmp_field -> elec_opts[6] = v * pow(10, powa);
1958}
1959
1966{
1967 GtkWidget * vbox, * vvbox;
1968 GtkWidget * hbox, * hhbox;
1969 GtkWidget * entry;
1970 vvbox = create_hbox (5);
1971 vbox = create_vbox (5);
1972 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
1973 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, vvbox, vbox, FALSE, FALSE, 50);
1974 gchar * dir[3] = {"x:", "y:", "z:"};
1975 if (tmp_field -> elec_opts[5] == 2.0 || tmp_field -> elec_opts[5] == 6.0 || tmp_field -> elec_opts[5] == 9.0)
1976 {
1977 hbox = create_hbox (5);
1978 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1979 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Precision:", 180, -1, 0.0, 0.5), FALSE, FALSE, 0);
1980 // tmp_field -> elec_opts[6] = 1e-20;
1981 entry = create_entry (G_CALLBACK(set_elec_param), 100, 11, FALSE, GINT_TO_POINTER(6));
1982 double v = tmp_field -> elec_opts[6];
1983 int i = -1;
1984 while (v < 0.1)
1985 {
1986 v = v*10;
1987 i --;
1988 }
1989 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[6] / pow(10,i));
1990 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
1991 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" x 10<sup>-</sup>", 5, -1, 0.0, 0.5), FALSE, FALSE, 0);
1992 pres_spin = spin_button (G_CALLBACK(adjust_precision), i, -20, -1, 1, 0, 15, NULL);
1993 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, pres_spin, FALSE, FALSE, 5);
1994 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("in [10<sup>-20</sup> - 0.5]", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
1995 }
1996 else if (tmp_field -> elec_opts[5] == 3.0)
1997 {
1998 hbox = create_hbox (5);
1999 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2000 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Ewald convergence parameter:", 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2001 // tmp_field -> elec_opts[6] = 1.0;
2002 entry = create_entry (G_CALLBACK(set_elec_param), 100, 11, FALSE, GINT_TO_POINTER(6));
2003 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[6]);
2004 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2005 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>&#xC5;<sup>-1</sup></b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2006 hbox = create_hbox (5);
2007 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2008 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Maximum k vector index in directions:", 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2009 hbox = create_hbox (5);
2010 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2011 int i;
2012 for (i=0; i<3; i++)
2013 {
2014 hhbox = create_hbox (5);
2015 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 40);
2016 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(dir[i], 10, -1, 0.0, 0.5), FALSE, FALSE, 0);
2017 // tmp_field -> elec_opts[7+i] = 1.0;
2018 entry = create_entry (G_CALLBACK(set_elec_param), 50, 5, FALSE, GINT_TO_POINTER(7+i));
2019 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> elec_opts[7+i]);
2020 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
2021 }
2022 }
2023 else if (tmp_field -> elec_opts[5] == 5.0 || tmp_field -> elec_opts[5] == 8.0)
2024 {
2025 hbox = create_hbox (5);
2026 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2027 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Fennell damping parameter (&#x3B1;):", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
2028 entry = create_entry (G_CALLBACK(set_elec_param), 100, 11, FALSE, GINT_TO_POINTER(6));
2029 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[6]);
2030 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2031 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>&#xC5;<sup>-1</sup></b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2032 }
2033 if (tmp_field -> elec_opts[5] == 2.0 || tmp_field -> elec_opts[5] == 3.0)
2034 {
2035 hbox = create_hbox (5);
2036 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2037 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Evaluate <i>k</i>-space contribution to the Ewald sum every:", -1, -1, 0.0, 0.5), FALSE, FALSE, 0);
2038 entry = create_entry (G_CALLBACK(set_elec_param), 50, 5, FALSE, GINT_TO_POINTER(10));
2039 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> elec_opts[10]);
2040 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2041 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>step(s)</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2042 }
2043 return vvbox;
2044}
2045
2054G_MODULE_EXPORT void set_elec_eval (GtkComboBox * box, gpointer data)
2055{
2056 tmp_field -> elec_opts[5] = combo_get_active ((GtkWidget *)box);
2060 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[2], elec_box[3], FALSE, FALSE, 10);
2061}
2062
2063#ifdef GTK4
2072G_MODULE_EXPORT void check_elec (GtkCheckButton * but, gpointer data)
2073#else
2082G_MODULE_EXPORT void check_elec (GtkToggleButton * but, gpointer data)
2083#endif
2084{
2085 int i = GPOINTER_TO_INT(data);
2086 gboolean j = button_get_status ((GtkWidget *)but);
2087 tmp_field -> elec_opts[i] = (j) ? 1.0 : 0.0;
2088 if (! i) widget_set_sensitive (elec_box[j], j);
2089 if (i == 2) widget_set_sensitive (elec_box[1], j);
2090}
2091
2098{
2099 GtkWidget * vbox = create_vbox (BSEP);
2100 GtkWidget * hbox;
2101 gboolean val = (tmp_field -> elec_opts[0] == 1.0) ? TRUE : FALSE;
2102 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, check_button("Evaluate electrostatics interactions", -1, -1, val, G_CALLBACK(check_elec), GINT_TO_POINTER(0)), FALSE, FALSE, 5);
2103 hbox = create_hbox(0);
2104 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2105 elec_box[0] = create_vbox(5);
2107 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, elec_box[0], FALSE, FALSE, 50);
2108 hbox = create_hbox(5);
2109 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[0], hbox, FALSE, FALSE, 0);
2110 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Long range interaction cutoff [r<sub>cut</sub>]:", 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2111 GtkWidget * entry = create_entry (G_CALLBACK(set_elec_param), 100, 10, FALSE, GINT_TO_POINTER(1));
2112 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[1]);
2113 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2114 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>&#xC5;</b>", 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
2115 val = (tmp_field -> elec_opts[2] == 1.0) ? TRUE : FALSE;
2116 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button("Add padding to r<sub>cut</sub>:", 150, -1, val, G_CALLBACK(check_elec), GINT_TO_POINTER(2)), FALSE, FALSE, 0);
2117 elec_box[1] = create_hbox(5);
2118 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, elec_box[1], FALSE, FALSE, 0);
2119 entry = create_entry (G_CALLBACK(set_elec_param), 100, 10, FALSE, GINT_TO_POINTER(3));
2120 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[3]);
2121 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, elec_box[1], entry, FALSE, FALSE, 10);
2122 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, elec_box[1], markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2124 val = (tmp_field -> elec_opts[4] == 1.0) ? TRUE : FALSE;
2125 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[0], check_button("Use extended coulombic exclusion", -1, -1, val, G_CALLBACK(check_elec), GINT_TO_POINTER(4)), FALSE, FALSE, 5);
2126 hbox = create_hbox(5);
2127 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[0], hbox, FALSE, FALSE, 0);
2128 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Evaluation method:", 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2129 GtkWidget * combo = create_combo();
2130 int i;
2131 for (i=0; i<10; i++)
2132 {
2133 combo_text_append(combo, eval_m[i]);
2134 }
2135 combo_set_active (combo, (int)tmp_field -> elec_opts[5]);
2136 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_elec_eval), NULL);
2137 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 10);
2138 elec_box[2] = create_vbox (BSEP);
2139 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[0], elec_box[2], FALSE, FALSE, 0);
2141 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[2], elec_box[3], FALSE, FALSE, 10);
2142 return vbox;
2143}
2144
2145GtkWidget * vdw_box[2];
2146gchar * eval_vdw[6] = {"Lorentz-Berthelot", "Fender-Halsey", "Hogervorst",
2147 "Halgren HHG", "Tang-Toennies", "Functional"};
2148
2157G_MODULE_EXPORT void set_vdw_param (GtkEntry * res, gpointer data)
2158{
2159 int i;
2160 i = GPOINTER_TO_INT(data);
2161 const gchar * m = entry_get_text (res);
2162 double v = string_to_double ((gpointer)m);
2163 if (i == 1)
2164 {
2165 if (v > 0.0 && v != tmp_field -> vdw_opts[i])
2166 {
2167 tmp_field -> vdw_opts[i] = v;
2168 }
2169 else if (v < 0.0)
2170 {
2171 show_warning ("Cutoff must be > 0.0 &#xC5;", field_assistant);
2172 }
2173 }
2174 update_entry_double (GTK_ENTRY(res), tmp_field -> vdw_opts[i]);
2175}
2176
2185G_MODULE_EXPORT void set_vdw_mix (GtkComboBox * box, gpointer data)
2186{
2187 tmp_field -> vdw_opts[5] = combo_get_active ((GtkWidget *)box);
2188}
2189
2190#ifdef GTK4
2199G_MODULE_EXPORT void check_vdw (GtkCheckButton * but, gpointer data)
2200#else
2209G_MODULE_EXPORT void check_vdw (GtkToggleButton * but, gpointer data)
2210#endif
2211{
2212 int i, j;
2213 j = GPOINTER_TO_INT(data);
2214 i = button_get_status ((GtkWidget *)but);
2215 tmp_field -> vdw_opts[j] = (double)i;
2216 if (j == 0) widget_set_sensitive (vdw_box[0], i);
2217 if (j == 4) widget_set_sensitive (vdw_box[1], i);
2218}
2219
2225GtkWidget * create_vdws_box ()
2226{
2227 GtkWidget * vbox = create_vbox (BSEP);
2228 GtkWidget * hbox;
2229 gboolean val = (tmp_field -> vdw_opts[0] == 1.0) ? TRUE : FALSE;
2230 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, check_button("Evaluate Van der Waals interactions", -1, -1, val, G_CALLBACK(check_vdw), GINT_TO_POINTER(0)), FALSE, FALSE, 5);
2231 hbox = create_hbox(0);
2232 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2233 vdw_box[0] = create_vbox(5);
2234 gtk_box_set_homogeneous (GTK_BOX (vdw_box[0]), TRUE);
2236 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vdw_box[0], FALSE, FALSE, 50);
2237 hbox = create_hbox(5);
2238 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], hbox, FALSE, FALSE, 0);
2239 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Short range interaction cutoff:", 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2240 GtkWidget * entry = create_entry (G_CALLBACK(set_vdw_param), 100, 10, FALSE, GINT_TO_POINTER(1));
2241 update_entry_double (GTK_ENTRY(entry), tmp_field -> vdw_opts[1]);
2242 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2243 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2244
2245 hbox = create_hbox(5);
2246 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], hbox, FALSE, FALSE, 0);
2247 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button("Enforce direct calculation of van der Waals interactions", -1, -1, val, G_CALLBACK(check_vdw), GINT_TO_POINTER(2)), FALSE, FALSE, 5);
2248
2249 hbox = create_hbox(5);
2250 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], hbox, FALSE, FALSE, 0);
2251 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button("Apply force-shifting (contributions smoothly fall to zero near r<sub>cut</sub>)", -1, -1, val, G_CALLBACK(check_vdw), GINT_TO_POINTER(3)), FALSE, FALSE, 5);
2252
2253 hbox = create_hbox(5);
2254 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], hbox, FALSE, FALSE, 0);
2255 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button("Apply mixing rule (when needed and if possible generate cross species interactions)", -1, -1, val, G_CALLBACK(check_vdw), GINT_TO_POINTER(4)), FALSE, FALSE, 5);
2256 vdw_box[1] = create_vbox(5);
2257 val = (tmp_field -> vdw_opts[4] == 1.0) ? TRUE : FALSE;
2259 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], vdw_box[1], FALSE, FALSE, 0);
2260 hbox = create_hbox(5);
2261 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[1], hbox, FALSE, FALSE, 0);
2262 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("Mixing rule:", 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2263 GtkWidget * combo = create_combo();
2264 int i;
2265 for (i=0; i<6; i++)
2266 {
2267 combo_text_append(combo, eval_vdw[i]);
2268 }
2269 combo_set_active (combo, (int)tmp_field -> vdw_opts[5]);
2270 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_vdw_mix), NULL);
2271 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 10);
2272
2273 return vbox;
2274}
2275
2276#ifdef GTK4
2285G_MODULE_EXPORT void check_met (GtkCheckButton * but, gpointer data)
2286#else
2295G_MODULE_EXPORT void check_met (GtkToggleButton * but, gpointer data)
2296#endif
2297{
2298 int i, j;
2299 j = GPOINTER_TO_INT(data);
2300 i = button_get_status ((GtkWidget *)but);
2301 tmp_field -> met_opts[j] = (double)i;
2302}
2303
2309GtkWidget * create_metal_box ()
2310{
2311 GtkWidget * vbox = create_vbox (BSEP);
2312 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
2313 GtkWidget * hbox;
2314 gboolean val = (tmp_field -> met_opts[0] == 1.0) ? TRUE : FALSE;
2315 hbox = create_hbox(5);
2316 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2317 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button("Enforce direct calculation of metal interactions by explicit potentials, does not work with *EAM* potentials",
2318 -1, 25, val, G_CALLBACK(check_met), GINT_TO_POINTER(0)), FALSE, FALSE, 5);
2319 val = (tmp_field -> met_opts[1] == 1.0) ? TRUE : FALSE;
2320 hbox = create_hbox(5);
2321 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2322 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button("Switch the default embedding functions, <i>F</i>, from <i>F(&#x3c1;)</i> to <i>F(√&#x3c1;)</i>",
2323 -1, 25, val, G_CALLBACK(check_met), GINT_TO_POINTER(1)), FALSE, FALSE, 5);
2324 return vbox;
2325}
2326
2335G_MODULE_EXPORT void set_sys_param (GtkEntry * res, gpointer data)
2336{
2337 int i;
2338 i = GPOINTER_TO_INT(data);
2339 const gchar * m = entry_get_text (res);
2340 double v = string_to_double ((gpointer)m);
2341 if (i == 9)
2342 {
2343 if (v >= 1.0 && v != tmp_field -> sys_opts[i])
2344 {
2345 tmp_field -> sys_opts[i] = v;
2346 }
2347 else if (v < 1.0)
2348 {
2349 show_warning ("Subcelling threshold density must be &#8805; 1.0", field_assistant);
2350 }
2351 }
2352 else if (v >= 0.0 && v != tmp_field -> sys_opts[i])
2353 {
2354 tmp_field -> sys_opts[i] = v;
2355 }
2356 if (i > 10)
2357 {
2358 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> sys_opts[i]);
2359 }
2360 else
2361 {
2362 update_entry_double (GTK_ENTRY(res), tmp_field -> sys_opts[i]);
2363 }
2364}
2365
2366GtkWidget * sys_box[4];
2367gchar * sys_opts[10] = {"Relative dielectric constant &#949;<sub>r</sub>",
2368 "Allowed local variation of system density:",
2369 "Ignore the particle indices in CONFIG file",
2370 "Ignore strict checks, hide warnings and assume safe simulation parameters",
2371 "Skip detailed topology reporting during read of FIELD file in output",
2372 "Ignore center of mass removal during the calculation",
2373 "Set tolerance for relaxed shell model:",
2374 "Set the subcelling threshold density of particles per link cell:",
2375 "Create an expanded version of the current model:",
2376 "Restart calculation:"};
2377
2386G_MODULE_EXPORT void set_sys_restart (GtkComboBox * box, gpointer data)
2387{
2388 tmp_field -> sys_opts[15] = combo_get_active ((GtkWidget *)box);
2389}
2390
2391#ifdef GTK4
2400G_MODULE_EXPORT void check_sys (GtkCheckButton * but, gpointer data)
2401#else
2410G_MODULE_EXPORT void check_sys (GtkToggleButton * but, gpointer data)
2411#endif
2412{
2413 int i, k;
2414 i = GPOINTER_TO_INT(data);
2415 gboolean j = button_get_status ((GtkWidget *)but);
2416 tmp_field -> sys_opts[i] = (j) ? 1.0 : 0.0;
2417 if (i > 5)
2418 {
2419 k = i - 6;
2420 if (i == 14) k = 3;
2422 }
2423}
2424
2430GtkWidget * create_sys_box ()
2431{
2432 GtkWidget * vbox;
2433 GtkWidget * hbox, * hhbox;
2434 GtkWidget * entry;
2435 gboolean val;
2436 hhbox = create_hbox (5);
2437 vbox = create_vbox (5);
2438 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
2439 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, vbox, FALSE, FALSE, 10);
2440 int i, j, k;
2441 for (i=0; i<9; i++)
2442 {
2443 hbox = create_hbox(5);
2444 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2445 if (i < 2)
2446 {
2447 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(sys_opts[i], 300, -1, 0.0, 0.5), FALSE, FALSE, 5);
2448 entry = create_entry (G_CALLBACK(set_sys_param), 100, 10, FALSE, GINT_TO_POINTER(i));
2449 update_entry_double (GTK_ENTRY(entry), tmp_field -> sys_opts[i]);
2450 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2451 if (i) add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>%</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
2452 }
2453 else
2454 {
2455 j = (i < 7) ? i : (i == 7) ? 8 : 10;
2456 val = (tmp_field -> sys_opts[j] == 1.0) ? TRUE : FALSE;
2457 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button(sys_opts[i], -1, 25, val, G_CALLBACK(check_sys), GINT_TO_POINTER(i)), FALSE, FALSE, 5);
2458 if (i > 5)
2459 {
2460 sys_box[i-6] = create_hbox(5);
2461 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, sys_box[i-6], FALSE, FALSE, 0);
2463 if (i < 8)
2464 {
2465 entry = create_entry (G_CALLBACK(set_sys_param), 100, 10, FALSE, GINT_TO_POINTER(j+1));
2466 update_entry_double (GTK_ENTRY(entry), tmp_field -> sys_opts[j+1]);
2467 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sys_box[i-6], entry, FALSE, FALSE, 10);
2468 if (i == 6) add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sys_box[i-6], markup_label("<b>D &#xC5; ps<sup>-2</sup></b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
2469 }
2470 else
2471 {
2472 for (k=0; k<3; k++)
2473 {
2474 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sys_box[i-6], markup_label(imp_dir[k], 50, -1, 1.0, 0.5), FALSE, FALSE, 0);
2475 entry = create_entry (G_CALLBACK(set_sys_param), 50, 5, FALSE, GINT_TO_POINTER(j+k+1));
2476 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> sys_opts[j+k+1]);
2477 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sys_box[i-6], entry, FALSE, FALSE, 5);
2478 }
2479 }
2480 }
2481 }
2482 }
2483
2484 return hhbox;
2485}
2486
2493{
2494 GtkWidget * vbox = create_vbox (5);
2495 GtkWidget * hbox = create_hbox (0);
2496 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2497 gboolean val = (tmp_field -> sys_opts[14] == 1.0) ? TRUE : FALSE;
2498 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button(sys_opts[9], -1, 25, val, G_CALLBACK(check_sys), GINT_TO_POINTER(14)), FALSE, FALSE, 5);
2499 sys_box[3] = create_hbox(5);
2500 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, sys_box[3], FALSE, FALSE, 0);
2502 gchar * rtype[3]={"Continue current simulation",
2503 "Start new simulation from older run without temperature reset",
2504 "Start new simulation from older run with temperature reset"};
2505 GtkWidget * combo = create_combo();
2506 int i;
2507 for (i=0; i<3; i++) combo_text_append(combo, rtype[i]);
2508 combo_set_active (combo, (int)tmp_field -> sys_opts[15]);
2509 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_sys_restart), NULL);
2510 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sys_box[3], combo, FALSE, FALSE, 20);
2511 return vbox;
2512}
2513
2514
2522GtkWidget * vbox_control (int f)
2523{
2524 GtkWidget * vbox;
2525 vbox = create_vbox (5);
2526 switch (f)
2527 {
2528 case 0:
2529 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Global options:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2530 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_sys_box(), FALSE, FALSE, 0);
2531 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Restart options:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2532 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_restart_box(), FALSE, FALSE, 0);
2533 break;
2534 case 1:
2535 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Intra-molecular probability denisty function (PDF) analysis:</b>", 350, -1, 0.0, 0.5), FALSE, FALSE, 10);
2536 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_analyze_box(), FALSE, FALSE, 0);
2537 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Overall analysis:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 10);
2538 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_overall_box(), FALSE, FALSE, 0);
2539 break;
2540 case 2:
2541 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Van der Waals (Non-bonded short range):</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2542 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_vdws_box(), FALSE, FALSE, 0);
2543 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Electrostatics (Non-bonded long range):</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2544 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_electro_box(), FALSE, FALSE, 0);
2545 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Metallic interactions:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2546 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_metal_box(), FALSE, FALSE, 0);
2547 break;
2548 case 3:
2549 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Equilibration:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2550 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_equi_box(), FALSE, FALSE, 0);
2551 break;
2552 case 4:
2553 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Thermodynamics:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2554 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_ensemble_box(), FALSE, FALSE, 0);
2555 break;
2556 case 5:
2557 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Molecular dynamics:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2558 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_md_box(), FALSE, FALSE, 0);
2559 break;
2560 case 6:
2561 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Output information:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2562 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_out_box(), FALSE, FALSE, 10);
2563 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Trajectory file(s):</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2564 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_traj_box(), FALSE, FALSE, 10);
2565 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Restart file:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2566 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_dump_box(), FALSE, FALSE, 10);
2567 break;
2568 case 7:
2569 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Job options:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2570 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_job_box(), FALSE, FALSE, 0);
2571 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>I/O options:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2572 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_io_box(), FALSE, FALSE, 0);
2573 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<b>Other options:</b>", 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2574 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_misc_box(), FALSE, FALSE, 0);
2575 break;
2576 default:
2577 break;
2578 }
2579 return vbox;
2580}
2581
2582/*
2583 0: System options:
2584
2585 0 = Epsilon
2586 1 = Density variation
2587 2 = no index
2588 3 = no strict
2589 4 = no topology
2590 5 = no vafar
2591 6 = no vom
2592 7 = Set tolerance for rsm ...
2593 8 = ... rsm tolerance
2594 9 = Set subscelling threshold ...
2595 10 = ... subscelling threshold
2596 11 = Create expanded system ...
2597 12 = ... x ...
2598 13 = ... y ...
2599 14 = ... z
2600 15 = Restart calc ...
2601 16 = ... restart type
2602
2603
2604 1: Calc. options:
2605
2606 0 = All PDFs
2607 1 = All: every
2608 2 = All: ndelta
2609 3 = All: cutoff
2610 4 = Bonds PDFs
2611 5 = Bonds: every
2612 6 = Bonds: ndelta
2613 7 = Bonds: cutoff
2614 8 = Angles PDFs
2615 9 = Angles: every
2616 10 = Angles: ndelta
2617 11 = Dihedrals PDFs
2618 12 = Dihedrals: every
2619 13 = Dihedrals: ndelta
2620 14 = Inversions PDFs
2621 15 = Inversions: every
2622 16 = Inversions: ndelta
2623 17 = print pdfs
2624 18 = rdf
2625 19 = every n steps
2626 20 = bin size
2627 21 = print velocity autocorrelation functions
2628 22 = every n steps
2629 23 = print z-dens
2630 24 = every n steps
2631 25 = Job time
2632 26 = Job closure
2633
2634 2: Electro. stat options:
2635 0 = Evaluate (or not) electrostatics
2636 1 = Electrostatics evaluation method
2637 2 = Param 1
2638 3 = Param 2
2639 4 = Param 3
2640 5 = Param 4
2641
2642 3: Equil. options:
2643
2644 0 = Equil
2645 1 = Equi for n steps
2646 2 = Scale temp
2647 3 = Scale temp: every
2648 4 = cap forces
2649 5 = cap: force max
2650 6 = Resample
2651 7 = Resample: during
2652 8 = Minimize
2653 9 = Minimize: string
2654 10 = Minimize: target
2655 11 = Minimize: every
2656 12 = Optimize
2657 13 = Optimize: string
2658 14 = Optimize: target
2659 15 = zero temp MD
2660 16 = collect
2661
2662 4: Thermo options:
2663
2664 0 = Ensemble
2665 1 = Thermostat
2666 2 to 7 = Thermostat options
2667
2668 5: MD options
2669 0 = target temp
2670 1 = integrator
2671 2 = MD steps
2672 3 = Time step type
2673 4 = Time step
2674 5 = Max time step
2675 6 = Max dist. per time step
2676 7 = Min dist. per time step
2677 8 = Target pressure
2678 9 = shake limit
2679 10 = shake tol
2680 11 = FIQA lim
2681 12 = FIQA tol
2682
2683 17 = Initiate impact
2684 18 = particle index
2685 19 = MD step
2686 20 = impact energy
2687 21 = impact x direct
2688 22 = impact y direct
2689 23 = impact z direct
2690
2691 6: Output options:
2692
2693 0 = Write defects trajectory ...
2694 1 = ... start time to dump defects
2695 2 = ... time step to dump defects
2696 3 = ... site interstitial cutoff
2697 4 = write displacements trajectory ...
2698 5 = ... start time to dump displacements
2699 6 = ... time step to dump displacements
2700 7 = ... displacement qualifying cutoff
2701 8 = Write history/trajectory file ...
2702 9 = ... start time to dump trajectory
2703 10 = ... time step to dump trajectory
2704 11 = ... data level [0=coord, 1=0+velo, 2=1+forces]
2705 12 = Write MSDTMP file ...
2706 13 = ... start time to dump trajectory
2707 14 = ... time step to dump trajectory
2708 15 = print data ...
2709 16 = ... every n steps
2710 17 = accumulate stat ...
2711 18 = ... every n step(s)
2712 19 = set rolling avertage stack ...
2713 20 = ... to n time step(s)
2714 21 = Write RDFs ...
2715 22 = ... every n step(s)
2716 23 = ... bin size *
2717 24 = Write VAFs ...
2718 25 = ... every n step(s)
2719 26 = ... bin size
2720 27 = Write z-dens ...
2721 28 = ... every n step(s)
2722 29 = Ignore time average for VAFs
2723 30 = Dump restart every n step(s)
2724*/
2725
Binding to the Fortran90 subroutines.
Callback declarations for main window.
GtkWidget * thermo_box()
create the thermostat configuration widgets
Definition cpmd_nose.c:1884
float val
Definition dlp_init.c:117
gchar * eval_vdw[6]
GtkWidget * create_md_box()
CONTROL file create molecular dynamics parameter widgets.
GtkWidget * nvs_check[2]
GtkWidget * o_vbox
gchar * tps_info[2]
gchar * dt_unit[3]
GtkWidget * create_traj_box()
CONTROL file create MD trajectory parameter widgets.
GtkWidget * create_job_box()
CONTROL file create job parameter vidgets.
G_MODULE_EXPORT void set_out_param(GtkEntry *res, gpointer data)
CONTROL file update output information parameter entry callback.
#define DLP_ENS
gchar * equi_minu[3]
int md_ens_opt[DLP_ENS][DLP_ENS_TYPE]
GtkWidget * nvs_unit
GtkWidget * create_electro_box()
CONTROL file create electrostatic interactions parameter vidgets.
gchar * opts_nvt[9][3]
GtkWidget * out_hbox[11]
G_MODULE_EXPORT void set_md_combo(GtkComboBox *box, gpointer data)
CONTROL file change MD parameter.
GtkWidget * nvs_label
GtkWidget * o_ent_vbox
GtkWidget * e_vbox
gchar * io_para[4]
gchar * md_unit[6]
GtkWidget * time_box[2]
GtkWidget * create_vdws_box()
CONTROL file create VdW parameter vidgets.
G_MODULE_EXPORT void set_print_level(GtkComboBox *box, gpointer data)
CONTROL file change print level.
G_MODULE_EXPORT void set_io_method(GtkComboBox *box, gpointer data)
CONTROL file change I/O method.
gchar * traj_info[4][3]
gchar * md_data[6]
GtkWidget * io_hp[2][4]
GtkWidget * create_equi_box()
CONTROL file create equilibration parameter widgets.
G_MODULE_EXPORT void show_impact_dialog(GtkButton *but, gpointer data)
CONTROL file particle impact - creating the dialog.
gchar * out_print[3]
G_MODULE_EXPORT void set_elec_param(GtkEntry *res, gpointer data)
CONTROL file update electrostatic interactions parameter entry callback.
G_MODULE_EXPORT void set_vdw_param(GtkEntry *res, gpointer data)
CONTROL file udpate VdW parameter entry callback.
G_MODULE_EXPORT void check_sys(GtkToggleButton *but, gpointer data)
change CONTROL file system option toggle callback GTK3
GtkWidget * impact_but
GtkWidget * create_thermo_box(int ensemble)
CONTROL file create thermostat box parameters.
gchar * ana_param[3]
gchar * equi_data[5]
GtkWidget * check_nvs_butt[4]
GtkWidget * check_e[2]
gchar * equi_min[3]
GtkWidget * pres_spin
G_MODULE_EXPORT void set_thermo_param(GtkEntry *res, gpointer data)
CONTROL file thermostat update parameter entry callback.
gchar * io_pres[2]
gchar * io_type[2]
G_MODULE_EXPORT void check_elec(GtkToggleButton *but, gpointer data)
change CONTROL file electrostatics option toggle callback GTK3
G_MODULE_EXPORT void set_equi_param(GtkEntry *res, gpointer data)
CONTROL file update equilibration parameter entry callback.
GtkWidget * sys_box[4]
gchar * time_info[2]
gchar * unit_npt_nvs[2][3]
G_MODULE_EXPORT void set_md_param(GtkEntry *res, gpointer data)
CONTROL file update MD parameter entry callback.
gchar * extra_nvs[4]
gchar * io_rw_m[4]
gchar * celets[MAXDATC]
GtkWidget * create_dump_box()
CONTROL file create dump parameter widgets.
G_MODULE_EXPORT void check_semi(GtkToggleButton *but, gpointer data)
CONTROL file thermostat change parameter toggle callback GTK3.
GtkWidget * extra_lab[4]
G_MODULE_EXPORT void check_io(GtkToggleButton *but, gpointer data)
CONTROL file change I/O parameter toggle callback GTK3.
GtkWidget * io_box[2]
GtkWidget * create_elec_param_box()
CONTROL file create electrostatic interactions parameter box.
G_MODULE_EXPORT void check_ana(GtkToggleButton *but, gpointer data)
CONTROL file change analysis parameter toggle callback GTK3.
G_MODULE_EXPORT void set_elec_eval(GtkComboBox *box, gpointer data)
CONTROL file change electrostatics evaluation method.
GtkWidget * create_overall_box()
CONTROL file create overall parameter widgets.
gchar * md_extra[2][4]
ColRGBA init_color(int id, int numid)
initialize color based id number over total number of elements
Definition initcoord.c:81
gchar * traj_level[3]
G_MODULE_EXPORT void set_equi_combo(GtkComboBox *box, gpointer data)
CONTROL file change equilibration parameter.
G_MODULE_EXPORT void check_met(GtkToggleButton *but, gpointer data)
change CONTROL file metal interactions toggle callback GTK3
G_MODULE_EXPORT void check_nvs(GtkToggleButton *but, gpointer data)
CONTROL file thermostat change parameter toggle callback GTK3.
gchar * out_info[3]
GtkWidget * ens_box
gchar * out_data[3]
GtkWidget * create_out_box()
CONTROL file create output information widgets.
G_MODULE_EXPORT void set_vdw_mix(GtkComboBox *box, gpointer data)
CONTROL file change VdW mixing rule.
GtkWidget * out_entry[3]
gchar * md_thermo[DLP_ENS_TYPE]
gchar * sys_opts[10]
GtkWidget * bath_box
GtkWidget * equi_entry[3]
G_MODULE_EXPORT void set_io_param(GtkEntry *res, gpointer data)
CONTROL file update I/O parameter entry callback.
GtkWidget * extra_vbox[2]
GtkWidget * thermo_option_box
gchar * eval_m[10]
float init_minop[3]
gchar * imp_dir[3]
G_MODULE_EXPORT void check_equi(GtkToggleButton *but, gpointer data)
CONTROL file change equilibration parameter toggle callback GTK3.
G_MODULE_EXPORT void set_order(GtkComboBox *box, gpointer data)
CONTROL file change thermostat order.
GtkWidget * io_pre
GtkWidget * equi_lab[6]
GtkWidget * create_ensemble_box()
CONTROL file create thermodynamic ensemble parameter widgets.
GtkWidget * equi_box[9]
G_MODULE_EXPORT void check_impact(GtkToggleButton *but, gpointer data)
CONTROL file particle impact change parameter toggle callback GTK3.
GtkWidget * nvs_entry
GtkWidget * create_thermo_options(int ensemble, int thermo)
CONTROL file create thermostat option box.
GtkWidget * create_io_box()
CONTROL file create I/O parameter vidgets.
G_MODULE_EXPORT void check_vdw(GtkToggleButton *but, gpointer data)
change CONTROL file VdW option toggle callback GTK3
G_MODULE_EXPORT void set_thermostat(GtkComboBox *box, gpointer data)
CONTROL file change thermostat option.
gchar * dt_data[3]
G_MODULE_EXPORT void set_ana_param(GtkEntry *res, gpointer data)
CONTROL file update analysis parameter entry callback.
G_MODULE_EXPORT void set_sys_param(GtkEntry *res, gpointer data)
update CONTROL file system option parameter entry callback
GtkWidget * misc_box
gchar * celemts[MAXDATC]
gchar * equi_unit[3]
G_MODULE_EXPORT void adjust_precision(GtkSpinButton *res, gpointer data)
CONTROL file update electrostatic interactions precision spin callback.
double equi_lim[2][3]
GtkWidget * vbox_control(int f)
crerate DL-POLY option widgets
GtkWidget * elec_box[4]
gchar * extra_unit[4]
GtkWidget * create_sys_box()
prepare the DL-POLY CONTROL file system options widgets
gboolean print_ana()
determine if the analysis information section is required
Definition dlp_print.c:1674
gchar * unit_nvt[9][3]
G_MODULE_EXPORT void show_advance_time_step(GtkButton *but, gpointer data)
CONTROL file advanced time step - creating the dialog.
gchar * md_combo[2][2]
GtkWidget * vdw_box[2]
gchar * md_ensemble[DLP_ENS]
G_MODULE_EXPORT void set_sys_restart(GtkComboBox *box, gpointer data)
change CONTROL file system option
G_MODULE_EXPORT void set_ensemble(GtkComboBox *box, gpointer data)
CONTROL file change thermodynamic ensemble parameter.
GtkWidget * ana_box[5]
#define DLP_ENS_TYPE
gchar * traj_data[4]
gchar * equi_info[8]
GtkWidget * create_misc_box()
CONTROL file create miscalleanous parameter vidgets.
gchar * io_info[2]
GtkWidget * create_analyze_box()
CONTROL file create analysis parameter widgets.
gchar * opts_npt_nvs[2][3]
GtkWidget * create_metal_box()
create CONTROL file metal interaction widgets
GtkWidget * create_restart_box()
prepare the DL-POLY CONTROL file restart widgets
G_MODULE_EXPORT void check_out(GtkToggleButton *but, gpointer data)
CONTROL file change output information parameter toggle callback GTK3.
gchar * ana_info[5]
GtkWidget * step_button
project * tmp_proj
Definition dlp_field.c:953
GtkWidget * field_assistant
Definition dlp_field.c:940
classical_field * tmp_field
Definition dlp_field.c:951
Variable declarations for the creation of the DL_POLY input file(s)
double string_to_double(gpointer string)
convert string to double
Definition global.c:624
void run_this_gtk_dialog(GtkWidget *dial, GCallback handler, gpointer data)
run a GTK (3 and 4) basic GtkDialog
Definition gtk-misc.c:501
@ IMG_NONE
Definition global.h:262
int combo_get_active(GtkWidget *combo)
retrieve the active item's position
Definition gtk-misc.c:909
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1375
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
Definition gtk-misc.c:643
GtkWidget * dialogmodal(gchar *str, GtkWindow *parent)
Create a new dialog modal window.
Definition gtk-misc.c:520
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:932
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:607
#define BSEP
Definition global.h:247
void update_entry_int(GtkEntry *entry, int intval)
update the content of a GtkEntry as int
Definition gtk-misc.c:624
GtkWidget * radio_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a radio button
Definition gtk-misc.c:1926
GtkWidget * spin_button(GCallback handler, double value, double start, double end, double step, int digits, int dim, gpointer data)
create a spin button
Definition gtk-misc.c:1833
GtkWidget * check_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a check button
Definition gtk-misc.c:1893
GtkWidget * create_button(gchar *text, int image_format, gchar *image, int dimx, int dimy, int relief, GCallback handler, gpointer data)
create a simple button
Definition gtk-misc.c:1955
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
Definition gtk-misc.c:984
GtkWidget * dialog_get_content_area(GtkWidget *widg)
prepare GtkWidget to insert content in a GtkDialog window
Definition gtk-misc.c:835
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1646
void add_box_child_start(int orientation, GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the initial position.
Definition gtk-misc.c:308
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:215
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:823
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:961
G_MODULE_EXPORT void run_destroy_dialog(GtkDialog *dialog, gint response_id, gpointer data)
to destroy a GtkDialog when the dialog emit the closing signal
Definition gtk-misc.c:2237
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2169
void add_box_child_end(GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the end position.
Definition gtk-misc.c:286
void update_entry_text(GtkEntry *entry, gchar *text)
update the content of a GtkEntry as string
Definition gtk-misc.c:681
#define min(a, b)
Definition global.h:81
#define MAXDATC
Number of tabs for the description of the classical calculation.
Definition global.h:698
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:811
int button_get_status(GtkWidget *button)
get status of check / toggle button
Definition gtk-misc.c:1855
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:182
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
Function declarations for the creation of the OpenGL window.
void show_warning(char *warning, GtkWidget *win)
show warning
Definition interface.c:260
Messaging function declarations.
Function declarations for reading atomes project file Function declarations for saving atomes proje...
Definition glwin.h:351
GtkWidget * res[2]
Definition w_encode.c:212
GtkWidget * hbox
Definition workspace.c:71
GtkWidget * vbox
Definition workspace.c:72