atomes 1.3.2
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-2026 by CNRS and University of Strasbourg */
15
21
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] = {i18n("System information"),
113 i18n("Calculation details"),
114 i18n("Non-bonded interactions"),
115 i18n("Equilibration"),
116 i18n("Thermodynamics"),
117 i18n("Molecular dynamics"),
118 i18n("Output options"),
119 i18n("Computational details")};
120
121#define DLP_ENS 4
122#define DLP_ENS_TYPE 10
123gchar * md_ensemble[DLP_ENS] = {"NVE", "NVT", "NPT", "NST"};
124gchar * md_thermo[DLP_ENS_TYPE] = {"Evans",
125 "Langevin",
126 "Andersen",
127 "Berendsen",
128 "Nosë-Hoover",
129 i18n("Gentle Stochastic"),
130 "DPD",
131 "Martyna-Tuckerman-Klein",
132 i18n("Two temperature model"),
133 i18n("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 {i18n("Relaxation speed constant (friction):"), NULL, NULL},
143 {i18n("Relaxation time:"), i18n("Softness [0.0 - 1.0]:"), NULL},
144 {i18n("Relaxation constant:"), NULL, NULL},
145 {i18n("Relaxation constant:"), NULL, NULL},
146 {i18n("Relaxation constant:"), i18n("Langevin friction:"), NULL},
147 {i18n("Shardlow's splitting order:"), i18n("Global drag coefficient:"), NULL},
148 {i18n("Relaxation constant:"), i18n("Enhancement of relaxation constant:"), i18n("Cut-off particle velocity for friction enhancement:")},
149 {i18n("Relaxation constant:"), i18n("Enhancement of relaxation constant:"), i18n("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] = {{i18n("Thermostat relaxation speed constant (friction):"), i18n("Barostat relaxation speed constant (friction):"), NULL},
162 {i18n("Thermostat relaxation time:"), i18n("Barostat relaxation time:"), i18n("Target surface tension:")}};
163
164gchar * unit_npt_nvs[2][3] = {{"<b>ps<sup>-1</sup></b>", "<b>ps<sup>-1</sup></b>", NULL},
165 {"<b>ps</b>", "<b>ps</b>", "<b>dyn cm<sup>-1</sup></b>"}};
166
167gchar * extra_nvs[4] = {i18n("Standard"), i18n("Area"), i18n("Tension"), i18n("Orthorhombic")};
168
169GtkWidget * check_nvs_butt[4];
170GtkWidget * nvs_label;
171GtkWidget * nvs_entry;
172GtkWidget * nvs_unit;
173GtkWidget * nvs_check[2];
174GtkWidget * o_ent_vbox;
175GtkWidget * o_vbox;
176GtkWidget * e_vbox;
177GtkWidget * ens_box;
178GtkWidget * bath_box;
180
189G_MODULE_EXPORT void set_order (GtkComboBox * box, gpointer data)
190{
191 tmp_field -> thermo_opts[0] = combo_get_active ((GtkWidget *)box);
192}
193
202G_MODULE_EXPORT void set_thermo_param (GtkEntry * res, gpointer data)
203{
204 int i;
205 i = GPOINTER_TO_INT(data);
206 const gchar * m = entry_get_text (res);
207 double v = string_to_double ((gpointer)m);
208 if (i == 9)
209 {
210 if ((v == 0.0 || v >= 1.0) && v != tmp_field -> thermo_opts[i])
211 {
212 tmp_field -> thermo_opts[i] = v;
213 }
214 else if (v < 1.0 && v != 0.0)
215 {
216 show_warning (_("Target temperature for the pseudo bath must be &#8805; 1.0 K,\n"
217 "Alternatively set value to 0.0 K to system temperature."), field_assistant);
218 }
219 }
220 else if (v >= 0.0 && v != tmp_field -> thermo_opts[i])
221 {
222 tmp_field -> thermo_opts[i] = v;
223 }
224 update_entry_double(res, tmp_field -> thermo_opts[i]);
225}
226
227#ifdef GTK4
236G_MODULE_EXPORT void check_nvs (GtkCheckButton * but, gpointer data)
237#else
246G_MODULE_EXPORT void check_nvs (GtkToggleButton * but, gpointer data)
247#endif
248{
249 int i, j;
250 i = GPOINTER_TO_INT(data);
251 tmp_field -> thermo_opts[3] = (double) i;
252 for (j=0; j<2; j++)
253 {
255 }
256 for (j=0; j<4; j++)
257 {
258 if (j != i)
259 {
260 if (j == 2)
261 {
262 update_entry_text (GTK_ENTRY(nvs_entry), "");
266 }
267 }
268 else if (j == i && i == 2)
269 {
273 update_entry_double (GTK_ENTRY(nvs_entry), 0.0);
274 tmp_field -> thermo_opts[4] = 0.0;
276 }
277 else if (j == i && i == 3)
278 {
280 }
281 }
282}
283
284#ifdef GTK4
293G_MODULE_EXPORT void check_semi (GtkCheckButton * but, gpointer data)
294#else
303G_MODULE_EXPORT void check_semi (GtkToggleButton * but, gpointer data)
304#endif
305{
306 int i = GPOINTER_TO_INT(data);
307 gboolean j = button_get_status ((GtkWidget *)but);
308 tmp_field -> thermo_opts[i] = j;
309 if (i == 6) widget_set_sensitive (bath_box, j);
310}
311
320GtkWidget * create_thermo_options (int ensemble, int thermo)
321{
322 GtkWidget * vbox = create_vbox (5);
323 GtkWidget * hbox;
324 GtkWidget * entry;
325 gboolean val;
326 int i, j;
327 switch (ensemble)
328 {
329 case 1:
330 for (i=0; i<3; i++)
331 {
332 if (opts_nvt[thermo][i] != NULL)
333 {
334 hbox = create_hbox (5);
335 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(opts_nvt[thermo][i]), 375, -1, 1.0, 0.5), FALSE, FALSE, 50);
336 if (thermo == 6 && i == 0)
337 {
338 GtkWidget * o_combo = create_combo();
339 combo_text_append (o_combo, "s1");
340 combo_text_append (o_combo, "s2");
341 combo_set_active (o_combo, (int)tmp_field -> thermo_opts[i]);
342 g_signal_connect (G_OBJECT (o_combo), "changed", G_CALLBACK(set_order), NULL);
343 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, o_combo, FALSE, FALSE, 5);
344 }
345 else
346 {
347 entry = create_entry(G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(i));
348 update_entry_double (GTK_ENTRY(entry), tmp_field -> thermo_opts[i]);
349 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
350 }
351 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);
352 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
353 }
354 }
355 break;
356 default:
357 for (i=0; i<2; i++)
358 {
359 hbox = create_hbox (5);
360 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(opts_npt_nvs[(thermo) ? 1 : 0][i]), 410, -1, 1.0, 0.5), FALSE, FALSE, 50);
361 entry = create_entry(G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(i));
362 update_entry_double (GTK_ENTRY(entry), tmp_field -> thermo_opts[i]);
363 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
364 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);
365 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
366 }
367 if (ensemble == 3)
368 {
369 GtkWidget * hhbox = create_hbox (0);
370 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hhbox, FALSE, FALSE, 0);
371 GtkWidget * vvbox = create_vbox (5);
372 add_box_child_start (GTK_ORIENTATION_VERTICAL, hhbox, vvbox, FALSE, FALSE, 50);
373 gtk_box_set_homogeneous (GTK_BOX (vvbox), TRUE);
374 for (i=0; i<4; i++)
375 {
376 hbox = create_hbox (5);
377 val = ((int)tmp_field -> thermo_opts[3] == i) ? TRUE : FALSE;
378#ifdef GTK4
379 check_nvs_butt[i] = check_button (_(extra_nvs[i]), 100, -1, val, G_CALLBACK(check_nvs), GINT_TO_POINTER(i));
380 if (i)
381 {
382 gtk_check_button_set_group ((GtkCheckButton *) check_nvs_butt[i], (GtkCheckButton *)check_nvs_butt[0]);
383 }
384#else
385 if (! i)
386 {
387 check_nvs_butt[i] = radio_button (_(extra_nvs[i]), 100, -1, val, G_CALLBACK(check_nvs), GINT_TO_POINTER(i));
388 }
389 else
390 {
391 check_nvs_butt[i] = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(check_nvs_butt[0]), _(extra_nvs[i]));
392 g_signal_connect (G_OBJECT(check_nvs_butt[i]), "toggled", G_CALLBACK(check_nvs), GINT_TO_POINTER(i));
393 }
394#endif
395 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_nvs_butt[i], FALSE, FALSE, 20);
396 if (i == 2)
397 {
398 nvs_label = markup_label(_(opts_npt_nvs[1][2]), 150, -1, 0.0, 0.5);
400 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_label, FALSE, FALSE, 0);
401 j = 4;
402 nvs_entry = create_entry(G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(j));
404 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_entry, FALSE, FALSE, 10);
405 if (val) update_entry_double (GTK_ENTRY(nvs_entry), tmp_field -> thermo_opts[4]);
406 nvs_unit = markup_label(unit_npt_nvs[1][2], 50, -1, 0.0, 0.5);
408 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_unit, FALSE, FALSE, 0);
409 }
410 if (i > 1)
411 {
412 val = (((int)tmp_field -> thermo_opts[3] == i) && tmp_field -> thermo_opts[5] == 1.0) ? TRUE : FALSE;
413 nvs_check[i-2] = check_button(_("Semi-anisotropic constraint"), 200, -1, val, G_CALLBACK(check_semi), GINT_TO_POINTER(5));
415 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_check[i-2], FALSE, FALSE, 10);
416 }
417 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, hbox, FALSE, FALSE, 0);
418 }
419#ifdef GTK3
420 gtk_toggle_button_set_active ((GtkToggleButton *)check_nvs_butt[(int)tmp_field -> thermo_opts[3]], TRUE);
421#endif // GTK3
422 }
423 break;
424 }
425 return vbox;
426}
427
436G_MODULE_EXPORT void set_thermostat (GtkComboBox * box, gpointer data)
437{
438 int i, j;
439 i = GPOINTER_TO_INT(data);
440 switch (i)
441 {
442 case 0:
443 tmp_field -> thermostat = combo_get_active ((GtkWidget *)box);
444 for (j=0; j<6; j++) tmp_field -> thermo_opts[j] = 0.0;
445 if (tmp_field -> ensemble)
446 {
449 add_box_child_start (GTK_ORIENTATION_VERTICAL, o_vbox, o_ent_vbox, FALSE, FALSE, 0);
451 }
452 break;
453 case 1:
454 tmp_field -> thermo_opts[7] = combo_get_active ((GtkWidget *)box);
455 break;
456 }
457}
458
466GtkWidget * create_thermo_box (int ensemble)
467{
468 GtkWidget * vbox = create_vbox (5);
469 GtkWidget * hbox = create_hbox (5);
470 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
471 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Thermostat:"), 100, -1, 0.0, 0.5), FALSE, FALSE, 30);
472 GtkWidget * thermo_box = create_combo();
473 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, thermo_box, FALSE, FALSE, 0);
474 int i;
475 for (i=0; i<DLP_ENS_TYPE; i++)
476 {
477 if (md_ens_opt[ensemble][i])
478 {
479 combo_text_append (thermo_box, (i == 5 || i == 8 || i == 9) ? _(md_thermo[i]) : md_thermo[i]);
480 }
481 }
483 g_signal_connect (G_OBJECT (thermo_box), "changed", G_CALLBACK(set_thermostat), GINT_TO_POINTER(0));
484 if (ensemble)
485 {
487 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, o_vbox, FALSE, FALSE, 0);
489 add_box_child_start (GTK_ORIENTATION_VERTICAL, o_vbox, o_ent_vbox, FALSE, FALSE, 0);
490 }
491 return vbox;
492}
493
502G_MODULE_EXPORT void set_ensemble (GtkComboBox * box, gpointer data)
503{
504 int i;
505 if (tmp_field -> ensemble)
506 {
507 for (i=0; i<4; i++)
508 {
510 }
512 }
513 tmp_field -> ensemble = combo_get_active ((GtkWidget *)box);
514 tmp_field -> thermostat = 0;
515
516 for (i=0; i<6; i++) tmp_field -> thermo_opts[i] = 0.0;
517 if (tmp_field -> ensemble)
518 {
521 add_box_child_start (GTK_ORIENTATION_VERTICAL, ens_box, thermo_option_box, FALSE, FALSE, 0);
522 }
523}
524
531{
532 GtkWidget * vbox = create_vbox (5);
533 GtkWidget * hbox = create_hbox (5);
534 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
535 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Ensemble:"), 100, -1, 0.0, 0.5), FALSE, FALSE, 30);
536 GtkWidget * ensemble = create_combo ();
537 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ensemble, FALSE, FALSE, 0);
538 int i;
539 for (i=0; i<DLP_ENS; i++)
540 {
541 combo_text_append (ensemble, md_ensemble[i]);
542 }
543 combo_set_active (ensemble, tmp_field -> ensemble);
544 g_signal_connect (G_OBJECT (ensemble), "changed", G_CALLBACK(set_ensemble), NULL);
545
547 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, ens_box, FALSE, FALSE, 0);
548 if (tmp_field -> ensemble)
549 {
551 add_box_child_start (GTK_ORIENTATION_VERTICAL, ens_box, thermo_option_box, FALSE, FALSE, 0);
552 }
553 gtk_widget_set_size_request (vbox, -1, 390);
554
555 gboolean val = (tmp_field -> thermo_opts[6] == 1.0) ? TRUE : FALSE;
556 bath_box = create_hbox (5);
557 add_box_child_end (vbox, bath_box, FALSE, FALSE, 0);
558 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);
560 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label(_("Thermostat type:"), 150, -1, 0.0, 0.5), FALSE, FALSE, 0);
561 GtkWidget * combo = create_combo();
562 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, combo, FALSE, FALSE, 00);
563 combo_text_append (combo, _("Langevin + Direct"));
564 combo_text_append (combo, "Langevin");
565 combo_text_append (combo, "Gauss");
566 combo_text_append (combo, _("Direct"));
567 combo_set_active (combo, (int)tmp_field -> thermo_opts[7]);
568 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_thermostat), GINT_TO_POINTER(1));
569 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label(_("Thickness:"), 100, -1, 1.0, 0.5), FALSE, FALSE, 0);
570 GtkWidget * entry = create_entry(G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(8));
571 update_entry_double (GTK_ENTRY(entry), tmp_field -> thermo_opts[8]);
572 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, entry, FALSE, FALSE, 5);
573 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label("<b>&#xC5;</b>", 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
574 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label(_("Target T°:"), 100, -1, 1.0, 0.5), FALSE, FALSE, 0);
575 entry = create_entry (G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(9));
576 update_entry_double (GTK_ENTRY(entry), tmp_field -> thermo_opts[9]);
577 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, entry, FALSE, FALSE, 5);
578 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label("<b>K</b>", 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
579 return vbox;
580}
581
582GtkWidget * step_button;
583GtkWidget * extra_vbox[2];
584GtkWidget * extra_lab[4];
585gchar * md_data[6] = {i18n("Target temperature:"), i18n("Verlet integrator:"), i18n("Number of steps:"), i18n("Time step δt:"), i18n("Target pressure:"), ""};
586gchar * md_extra[2][4] = {{i18n("Shake iterations limit:"), i18n("Shake tolerance:"), "", ""},
587 {i18n("Rattle iterations limit:"), i18n("Rattle tolerance:"), i18n("FIQA iterations limit:"), i18n("FIQA quaternions tolerance:")}};
588gchar * md_unit[6] = {"<b>K</b>", "", "", "<b>ps</b>", "<b>katms</b>", ""};
589gchar * extra_unit[4] = {i18n("<b>cycle(s)</b>"), "", i18n("<b>cycle(s)</b>"), ""};
590gchar * dt_data[3] = {i18n("Maximum time step:"), i18n("Maximum distance allowed:"), i18n("Minimum distance allowed:")};
591gchar * dt_unit[3] = {"<b>ps</b>", "<b>&#xC5;</b>", "<b>&#xC5;</b>"};
592gchar * md_combo[2][2] = {{i18n("Velocity"), i18n("Leapfrog")}, {i18n("Fixed"), i18n("Variable")}};
593
602G_MODULE_EXPORT void set_md_param (GtkEntry * res, gpointer data)
603{
604 int i;
605 i = GPOINTER_TO_INT(data);
606 const gchar * m = entry_get_text (res);
607 double v = string_to_double ((gpointer)m);
608 if (i == 14)
609 {
610 if (v >= 1.0 && v <= tmp_proj -> natomes)
611 {
612 tmp_field -> md_opts[i] = v;
613 }
614 }
615 else if (v >= 0.0 && v != tmp_field -> md_opts[i])
616 {
617 tmp_field -> md_opts[i] = v;
618 }
619 if (i == 2 || i == 9 || i == 11 || i == 14 || i == 15)
620 {
621 update_entry_int (res, (int)tmp_field -> md_opts[i]);
622 }
623 else
624 {
625 update_entry_double (res, tmp_field -> md_opts[i]);
626 }
627}
628
637G_MODULE_EXPORT void show_advance_time_step (GtkButton * but, gpointer data)
638{
639 GtkWidget * dialog = dialogmodal (_("Variable time step information"), GTK_WINDOW(field_assistant));
640 GtkWidget * vbox = dialog_get_content_area (dialog);
641 GtkWidget * hbox;
642 GtkWidget * entry;
643 int i, j;
644 i = 6;
645 for (j=0; j<3; j++)
646 {
647 hbox = create_hbox (0);
648 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 2);
649 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(dt_data[j]), 250, -1, 1.0, 0.5), FALSE, FALSE, 5);
650 entry = create_entry (G_CALLBACK(set_md_param), 100, 10, FALSE, GINT_TO_POINTER(i+j));
651 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[i+j]);
652 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
653 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(dt_unit[j], 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
654 }
655 run_this_gtk_dialog (dialog, G_CALLBACK(run_destroy_dialog), NULL);
656}
657
666G_MODULE_EXPORT void set_md_combo (GtkComboBox * box, gpointer data)
667{
668 int i, j;
669 i = GPOINTER_TO_INT(data);
670 tmp_field -> md_opts[i] = combo_get_active ((GtkWidget *)box);
671 if (i == 3) widget_set_sensitive (step_button, (int)tmp_field -> md_opts[i]);
672 if (i == 3 && tmp_field -> md_opts[i] == 1.0) show_advance_time_step (NULL, NULL);
673 if (i == 1)
674 {
675 gtk_widget_set_visible (extra_vbox[1], (int)tmp_field -> md_opts[1]);
676 for (j=0 ;j<2; j++)
677 {
678 gtk_label_set_text (GTK_LABEL(extra_lab[2*j]),
679 ((int)tmp_field -> md_opts[i] || 2*j < 2) ? _(md_extra[(int)tmp_field -> md_opts[i]][2*j]) : md_extra[(int)tmp_field -> md_opts[i]][2*j]);
680 gtk_label_set_text (GTK_LABEL(extra_lab[2*j+1]),
681 ((int)tmp_field -> md_opts[i] || 2*j+1 < 2) ? _(md_extra[(int)tmp_field -> md_opts[i]][2*j+1]) : md_extra[(int)tmp_field -> md_opts[i]][2*j+1]);
682 }
683 }
684}
685
686GtkWidget * impact_but;
687gchar * imp_dir[3] = {"x", "y", "z"};
688
689#ifdef GTK4
698G_MODULE_EXPORT void check_impact (GtkCheckButton * but, gpointer data)
699#else
708G_MODULE_EXPORT void check_impact (GtkToggleButton * but, gpointer data)
709#endif
710{
711 gboolean i = button_get_status ((GtkWidget *)but);
712 tmp_field -> md_opts[13] = (i) ? 1.0 : 0.0;
714}
715
724G_MODULE_EXPORT void show_impact_dialog (GtkButton * but, gpointer data)
725{
726 GtkWidget * dialog = dialogmodal (_("Initiate impact on particle"), GTK_WINDOW(field_assistant));
727 GtkWidget * vbox = dialog_get_content_area (dialog);
728 GtkWidget * hbox, * hhbox;
729 GtkWidget * entry;
730 int i, j;
731 gchar * str;
732 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
733 gchar * imp_info[4] = {i18n("Index of the particle to impact: "), i18n("Time step of impact:"), i18n("Energy of impact:"), i18n("Direction (from center of mass):")};
734 gchar * imp_unit[2] = {i18n("<b>n<sup>th</sup> step</b>"), "<b>k eV</b>"};
735
736 for (i=0; i<4; i++)
737 {
738 hbox = create_hbox (5);
739 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 2);
740 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(imp_info[i]), 200, -1, 1.0, 0.5), FALSE, FALSE, 5);
741 if (i < 3)
742 {
743 j = (i < 2) ? 5 : 10;
744 entry = create_entry (G_CALLBACK(set_md_param), j*10, j + j/6, FALSE, GINT_TO_POINTER(i+14));
745 if (i < 2)
746 {
747 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> md_opts[i+14]);
748 }
749 else
750 {
751 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[i+14]);
752 }
753 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
754 if (! i)
755 {
756 str = g_strdup_printf ("<b>∈ [1-%d]</b>", tmp_proj -> natomes);
757 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(str, 30, -1, 0.0, 0.5), FALSE, FALSE, 0);
758 g_free (str);
759 }
760 else
761 {
762 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label((i-1) ? imp_unit[i-1] : _(imp_unit[i-1]), 30, -1, 0.0, 0.5), FALSE, FALSE, 0);
763 }
764 }
765 else
766 {
767 hbox = create_hbox (5);
768 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 2);
769 hhbox = create_hbox (5);
770 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 50);
771 for (j=0; j<3; j++)
772 {
773 str = g_strdup_printf (_("on %s:"), imp_dir[j]);
774 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(str, 50, -1, 1.0, 0.5), FALSE, FALSE, 0);
775 g_free (str);
776 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(j+17));
777 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[j+17]);
778 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, entry, FALSE, FALSE, 5);
779
780 }
781 }
782 }
783 run_this_gtk_dialog (dialog, G_CALLBACK(run_destroy_dialog), NULL);
784}
785
791GtkWidget * create_md_box ()
792{
793 GtkWidget * vbox = create_vbox (BSEP);
794 gtk_widget_set_size_request (vbox, -1, 450);
795 GtkWidget * hbox;
796 GtkWidget * combo;
797 GtkWidget * entry;
798 int i, j, k, l;
799 l = 0;
800 for (i=0; i<3; i++)
801 {
802 hbox = create_hbox (5);
803 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
804 for (j=0; j<2; j++, l++)
805 {
806 k = (j) ? 110 : 150;
807 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox,
808 markup_label((2*i+j) < 5 ? _(md_data[2*i+j]) :md_data[2*i+j], k, -1, 1.0, 0.5),
809 FALSE, FALSE, 5);
810 if (j)
811 {
812 if (i < 2)
813 {
814 combo = create_combo ();
815 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 0);
816 for (k=0; k<2; k++)
817 {
818 combo_text_append (combo, _(md_combo[i][k]));
819 }
820 combo_set_active (combo, 0);
821 gtk_widget_set_size_request (combo, 100, -1);
822 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_md_combo), GINT_TO_POINTER(l));
823 if (i)
824 {
825 l ++;
826 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(l));
827 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[l]);
828 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
829 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(md_unit[l-1], 30, -1, 0.0, 0.5), FALSE, FALSE, 0);
830 }
831 }
832 else
833 {
834 step_button = create_button (_("Time step details"), IMG_NONE, NULL, 100, -1, GTK_RELIEF_NORMAL, G_CALLBACK(show_advance_time_step), NULL);
835 widget_set_sensitive (step_button, (int)tmp_field -> md_opts[3]);
836 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, step_button, FALSE, FALSE, 10);
837 }
838 }
839 else
840 {
841 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(l));
842 if (i == 1 && j == 0)
843 {
844 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> md_opts[l]);
845 }
846 else
847 {
848 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[l]);
849 }
850 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
851 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(md_unit[2*i+j], 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
852 }
853 }
854 }
855
856 k = (int)tmp_field -> md_opts[1];
857 l = 9;
858 gchar * extra_info[2] = {i18n("<b>Bond constraint(s) dynamics:</b>"), i18n("<b>Rotational motion of rigid body(ies):</b>")};
859 for (i=0; i<2; i++)
860 {
861 extra_vbox[i] = create_vbox (5);
862 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, extra_vbox[i], FALSE, FALSE, 20);
863 add_box_child_start (GTK_ORIENTATION_VERTICAL, extra_vbox[i], markup_label(_(extra_info[i]), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
864 hbox = create_hbox (5);
865 add_box_child_start (GTK_ORIENTATION_VERTICAL, extra_vbox[i], hbox, FALSE, FALSE, 0);
866 for (j=0; j<2; j++, l++)
867 {
868 extra_lab[2*i+j] = markup_label((k || 2*i+j < 2) ? _(md_extra[k][2*i+j]) : md_extra[k][2*i+j], 150+j*100, -1, 1.0, 0.5);
869 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, extra_lab[2*i+j], FALSE, FALSE, 5);
870 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(l));
871 if (j)
872 {
873 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[l]);
874 }
875 else
876 {
877 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> md_opts[l]);
878 }
879 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
880 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);
881 }
882 }
883 gtk_widget_set_visible (extra_vbox[1], (int)tmp_field -> md_opts[1]);
884 j = (int)tmp_field -> md_opts[1];
885 for (i=0 ;i<2; i++)
886 {
887 gtk_label_set_text (GTK_LABEL(extra_lab[2*i]), (j || 2*i < 2) ?_(md_extra[(int)tmp_field -> md_opts[1]][2*i]) : md_extra[(int)tmp_field -> md_opts[1]][2*i]);
888 gtk_label_set_text (GTK_LABEL(extra_lab[2*i+1]), (j || 2*i+1 < 2) ? _(md_extra[(int)tmp_field -> md_opts[1]][2*i+1]) : md_extra[(int)tmp_field -> md_opts[1]][2*i+1]);
889 }
890
891 hbox = create_hbox (5);
892 add_box_child_end (vbox, hbox, FALSE, FALSE, 0);
893 gboolean val = (tmp_field -> md_opts[13] == 1.0) ? TRUE : FALSE;
894 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);
895 impact_but = create_button (_("Impact details"), IMG_NONE, NULL, 100, -1, GTK_RELIEF_NORMAL, G_CALLBACK(show_impact_dialog), NULL);
897 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, impact_but, FALSE, FALSE, 10);
898 return vbox;
899}
900
901GtkWidget * equi_lab[6];
902GtkWidget * equi_entry[3];
903GtkWidget * equi_box[9];
904
905gchar * equi_info[8]= {i18n("Equilibrate for the first:"), i18n("Scale temperature:"), i18n("Cap forces:"),
906 i18n("Resample the momenta distribution:"), i18n("Minimize system configuration:"),
907 i18n("Optimize system configuration from start:"), i18n("Perform zero temperature (10 K) optimization"), i18n("Include equilibration data in statistics")};
908gchar * equi_data[5]= {i18n("Every:"), "f<sub>max</sub>=", i18n("During:"), i18n("Minimize:"), i18n("Optimize")};
909gchar * equi_unit[3]= {i18n("<b>step(s)</b>"), "<b>k<sub><i>B</i></sub>T / &#xC5;</b>", i18n("<b>step(s)</b>")};
910gchar * equi_min[3]= {i18n("Force"), i18n("Energy"), i18n("Distance")};
911gchar * equi_minu[3]= {"<b>k<sub><i>B</i></sub>T / &#xC5;</b>", "", "<b>&#xC5;</b>"};
912
913double equi_lim[2][3] = {{1.0, 0.0, 0.000001}, {1000.0, 0.01, 0.1}};
914float init_minop[3]={50.0, 0.005, 0.005};
915
924G_MODULE_EXPORT void set_equi_combo (GtkComboBox * box, gpointer data)
925{
926 int i, j, k;
927 i = GPOINTER_TO_INT(data);
928 tmp_field -> equi_opts[i] = combo_get_active ((GtkWidget *)box);
929 j = (i == 9) ? 11 : 14;
930 k = (i == 9) ? 0 : 1;
931 tmp_field -> equi_opts[j] = init_minop[(int)tmp_field -> equi_opts[i]];
932 update_entry_double (GTK_ENTRY(equi_entry[2*k]), tmp_field -> equi_opts[j]);
933 gtk_label_set_text (GTK_LABEL(equi_lab[4*k]), g_strdup_printf ("%s:", _(equi_min[(int)tmp_field -> equi_opts[i]])));
934 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]]));
935 gtk_label_set_use_markup (GTK_LABEL(equi_lab[4*k+1]), TRUE);
936}
937
946G_MODULE_EXPORT void set_equi_param (GtkEntry * res, gpointer data)
947{
948 int i, j;
949 i = GPOINTER_TO_INT(data);
950 const gchar * m = entry_get_text (res);
951 double v = string_to_double ((gpointer)m);
952 if (i == 10 || i == 14)
953 {
954 j = (i == 10) ? 9 : 13;
955 if (v >= equi_lim[0][(int)tmp_field -> equi_opts[j]] && v <= equi_lim[1][(int)tmp_field -> equi_opts[j]])
956 {
957 tmp_field -> equi_opts[i] = v;
958 }
959 else
960 {
961 gchar * str = g_strdup_printf (_("Minimization parameter must ∈ [ %f - %f ]"),
962 equi_lim[0][(int)tmp_field -> equi_opts[j]], equi_lim[1][(int)tmp_field -> equi_opts[j]]);
964 g_free (str);
965 }
966 }
967 else if (v >= 0.0 && v != tmp_field -> equi_opts[i])
968 {
969 tmp_field -> equi_opts[i] = v;
970 }
971 if (i == 1 || i == 3 || i == 7 || i == 11)
972 {
973 update_entry_int (res, (int)tmp_field -> equi_opts[i]);
974 }
975 else
976 {
977 update_entry_double (res, tmp_field -> equi_opts[i]);
978 }
979}
980
981#ifdef GTK4
990G_MODULE_EXPORT void check_equi (GtkCheckButton * but, gpointer data)
991#else
1000G_MODULE_EXPORT void check_equi (GtkToggleButton * but, gpointer data)
1001#endif
1002{
1003 int i, k;
1004 i = GPOINTER_TO_INT(data);
1005 gboolean j = button_get_status ((GtkWidget *)but);
1006 k = 2*i + 2*(i/5) + i/6 - i/7;
1007 tmp_field -> equi_opts[k] = (j) ? 1.0 : 0.0;
1008 if (i < 6) widget_set_sensitive (equi_box[i], j);
1009}
1010
1016GtkWidget * create_equi_box ()
1017{
1018 GtkWidget * vbox = create_vbox (5);
1019 GtkWidget * hbox, * hhbox;
1020 GtkWidget * entry;
1021 GtkWidget * combo;
1022 gboolean val;
1023 int i, j, k, l, m;
1024 hbox = create_hbox (5);
1025 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1026 val = (tmp_field -> equi_opts[0] == 1.0) ? TRUE : FALSE;
1027 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);
1028 equi_box[0] = create_vbox (5);
1030 gtk_box_set_homogeneous (GTK_BOX (equi_box[0]), TRUE);
1031 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, equi_box[0], FALSE, FALSE, 0);
1032 for (i=0; i<8; i++)
1033 {
1034 hbox = create_hbox (5);
1035 j = 2*i + 2*(i/5) - i/7;
1036 k = (i != 2) ? 5 : 10;
1037 l = j + 1;
1038
1039 add_box_child_start (GTK_ORIENTATION_VERTICAL, equi_box[0], hbox, FALSE, FALSE, 0);
1040
1041 if (i < 4)
1042 {
1043 entry = create_entry (G_CALLBACK(set_equi_param), k*10, k + k/6, FALSE, GINT_TO_POINTER(l));
1044 if (i == 2)
1045 {
1046 update_entry_double (GTK_ENTRY(entry), tmp_field -> equi_opts[l]);
1047 }
1048 else
1049 {
1050 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> equi_opts[l]);
1051 }
1052 }
1053 if (i)
1054 {
1055 val = (tmp_field -> equi_opts[j] == 1.0) ? TRUE : FALSE;
1056 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);
1057 if (i == 4 || i == 5)
1058 {
1059 hhbox = create_hbox (5);
1060 add_box_child_start (GTK_ORIENTATION_VERTICAL, equi_box[0], hhbox, FALSE, FALSE, 0);
1061 hbox = create_hbox (5);
1062 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, hbox, FALSE, FALSE, 50);
1063 }
1064 equi_box[i] = create_hbox (5);
1066 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, equi_box[i], FALSE, FALSE, 5);
1067 if (i < 6) add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], markup_label((i != 2) ? _(equi_data[i-1]) : equi_data[i-1], 100, -1, 0.8, 0.5), FALSE, FALSE, 0);
1068 if (i < 4)
1069 {
1070 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], entry, FALSE, FALSE, 5);
1071 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], markup_label((i != 2) ? _(equi_unit[i-1]) : equi_unit[i-1], 100, -1, 0.0, 0.5), FALSE, FALSE, 0);
1072 }
1073 else if (i < 6)
1074 {
1075 combo = create_combo();
1076 for (m=0; m<3; m++) combo_text_append (combo, _(equi_min[m]));
1077 combo_set_active (combo, (int)tmp_field -> equi_opts[l]);
1078 gtk_widget_set_size_request (combo, 100, -1);
1079 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_equi_combo), GINT_TO_POINTER(l));
1080 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], combo, FALSE, FALSE, 5);
1081 for (m=i-4; m<2; m++, l++)
1082 {
1083 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);
1084 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], equi_lab[(i-4)*2+2*m], FALSE, FALSE, 0);
1085 k = (i == 4 && m) ? 5 : 10;
1086 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));
1087 if (i == 4 && m)
1088 {
1089 update_entry_int (GTK_ENTRY(equi_entry[i-4+m]), (int)tmp_field -> equi_opts[l+1+m/2]);
1090 }
1091 else
1092 {
1093 update_entry_double (GTK_ENTRY(equi_entry[i-4+m]), tmp_field -> equi_opts[l+1+m/2]);
1094 }
1095 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], equi_entry[i-4+m], FALSE, FALSE, 5);
1096 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);
1097 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], equi_lab[(i-4)*2+2*m+1], FALSE, FALSE, 0);
1098 }
1099 }
1100 }
1101 else
1102 {
1103 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(equi_info[i]), 250, -1, 0.8, 0.5), FALSE, FALSE, 0);
1104 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
1105 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label((i != 1) ? _(equi_unit[i]) : equi_unit[i], 100, -1, 0.0, 0.5), FALSE, FALSE, 0);
1106 }
1107 }
1108 return vbox;
1109}
1110
1111gchar * traj_data[4] = {i18n("Defects:"),
1112 i18n("Displacements:"),
1113 i18n("History:"),
1114 i18n("Atom's MSD:")};
1115
1116gchar * traj_info[4][3] = {{i18n("From step:"), i18n("Every:"), i18n("Site interstitial cutoff:")},
1117 {i18n("From step:"), i18n("Every:"), i18n("Qualifying cutoff:")},
1118 {i18n("From step:"), i18n("Every:"), i18n("Data level:")},
1119 {i18n("From step:"), i18n("Every:"), NULL}};
1120
1121gchar * traj_level[3]={"0", "1", "2"};
1122
1123gchar * out_print[3]={i18n("Radial distribution functions (RDFs):"),
1124 i18n("Velocity autocorrelation functions (VAFs):"),
1125 i18n("Z density profile:")};
1126
1127GtkWidget * out_hbox[11];
1128GtkWidget * out_entry[3];
1129
1138G_MODULE_EXPORT void set_out_param (GtkEntry * res, gpointer data)
1139{
1140 int i;
1141 i = GPOINTER_TO_INT(data);
1142 const gchar * m = entry_get_text (res);
1143 double v = string_to_double ((gpointer)m);
1144 if (i == 3 || i == 7 || i == 23)
1145 {
1146 if (v >= 0.0 && v != tmp_field -> out_opts[i])
1147 {
1148 tmp_field -> out_opts[i] = v;
1149 }
1150 update_entry_double (res, tmp_field -> out_opts[i]);
1151 if (i == 23)
1152 {
1153 update_entry_double (GTK_ENTRY(out_entry[0]), tmp_field -> out_opts[i]);
1154 update_entry_double (GTK_ENTRY(out_entry[2]), tmp_field -> out_opts[i]);
1155 }
1156 }
1157 else
1158 {
1159 if ((int)v != (int)tmp_field -> out_opts[i])
1160 {
1161 tmp_field -> out_opts[i] = (int)v;
1162 }
1163 update_entry_int (res, (int)tmp_field -> out_opts[i]);
1164 }
1165}
1166
1167#ifdef GTK4
1176G_MODULE_EXPORT void check_out (GtkCheckButton * but, gpointer data)
1177#else
1186G_MODULE_EXPORT void check_out (GtkToggleButton * but, gpointer data)
1187#endif
1188{
1189 int i, k;
1190 i = GPOINTER_TO_INT(data);
1191 gboolean j = button_get_status ((GtkWidget *)but);
1192 if (i < 7)
1193 {
1194 k = 4*i - i/4 - 2*(i/5) - 2*(i/6);
1195 tmp_field -> out_opts[k] = (j) ? 1.0 : 0.0;
1197 }
1198 else
1199 {
1200 tmp_field -> out_opts[i] = (j) ? 1.0 : 0.0;
1201 if (i < 29)
1202 {
1203 k = (i == 21) ? 7 : (i == 24) ? 8 : 9;
1205 if (i == 24) widget_set_sensitive (out_hbox[10], j);
1206 }
1207 }
1208}
1209
1218G_MODULE_EXPORT void set_print_level (GtkComboBox * box, gpointer data)
1219{
1220 tmp_field -> out_opts[12] = combo_get_active ((GtkWidget *)box);
1221}
1222
1228GtkWidget * create_traj_box ()
1229{
1230 GtkWidget * vbox = create_vbox (5);
1231 GtkWidget * hbox;
1232 GtkWidget * combo;
1233 GtkWidget * entry;
1234 gboolean val;
1235 int i, j, k, l;
1236 for (i=0; i<4; i++)
1237 {
1238 hbox = create_hbox (0);
1239 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1240 k = (i < 4) ? 4*i : 15;
1241 val = (tmp_field -> out_opts[k] == 1.0) ? TRUE : FALSE;
1242 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);
1243 out_hbox[i] = create_hbox (5);
1244 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[i], FALSE, FALSE, 0);
1246
1247 for (j=0; j<3-i/3; j++)
1248 {
1249 l = (j == 2) ? 150 : 50;
1250 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], markup_label((i < 3 || j < 2) ? _(traj_info[i][j]) : traj_info[i][j], l, -1, 1.0, 0.5), FALSE, FALSE, 5);
1251 if (i != 2 || j != 2)
1252 {
1253 l = (j<2) ? 50 : 100;
1254 entry = create_entry (G_CALLBACK(set_out_param), l, l/10, FALSE, GINT_TO_POINTER(k+j+1));
1255 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], entry, FALSE, FALSE, 0);
1256 if (j == 2)
1257 {
1258 update_entry_double (GTK_ENTRY(entry), tmp_field -> out_opts[k+j+1]);
1259 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1260 }
1261 else
1262 {
1263 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[k+j+1]);
1264 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);
1265 }
1266 }
1267 else
1268 {
1269 combo = create_combo();
1270 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], combo, FALSE, FALSE, 0);
1271 for (l=0; l<3; l++) combo_text_append (combo, traj_level[l]);
1272 combo_set_active (combo, (int)tmp_field -> out_opts[k+j+1]);
1273 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_print_level), NULL);
1274 }
1275 }
1276 }
1277 return vbox;
1278}
1279
1285GtkWidget * create_dump_box ()
1286{
1287 GtkWidget * vbox = create_vbox (5);
1288 GtkWidget * hbox;
1289 GtkWidget * entry;
1290
1291 hbox = create_hbox (0);
1292 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1293 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Dump restart information every:"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
1294 entry = create_entry (G_CALLBACK(set_out_param), 50, 6, FALSE, GINT_TO_POINTER(30));
1295 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
1296 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[30]);
1297 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("<b>step(s)</b>"), 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1298
1299 return vbox;
1300}
1301
1302gchar * out_data[3] = {i18n("Print system data:"),
1303 i18n("Accumulate statistics data:"),
1304 i18n("Rolling average stack:")};
1305
1306gchar * out_info[3] = {i18n("Every:"), i18n("Every:"), " "};
1307
1313GtkWidget * create_out_box ()
1314{
1315 GtkWidget * vbox = create_vbox (5);
1316 GtkWidget * hbox;
1317 GtkWidget * entry;
1318 gboolean val;
1319 int i, j;
1320 for (i=4; i<7; i++)
1321 {
1322 hbox = create_hbox (0);
1323 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1324 j = 2*(i-4)+15;
1325 val = (tmp_field -> out_opts[j] == 1.0) ? TRUE : FALSE;
1326 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);
1327 out_hbox[i] = create_hbox (5);
1328 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[i], FALSE, FALSE, 0);
1330 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], markup_label((i-4 < 2) ? _(out_info[i-4]) : out_info[i-4], 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1331 entry = create_entry (G_CALLBACK(set_out_param), 50, 5, FALSE, GINT_TO_POINTER(j+1));
1332 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], entry, FALSE, FALSE, 0);
1333 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[j+1]);
1334 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);
1335 }
1336 return vbox;
1337}
1338
1345{
1346 GtkWidget * vbox = create_vbox (5);
1347 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
1348 GtkWidget * hbox, * hhbox;
1349 GtkWidget * entry;
1350 gboolean val;
1351 int i, k, l, m, n;
1352 i = 6;
1353 for (l=0; l<3; l++)
1354 {
1355 k = 21 + 3*l;
1356 hbox = create_hbox (5);
1357 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1358 val = (tmp_field -> out_opts[k] == 1.0) ? TRUE : FALSE;
1359 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_button(_(out_print[l]), 350, -1, val, G_CALLBACK(check_out), GINT_TO_POINTER(k)), FALSE, FALSE, 5);
1360 out_hbox[i+l+1] = create_hbox (5);
1362 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[i+l+1], FALSE, FALSE, 5);
1363 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], markup_label(_("Every:"), 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1364 entry = create_entry (G_CALLBACK(set_out_param), 50, 5, FALSE, GINT_TO_POINTER(k+1));
1365 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[k+1]);
1366 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], entry, FALSE, FALSE, 0);
1367 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);
1368 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);
1369 m = (l==1) ? k + 2 : 23;
1370 n = (l==1) ? 1 : 2;
1371 out_entry[l] = create_entry (G_CALLBACK(set_out_param), n*50, n*5, FALSE, GINT_TO_POINTER(m));
1372 if (l != 1)
1373 {
1374 update_entry_double (GTK_ENTRY(out_entry[l]), tmp_field -> out_opts[m]);
1375 }
1376 else
1377 {
1378 update_entry_int (GTK_ENTRY(out_entry[l]), (int)tmp_field -> out_opts[m]);
1379 }
1380 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], out_entry[l], FALSE, FALSE, 0);
1381 if (l != 1)
1382 {
1383 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);
1384 }
1385 if (l == 1)
1386 {
1387 hbox = create_hbox (0);
1388 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1389 out_hbox[10] = create_hbox (0);
1390 hhbox = create_hbox (0);
1391 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 0);
1392 gtk_widget_set_size_request (hhbox, 330, -1);
1393 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[10], FALSE, FALSE, 0);
1394 val = (tmp_field -> out_opts[29] == 1.0) ? TRUE : FALSE;
1395 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);
1397 }
1398 }
1399 return vbox;
1400}
1401
1402GtkWidget * ana_box[5];
1403gchar * ana_info[5]={i18n("All:"), i18n("Bonds:"), i18n("Angles:"), i18n("Dihedrals:"), i18n("Inversions:")};
1404gchar * ana_param[3]={i18n("Every:"), i18n("Num. δ"), i18n("Cutoff = ")};
1405
1414G_MODULE_EXPORT void set_ana_param (GtkEntry * res, gpointer data)
1415{
1416 int i;
1417 i = GPOINTER_TO_INT(data);
1418 const gchar * m = entry_get_text (res);
1419 double v = string_to_double ((gpointer)m);
1420 if (v >= 0.0 && v != tmp_field -> ana_opts[i])
1421 {
1422 tmp_field -> ana_opts[i] = v;
1423 }
1424 if (i == 3 || i == 7)
1425 {
1426 update_entry_double (GTK_ENTRY(res), tmp_field -> ana_opts[i]);
1427 }
1428 else
1429 {
1430 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> ana_opts[i]);
1431 }
1432}
1433
1434#ifdef GTK4
1443G_MODULE_EXPORT void check_ana (GtkCheckButton * but, gpointer data)
1444#else
1453G_MODULE_EXPORT void check_ana (GtkToggleButton * but, gpointer data)
1454#endif
1455{
1456 int i, k;
1457 i = GPOINTER_TO_INT(data);
1458 gboolean j = button_get_status ((GtkWidget *)but);
1459 tmp_field -> ana_opts[i] = (j) ? 1.0 : 0.0;
1460 switch (i)
1461 {
1462 case 14:
1463 k = 4;
1464 break;
1465 case 11:
1466 k = 3;
1467 break;
1468 default:
1469 k = i / 4;
1470 break;
1471 }
1473}
1474
1481{
1482 GtkWidget * vbox = create_vbox (5);
1483 GtkWidget * hbox;
1484 GtkWidget * entry;
1485 gboolean val;
1486 gchar * str;
1487
1488 int i, j;
1489 for (i=0; i<5; i++)
1490 {
1491 hbox = create_hbox (5);
1492 j = (i < 3) ? 4*i: 11 + 3*(i-3);
1493 val = (tmp_field -> ana_opts[j] == 1.0) ? TRUE : FALSE;
1494 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1495 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);
1496 ana_box[i] = create_hbox (5);
1497
1499 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ana_box[i], FALSE, FALSE, 0);
1500
1501 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(_(ana_param[0]), 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1502 entry = create_entry (G_CALLBACK(set_ana_param), 50, 5, FALSE, GINT_TO_POINTER(j+1));
1503
1504 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> ana_opts[j+1]);
1505 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], entry, FALSE, FALSE, 0);
1506 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);
1507 if (i < 2)
1508 {
1509 str = g_strdup_printf (_("%sr in [0 : r]"), _(ana_param[1]));
1510 }
1511 else if (i == 3)
1512 {
1513 str = g_strdup_printf (_("%s° in [-180 : 180]"), _(ana_param[1]));
1514 }
1515 else
1516 {
1517 str = g_strdup_printf (_("%s° in [0 : 180]"), _(ana_param[1]));
1518 }
1519 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(str, 160, -1, 1.0, 0.5), FALSE, FALSE, 5);
1520 g_free (str);
1521 entry = create_entry (G_CALLBACK(set_ana_param), 50, 5, FALSE, GINT_TO_POINTER(j+2));
1522 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> ana_opts[j+2]);
1523 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], entry, FALSE, FALSE, 0);
1524 if (i < 2)
1525 {
1526 str = g_strdup_printf ("<b>δr</b>");
1527 }
1528 else
1529 {
1530 str = g_strdup_printf ("<b>δ°</b>");
1531 }
1532 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(str, 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1533 g_free (str);
1534 if (i < 2)
1535 {
1536 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(_(ana_param[2]), 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1537 entry = create_entry (G_CALLBACK(set_ana_param), 100, 11, FALSE, GINT_TO_POINTER(j+3));
1538 update_entry_double (GTK_ENTRY(entry), tmp_field -> ana_opts[j+3]);
1539 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], entry, FALSE, FALSE, 0);
1540 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1541 }
1542
1543 }
1544 return vbox;
1545}
1546
1547GtkWidget * time_box[2];
1548GtkWidget * io_box[2];
1549GtkWidget * io_pre;
1550GtkWidget * misc_box;
1551gchar * time_info[2]={i18n("Set job time:"), i18n("Set job closure time:")};
1552gchar * io_rw_m[4] = {"MPI I/O", "FORTRAN I/O", i18n("Traditional master I/O"), "netCDF I/O"};
1553gchar * io_info[2] = {i18n("<b>General Input/Output (I/O) read interface:</b>"), i18n("<b>General Input/Output (I/O) write interface:</b>")};
1554gchar * io_para[4] = {i18n("Reader count:"), i18n("Batch size:"), i18n("Buffer size:"), i18n("// error check")};
1555gchar * io_pres[2] = {"Float - 32 bit", "Double - 64 bit"};
1556GtkWidget * io_hp[2][4];
1557GtkWidget * check_e[2];
1558
1567G_MODULE_EXPORT void set_io_param (GtkEntry * res, gpointer data)
1568{
1569 int i;
1570 i = GPOINTER_TO_INT(data);
1571 const gchar * m = entry_get_text (res);
1572 double v = string_to_double ((gpointer)m);
1573 if (i < 2)
1574 {
1575 if (v >= 0.0 && v != tmp_field -> io_opts[2*i+1])
1576 {
1577 tmp_field -> io_opts[2*i+1] = v;
1578 }
1579 update_entry_double (GTK_ENTRY(res), tmp_field -> io_opts[2*i+1]);
1580 }
1581 else
1582 {
1583 if (i == 7 || i == 15)
1584 {
1585 if (v >= 1.0 && v <= 100000000.0)
1586 {
1587 if (v != tmp_field -> io_opts[i])
1588 {
1589 tmp_field -> io_opts[i] = v;
1590 }
1591 }
1592 else
1593 {
1594 show_warning (_("The batch size or max. number of particles by batch\n"
1595 "must &#x2208; [1 - 10 000 000]"),
1597 }
1598 }
1599 else if (i == 8 || i == 16)
1600 {
1601 if (v >= 100.0 && v <= 100000.0)
1602 {
1603 if (v != tmp_field -> io_opts[i])
1604 {
1605 tmp_field -> io_opts[i] = v;
1606 }
1607 }
1608 else
1609 {
1610 show_warning (_("The buffer size or max. number of ASCII line records by batch\nmust &#x2208; [100 - 100 000]"), field_assistant);
1611 }
1612 }
1613 else if (i == 19 || i == 20 || i == 21)
1614 {
1615 if (v != tmp_field -> io_opts[i])
1616 {
1617 tmp_field -> io_opts[i] = v;
1618 }
1619 }
1620 else if (v > 0.0 && v != tmp_field -> io_opts[i])
1621 {
1622 tmp_field -> io_opts[i] = v;
1623 }
1624 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> io_opts[i]);
1625 }
1626}
1627
1628#ifdef GTK4
1637G_MODULE_EXPORT void check_io (GtkCheckButton * but, gpointer data)
1638#else
1647G_MODULE_EXPORT void check_io (GtkToggleButton * but, gpointer data)
1648#endif
1649{
1650 int i, k;
1651 i = GPOINTER_TO_INT(data);
1652 gboolean j = button_get_status ((GtkWidget *)but);
1653 if (i < 2)
1654 {
1655 tmp_field -> io_opts[2*i] = (j) ? 1.0 : 0.0;
1657 }
1658 else
1659 {
1660 tmp_field -> io_opts[i] = (j) ? 1.0 : 0.0;
1661 if (i < 18)
1662 {
1663 k = (i == 4) ? 0 : 1;
1665 }
1666 else if (i == 18)
1667 {
1669 }
1670 }
1671}
1672
1681G_MODULE_EXPORT void set_io_method (GtkComboBox * box, gpointer data)
1682{
1683 int i, j, k;
1684 gboolean l;
1685 i = GPOINTER_TO_INT(data);
1686 j = combo_get_active ((GtkWidget *)box);
1687 tmp_field -> io_opts[i] = (double)j;
1688 if (i < 12)
1689 {
1690 k = (i == 5) ? 0 : 1;
1691 l = (j == 2) ? FALSE : TRUE;
1692 widget_set_sensitive (io_hp[k][0], l);
1693 widget_set_sensitive (io_hp[k][2], l);
1695 if (i == 11)
1696 {
1697 l = (j == 3) ? TRUE : FALSE;
1699 }
1700 }
1701}
1702
1708GtkWidget * create_job_box ()
1709{
1710 GtkWidget * vbox = create_vbox (BSEP);
1711 GtkWidget * hbox;
1712 GtkWidget * entry;
1713 gboolean val;
1714 int i;
1715 for (i=0; i<2; i++)
1716 {
1717 hbox = create_hbox (5);
1718 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
1719 val = (tmp_field -> io_opts[2*i] == 1.0) ? TRUE : FALSE;
1720 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);
1721 time_box[i] = create_hbox (5);
1723 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, time_box[i], FALSE, FALSE, 0);
1724 entry = create_entry (G_CALLBACK(set_io_param), 100, 11, FALSE, GINT_TO_POINTER(i));
1725 update_entry_double (GTK_ENTRY(entry), tmp_field -> io_opts[i*2+1]);
1726 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, time_box[i], entry, FALSE, FALSE, 5);
1727 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, time_box[i], markup_label("<b>s</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1728 }
1729 return vbox;
1730}
1731
1737GtkWidget * create_io_box ()
1738{
1739 GtkWidget * vbox = create_vbox (BSEP);
1740 GtkWidget * hbox;
1741 GtkWidget * combo;
1742 GtkWidget * entry;
1743 gboolean val;
1744 int i, j, k;
1745 gboolean l, m;
1746 k = 4;
1747 for (i=0; i<2; i++)
1748 {
1749 hbox = create_hbox (5);
1750 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
1751 val = (tmp_field -> io_opts[k] == 1.0) ? TRUE : FALSE;
1752 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);
1753 io_box[i] = create_vbox (5);
1755 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, io_box[i], FALSE, FALSE, 0);
1756 hbox = create_hbox (5);
1757 add_box_child_start (GTK_ORIENTATION_VERTICAL, io_box[i], hbox, FALSE, FALSE, 0);
1758 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Method:"), 100, -1, 1.0, 0.5), FALSE, FALSE, 5);
1759 combo = create_combo();
1760 for (j=0; j<4; j++)
1761 {
1762 combo_text_append(combo, (j == 2) ? _(io_rw_m[j]) : io_rw_m[j]);
1763 }
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, hbox, combo, FALSE, FALSE, 5);
1768 l = tmp_field -> io_opts[k] == 2.0 ? FALSE : TRUE;
1769 m = tmp_field -> io_opts[k] == 3.0 ? TRUE : FALSE;
1770 if (i)
1771 {
1772 io_pre = create_hbox(5);
1773 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, io_pre, FALSE, FALSE, 0);
1774 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, io_pre, markup_label(_("Real precision:"), 150, -1, 1.0, 0.5), FALSE, FALSE, 5);
1775 combo = create_combo();
1776 for (j=0; j<2; j++) combo_text_append(combo, io_pres[j]);
1777 k ++;
1778 combo_set_active (combo, (int)tmp_field -> io_opts[k]);
1779 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_io_method), GINT_TO_POINTER(k));
1780 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, io_pre, combo, FALSE, FALSE, 5);
1782 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Type:"), 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1783 combo = create_combo();
1784 combo_text_append (combo, _("Sorted"));
1785 combo_text_append (combo, _("Unsorted"));
1786 k ++;
1787 combo_set_active (combo, (int)tmp_field -> io_opts[k]);
1788 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_io_method), GINT_TO_POINTER(k));
1789 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 5);
1790 }
1791 hbox = create_hbox (5);
1792 add_box_child_start (GTK_ORIENTATION_VERTICAL, io_box[i], hbox, FALSE, FALSE, 0);
1793 for (j=0; j<3; j++)
1794 {
1795 io_hp[i][j] = create_hbox (5);
1796 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, io_hp[i][j], FALSE, FALSE, 0);
1797 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);
1798 k++;
1799 entry = create_entry (G_CALLBACK(set_io_param), 70, 8, FALSE, GINT_TO_POINTER(k));
1800 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> io_opts[k]);
1801 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, io_hp[i][j], entry, FALSE, FALSE, 5);
1802 if (j == 1) widget_set_sensitive (io_hp[i][j], l);
1803 }
1804 k++;
1805 check_e[i] = check_button(_(io_para[j]), 50, -1, val, G_CALLBACK(check_io), GINT_TO_POINTER(k));
1806 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_e[i], FALSE, FALSE, 20);
1808 k ++;
1809 }
1810 return vbox;
1811}
1812
1818GtkWidget * create_misc_box ()
1819{
1820 GtkWidget * vbox = create_vbox (BSEP);
1821 GtkWidget * hbox;
1822 GtkWidget * entry;
1823 gchar * str;
1824 gboolean val;
1825 int i;
1826 hbox = create_hbox (5);
1827 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
1828 val = (tmp_field -> io_opts[18] == 1.0) ? TRUE : FALSE;
1829 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);
1830 misc_box = create_hbox (5);
1832 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, misc_box, FALSE, FALSE, 0);
1833 for (i=19; i<22; i++)
1834 {
1835 str = g_strdup_printf ("<i>n</i><sub>%d</sub>", i-18);
1836 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, misc_box, markup_label(str, 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1837 g_free (str);
1838 entry = create_entry (G_CALLBACK(set_io_param), 70, 10, FALSE, GINT_TO_POINTER(i));
1839 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> io_opts[i]);
1840 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, misc_box, entry, FALSE, FALSE, 5);
1841 }
1842 hbox = create_hbox (5);
1843 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
1844 val = (tmp_field -> io_opts[22] == 1.0) ? TRUE : FALSE;
1845 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);
1846 return vbox;
1847}
1848
1849
1850GtkWidget * elec_box[4];
1851GtkWidget * pres_spin;
1852gchar * eval_m[10] = {i18n("Direct Coulomb sum"), i18n("Distance dependent dielectric Coulomb sum"),
1853 i18n("Ewald sum (auto)"), i18n("Ewald sum"),
1854 i18n("Reaction field electrostatics"), i18n("Reaction field with Fennel damping"),
1855 i18n("Reaction field with Fennel damping (auto)"),
1856 i18n("Force-shifted Coulomb sum"), i18n("Force-shifted Coulomb sum with Fennel damping"),
1857 i18n("Force-shifted Coulomb sum with Fennel damping (auto)")};
1858
1867G_MODULE_EXPORT void set_elec_param (GtkEntry * res, gpointer data)
1868{
1869 int i;
1870 i = GPOINTER_TO_INT(data);
1871 const gchar * m = entry_get_text (res);
1872 double v = string_to_double ((gpointer)m);
1873 if (i == 1)
1874 {
1875 if (v > 0.0 && v != tmp_field -> elec_opts[i])
1876 {
1877 tmp_field -> elec_opts[i] = v;
1878 }
1879 else if (v < 0.0)
1880 {
1881 show_warning (_("Cutoff must be > 0.0 &#xC5;"), field_assistant);
1882 }
1883 }
1884 else if (i == 3)
1885 {
1886 if (v > 0.0 && v != tmp_field -> elec_opts[i])
1887 {
1888 if (v >= min(0.05, 0.5*tmp_field -> elec_opts[1]/100.0))
1889 {
1890 tmp_field -> elec_opts[i] = v;
1891 }
1892 else
1893 {
1894 show_warning (_("Padding must be &#8805; min(0.05, 0.5%r<sub>cut</sub>) &#xC5;"), field_assistant);
1895 }
1896 }
1897 else if (v < 0.0)
1898 {
1899 show_warning (_("Padding must be > 0.0 &#xC5;"), field_assistant);
1900 }
1901 }
1902 else
1903 {
1904 if (i != 6 && (v >= 0.0 && v != tmp_field -> elec_opts[i]))
1905 {
1906 tmp_field -> elec_opts[i] = v;
1907 }
1908 else if (i == 6)
1909 {
1910 if (tmp_field -> elec_opts[5] == 2.0 || tmp_field -> elec_opts[5] == 6.0 || tmp_field -> elec_opts[5] == 9.0)
1911 {
1912 int j = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(pres_spin));
1913 double w = v * pow (10, j);
1914 if ((w >= 1e-20 && w <= 0.5) && w != tmp_field -> elec_opts[i])
1915 {
1916 tmp_field -> elec_opts[i] = w;
1917 w = v;
1918 }
1919 else if (w < 1e-20 || w > 0.5)
1920 {
1921 show_warning (_("Precision must &#x2208; [10<sup>-20</sup> - 0.5]"), field_assistant);
1922 w = tmp_field -> elec_opts[i] / pow (10, j);
1923 }
1924 }
1925 else if (v >= 0.0 && v != tmp_field -> elec_opts[i])
1926 {
1927 tmp_field -> elec_opts[i] = v;
1928 }
1929 }
1930 }
1931 if (i == 10)
1932 {
1933 if (tmp_field -> elec_opts[i] == 0.0) tmp_field -> elec_opts[i] = 1.0;
1934 if (tmp_field -> elec_opts[i] > 10.0) tmp_field -> elec_opts[i] = 4.0;
1935 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> elec_opts[i]);
1936 }
1937 else if (i == 7 || i == 8 || i == 9)
1938 {
1939 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> elec_opts[i]);
1940 }
1941 else
1942 {
1943 if (i == 6)
1944 {
1945 update_entry_double (GTK_ENTRY(res), v);
1946 }
1947 else
1948 {
1949 update_entry_double (GTK_ENTRY(res), tmp_field -> elec_opts[i]);
1950 }
1951 }
1952}
1953
1962G_MODULE_EXPORT void adjust_precision (GtkSpinButton * res, gpointer data)
1963{
1964 int powa = gtk_spin_button_get_value_as_int(res);
1965 double v = tmp_field -> elec_opts[6];
1966 while (v < 0.1)
1967 {
1968 v = v*10;
1969 }
1970 v = v*10;
1971 tmp_field -> elec_opts[6] = v * pow(10, powa);
1972}
1973
1980{
1981 GtkWidget * vbox, * vvbox;
1982 GtkWidget * hbox, * hhbox;
1983 GtkWidget * entry;
1984 vvbox = create_hbox (5);
1985 vbox = create_vbox (5);
1986 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
1987 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, vvbox, vbox, FALSE, FALSE, 50);
1988 gchar * dir[3] = {"x:", "y:", "z:"};
1989 if (tmp_field -> elec_opts[5] == 2.0 || tmp_field -> elec_opts[5] == 6.0 || tmp_field -> elec_opts[5] == 9.0)
1990 {
1991 hbox = create_hbox (5);
1992 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1993 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Precision:"), 180, -1, 0.0, 0.5), FALSE, FALSE, 0);
1994 // tmp_field -> elec_opts[6] = 1e-20;
1995 entry = create_entry (G_CALLBACK(set_elec_param), 100, 11, FALSE, GINT_TO_POINTER(6));
1996 double v = tmp_field -> elec_opts[6];
1997 int i = -1;
1998 while (v < 0.1)
1999 {
2000 v = v*10;
2001 i --;
2002 }
2003 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[6] / pow(10,i));
2004 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2005 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" x 10<sup>-</sup>", 5, -1, 0.0, 0.5), FALSE, FALSE, 0);
2006 pres_spin = spin_button (G_CALLBACK(adjust_precision), i, -20, -1, 1, 0, 15, NULL);
2007 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, pres_spin, FALSE, FALSE, 5);
2008 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("&#x2208; [10<sup>-20</sup> - 0.5]", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2009 }
2010 else if (tmp_field -> elec_opts[5] == 3.0)
2011 {
2012 hbox = create_hbox (5);
2013 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2014 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Ewald convergence parameter:"), 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2015 // tmp_field -> elec_opts[6] = 1.0;
2016 entry = create_entry (G_CALLBACK(set_elec_param), 100, 11, FALSE, GINT_TO_POINTER(6));
2017 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[6]);
2018 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2019 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);
2020 hbox = create_hbox (5);
2021 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2022 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);
2023 hbox = create_hbox (5);
2024 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2025 int i;
2026 for (i=0; i<3; i++)
2027 {
2028 hhbox = create_hbox (5);
2029 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 40);
2030 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(dir[i], 10, -1, 0.0, 0.5), FALSE, FALSE, 0);
2031 // tmp_field -> elec_opts[7+i] = 1.0;
2032 entry = create_entry (G_CALLBACK(set_elec_param), 50, 5, FALSE, GINT_TO_POINTER(7+i));
2033 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> elec_opts[7+i]);
2034 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
2035 }
2036 }
2037 else if (tmp_field -> elec_opts[5] == 5.0 || tmp_field -> elec_opts[5] == 8.0)
2038 {
2039 hbox = create_hbox (5);
2040 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2041 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Fennell damping parameter (&#x3B1;):"), 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
2042 entry = create_entry (G_CALLBACK(set_elec_param), 100, 11, FALSE, GINT_TO_POINTER(6));
2043 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[6]);
2044 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2045 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);
2046 }
2047 if (tmp_field -> elec_opts[5] == 2.0 || tmp_field -> elec_opts[5] == 3.0)
2048 {
2049 hbox = create_hbox (5);
2050 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2051 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);
2052 entry = create_entry (G_CALLBACK(set_elec_param), 50, 5, FALSE, GINT_TO_POINTER(10));
2053 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> elec_opts[10]);
2054 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2055 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("<b>step(s)</b>"), 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2056 }
2057 return vvbox;
2058}
2059
2068G_MODULE_EXPORT void set_elec_eval (GtkComboBox * box, gpointer data)
2069{
2070 tmp_field -> elec_opts[5] = combo_get_active ((GtkWidget *)box);
2074 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[2], elec_box[3], FALSE, FALSE, 10);
2075}
2076
2077#ifdef GTK4
2086G_MODULE_EXPORT void check_elec (GtkCheckButton * but, gpointer data)
2087#else
2096G_MODULE_EXPORT void check_elec (GtkToggleButton * but, gpointer data)
2097#endif
2098{
2099 int i = GPOINTER_TO_INT(data);
2100 gboolean j = button_get_status ((GtkWidget *)but);
2101 tmp_field -> elec_opts[i] = (j) ? 1.0 : 0.0;
2102 if (! i) widget_set_sensitive (elec_box[j], j);
2103 if (i == 2) widget_set_sensitive (elec_box[1], j);
2104}
2105
2112{
2113 GtkWidget * vbox = create_vbox (BSEP);
2114 GtkWidget * hbox;
2115 gboolean val = (tmp_field -> elec_opts[0] == 1.0) ? TRUE : FALSE;
2116 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);
2117 hbox = create_hbox(0);
2118 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2119 elec_box[0] = create_vbox(5);
2121 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, elec_box[0], FALSE, FALSE, 50);
2122 hbox = create_hbox(5);
2123 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[0], hbox, FALSE, FALSE, 0);
2124 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);
2125 GtkWidget * entry = create_entry (G_CALLBACK(set_elec_param), 100, 10, FALSE, GINT_TO_POINTER(1));
2126 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[1]);
2127 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2128 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>&#xC5;</b>", 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
2129 val = (tmp_field -> elec_opts[2] == 1.0) ? TRUE : FALSE;
2130 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);
2131 elec_box[1] = create_hbox(5);
2132 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, elec_box[1], FALSE, FALSE, 0);
2133 entry = create_entry (G_CALLBACK(set_elec_param), 100, 10, FALSE, GINT_TO_POINTER(3));
2134 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[3]);
2135 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, elec_box[1], entry, FALSE, FALSE, 10);
2136 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, elec_box[1], markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2138 val = (tmp_field -> elec_opts[4] == 1.0) ? TRUE : FALSE;
2139 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);
2140 hbox = create_hbox(5);
2141 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[0], hbox, FALSE, FALSE, 0);
2142 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Evaluation method:"), 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2143 GtkWidget * combo = create_combo();
2144 int i;
2145 for (i=0; i<10; i++)
2146 {
2147 combo_text_append(combo, _(eval_m[i]));
2148 }
2149 combo_set_active (combo, (int)tmp_field -> elec_opts[5]);
2150 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_elec_eval), NULL);
2151 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 10);
2152 elec_box[2] = create_vbox (BSEP);
2153 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[0], elec_box[2], FALSE, FALSE, 0);
2155 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[2], elec_box[3], FALSE, FALSE, 10);
2156 return vbox;
2157}
2158
2159GtkWidget * vdw_box[2];
2160gchar * eval_vdw[6] = {"Lorentz-Berthelot", "Fender-Halsey", "Hogervorst",
2161 "Halgren HHG", "Tang-Toennies", i18n("Functional")};
2162
2171G_MODULE_EXPORT void set_vdw_param (GtkEntry * res, gpointer data)
2172{
2173 int i;
2174 i = GPOINTER_TO_INT(data);
2175 const gchar * m = entry_get_text (res);
2176 double v = string_to_double ((gpointer)m);
2177 if (i == 1)
2178 {
2179 if (v > 0.0 && v != tmp_field -> vdw_opts[i])
2180 {
2181 tmp_field -> vdw_opts[i] = v;
2182 }
2183 else if (v < 0.0)
2184 {
2185 show_warning (_("Cutoff must be > 0.0 &#xC5;"), field_assistant);
2186 }
2187 }
2188 update_entry_double (GTK_ENTRY(res), tmp_field -> vdw_opts[i]);
2189}
2190
2199G_MODULE_EXPORT void set_vdw_mix (GtkComboBox * box, gpointer data)
2200{
2201 tmp_field -> vdw_opts[5] = combo_get_active ((GtkWidget *)box);
2202}
2203
2204#ifdef GTK4
2213G_MODULE_EXPORT void check_vdw (GtkCheckButton * but, gpointer data)
2214#else
2223G_MODULE_EXPORT void check_vdw (GtkToggleButton * but, gpointer data)
2224#endif
2225{
2226 int i, j;
2227 j = GPOINTER_TO_INT(data);
2228 i = button_get_status ((GtkWidget *)but);
2229 tmp_field -> vdw_opts[j] = (double)i;
2230 if (j == 0) widget_set_sensitive (vdw_box[0], i);
2231 if (j == 4) widget_set_sensitive (vdw_box[1], i);
2232}
2233
2239GtkWidget * create_vdws_box ()
2240{
2241 GtkWidget * vbox = create_vbox (BSEP);
2242 GtkWidget * hbox;
2243 gboolean val = (tmp_field -> vdw_opts[0] == 1.0) ? TRUE : FALSE;
2244 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);
2245 hbox = create_hbox(0);
2246 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2247 vdw_box[0] = create_vbox(5);
2248 gtk_box_set_homogeneous (GTK_BOX (vdw_box[0]), TRUE);
2250 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vdw_box[0], FALSE, FALSE, 50);
2251 hbox = create_hbox(5);
2252 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], hbox, FALSE, FALSE, 0);
2253 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Short range interaction cutoff:"), 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2254 GtkWidget * entry = create_entry (G_CALLBACK(set_vdw_param), 100, 10, FALSE, GINT_TO_POINTER(1));
2255 update_entry_double (GTK_ENTRY(entry), tmp_field -> vdw_opts[1]);
2256 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2257 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2258
2259 hbox = create_hbox(5);
2260 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], hbox, FALSE, FALSE, 0);
2261 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);
2262
2263 hbox = create_hbox(5);
2264 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], hbox, FALSE, FALSE, 0);
2265 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);
2266
2267 hbox = create_hbox(5);
2268 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], hbox, FALSE, FALSE, 0);
2269 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);
2270 vdw_box[1] = create_vbox(5);
2271 val = (tmp_field -> vdw_opts[4] == 1.0) ? TRUE : FALSE;
2273 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], vdw_box[1], FALSE, FALSE, 0);
2274 hbox = create_hbox(5);
2275 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[1], hbox, FALSE, FALSE, 0);
2276 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Mixing rule:"), 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2277 GtkWidget * combo = create_combo();
2278 int i;
2279 for (i=0; i<6; i++)
2280 {
2281 combo_text_append(combo, (i == 5) ? _(eval_vdw[i]) : eval_vdw[i]);
2282 }
2283 combo_set_active (combo, (int)tmp_field -> vdw_opts[5]);
2284 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_vdw_mix), NULL);
2285 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 10);
2286
2287 return vbox;
2288}
2289
2290#ifdef GTK4
2299G_MODULE_EXPORT void check_met (GtkCheckButton * but, gpointer data)
2300#else
2309G_MODULE_EXPORT void check_met (GtkToggleButton * but, gpointer data)
2310#endif
2311{
2312 int i, j;
2313 j = GPOINTER_TO_INT(data);
2314 i = button_get_status ((GtkWidget *)but);
2315 tmp_field -> met_opts[j] = (double)i;
2316}
2317
2323GtkWidget * create_metal_box ()
2324{
2325 GtkWidget * vbox = create_vbox (BSEP);
2326 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
2327 GtkWidget * hbox;
2328 gboolean val = (tmp_field -> met_opts[0] == 1.0) ? TRUE : FALSE;
2329 hbox = create_hbox(5);
2330 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2331 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"),
2332 -1, 25, val, G_CALLBACK(check_met), GINT_TO_POINTER(0)), FALSE, FALSE, 5);
2333 val = (tmp_field -> met_opts[1] == 1.0) ? TRUE : FALSE;
2334 hbox = create_hbox(5);
2335 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2336 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>"),
2337 -1, 25, val, G_CALLBACK(check_met), GINT_TO_POINTER(1)), FALSE, FALSE, 5);
2338 return vbox;
2339}
2340
2349G_MODULE_EXPORT void set_sys_param (GtkEntry * res, gpointer data)
2350{
2351 int i;
2352 i = GPOINTER_TO_INT(data);
2353 const gchar * m = entry_get_text (res);
2354 double v = string_to_double ((gpointer)m);
2355 if (i == 9)
2356 {
2357 if (v >= 1.0 && v != tmp_field -> sys_opts[i])
2358 {
2359 tmp_field -> sys_opts[i] = v;
2360 }
2361 else if (v < 1.0)
2362 {
2363 show_warning (_("Subcelling threshold density must be &#8805; 1.0"), field_assistant);
2364 }
2365 }
2366 else if (v >= 0.0 && v != tmp_field -> sys_opts[i])
2367 {
2368 tmp_field -> sys_opts[i] = v;
2369 }
2370 if (i > 10)
2371 {
2372 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> sys_opts[i]);
2373 }
2374 else
2375 {
2376 update_entry_double (GTK_ENTRY(res), tmp_field -> sys_opts[i]);
2377 }
2378}
2379
2380GtkWidget * sys_box[4];
2381gchar * sys_opts[10] = {i18n("Relative dielectric constant &#949;<sub>r</sub>"),
2382 i18n("Allowed local variation of system density:"),
2383 i18n("Ignore the particle indices in CONFIG file"),
2384 i18n("Ignore strict checks, hide warnings and assume safe simulation parameters"),
2385 i18n("Skip detailed topology reporting during read of FIELD file in output"),
2386 i18n("Ignore center of mass removal during the calculation"),
2387 i18n("Set tolerance for relaxed shell model:"),
2388 i18n("Set the subcelling threshold density of particles per link cell:"),
2389 i18n("Create an expanded version of the current model:"),
2390 i18n("Restart calculation:")};
2391
2400G_MODULE_EXPORT void set_sys_restart (GtkComboBox * box, gpointer data)
2401{
2402 tmp_field -> sys_opts[15] = combo_get_active ((GtkWidget *)box);
2403}
2404
2405#ifdef GTK4
2414G_MODULE_EXPORT void check_sys (GtkCheckButton * but, gpointer data)
2415#else
2424G_MODULE_EXPORT void check_sys (GtkToggleButton * but, gpointer data)
2425#endif
2426{
2427 int i, k;
2428 i = GPOINTER_TO_INT(data);
2429 gboolean j = button_get_status ((GtkWidget *)but);
2430 tmp_field -> sys_opts[i] = (j) ? 1.0 : 0.0;
2431 if (i > 5)
2432 {
2433 k = i - 6;
2434 if (i == 14) k = 3;
2436 }
2437}
2438
2444GtkWidget * create_sys_box ()
2445{
2446 GtkWidget * vbox;
2447 GtkWidget * hbox, * hhbox;
2448 GtkWidget * entry;
2449 gboolean val;
2450 hhbox = create_hbox (5);
2451 vbox = create_vbox (5);
2452 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
2453 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, vbox, FALSE, FALSE, 10);
2454 int i, j, k;
2455 for (i=0; i<9; i++)
2456 {
2457 hbox = create_hbox(5);
2458 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2459 if (i < 2)
2460 {
2461 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(sys_opts[i]), 350, -1, 0.0, 0.5), FALSE, FALSE, 5);
2462 entry = create_entry (G_CALLBACK(set_sys_param), 100, 10, FALSE, GINT_TO_POINTER(i));
2463 update_entry_double (GTK_ENTRY(entry), tmp_field -> sys_opts[i]);
2464 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2465 if (i) add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>%</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
2466 }
2467 else
2468 {
2469 j = (i < 7) ? i : (i == 7) ? 8 : 10;
2470 val = (tmp_field -> sys_opts[j] == 1.0) ? TRUE : FALSE;
2471 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);
2472 if (i > 5)
2473 {
2474 sys_box[i-6] = create_hbox(5);
2475 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, sys_box[i-6], FALSE, FALSE, 0);
2477 if (i < 8)
2478 {
2479 entry = create_entry (G_CALLBACK(set_sys_param), 100, 10, FALSE, GINT_TO_POINTER(j+1));
2480 update_entry_double (GTK_ENTRY(entry), tmp_field -> sys_opts[j+1]);
2481 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sys_box[i-6], entry, FALSE, FALSE, 10);
2482 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);
2483 }
2484 else
2485 {
2486 for (k=0; k<3; k++)
2487 {
2488 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);
2489 entry = create_entry (G_CALLBACK(set_sys_param), 50, 5, FALSE, GINT_TO_POINTER(j+k+1));
2490 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> sys_opts[j+k+1]);
2491 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sys_box[i-6], entry, FALSE, FALSE, 5);
2492 }
2493 }
2494 }
2495 }
2496 }
2497
2498 return hhbox;
2499}
2500
2507{
2508 GtkWidget * vbox = create_vbox (5);
2509 GtkWidget * hbox = create_hbox (0);
2510 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2511 gboolean val = (tmp_field -> sys_opts[14] == 1.0) ? TRUE : FALSE;
2512 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);
2513 sys_box[3] = create_hbox(5);
2514 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, sys_box[3], FALSE, FALSE, 0);
2516 gchar * rtype[3]={i18n("Continue current simulation"),
2517 i18n("Start new simulation from older run without temperature reset"),
2518 i18n("Start new simulation from older run with temperature reset")};
2519 GtkWidget * combo = create_combo();
2520 int i;
2521 for (i=0; i<3; i++) combo_text_append(combo, _(rtype[i]));
2522 combo_set_active (combo, (int)tmp_field -> sys_opts[15]);
2523 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_sys_restart), NULL);
2524 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sys_box[3], combo, FALSE, FALSE, 20);
2525 return vbox;
2526}
2527
2528
2536GtkWidget * vbox_control (int f)
2537{
2538 GtkWidget * vbox;
2539 vbox = create_vbox (5);
2540 switch (f)
2541 {
2542 case 0:
2543 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Global options:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2544 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_sys_box(), FALSE, FALSE, 0);
2545 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Restart options:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2546 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_restart_box(), FALSE, FALSE, 0);
2547 break;
2548 case 1:
2549 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);
2550 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_analyze_box(), FALSE, FALSE, 0);
2551 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Overall analysis:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 10);
2552 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_overall_box(), FALSE, FALSE, 0);
2553 break;
2554 case 2:
2555 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);
2556 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_vdws_box(), FALSE, FALSE, 0);
2557 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);
2558 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_electro_box(), FALSE, FALSE, 0);
2559 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Metallic interactions:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2560 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_metal_box(), FALSE, FALSE, 0);
2561 break;
2562 case 3:
2563 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Equilibration:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2564 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_equi_box(), FALSE, FALSE, 0);
2565 break;
2566 case 4:
2567 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Thermodynamics:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2568 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_ensemble_box(), FALSE, FALSE, 0);
2569 break;
2570 case 5:
2571 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Molecular dynamics:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2572 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_md_box(), FALSE, FALSE, 0);
2573 break;
2574 case 6:
2575 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Output information:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2576 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_out_box(), FALSE, FALSE, 10);
2577 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Trajectory file(s):</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2578 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_traj_box(), FALSE, FALSE, 10);
2579 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Restart file:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2580 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_dump_box(), FALSE, FALSE, 10);
2581 break;
2582 case 7:
2583 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Job options:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2584 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_job_box(), FALSE, FALSE, 0);
2585 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>I/O options:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2586 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_io_box(), FALSE, FALSE, 0);
2587 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Other options:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2588 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_misc_box(), FALSE, FALSE, 0);
2589 break;
2590 default:
2591 break;
2592 }
2593 return vbox;
2594}
2595
2596/*
2597 0: System options:
2598
2599 0 = Epsilon
2600 1 = Density variation
2601 2 = no index
2602 3 = no strict
2603 4 = no topology
2604 5 = no vafar
2605 6 = no vom
2606 7 = Set tolerance for rsm ...
2607 8 = ... rsm tolerance
2608 9 = Set subscelling threshold ...
2609 10 = ... subscelling threshold
2610 11 = Create expanded system ...
2611 12 = ... x ...
2612 13 = ... y ...
2613 14 = ... z
2614 15 = Restart calc ...
2615 16 = ... restart type
2616
2617
2618 1: Calc. options:
2619
2620 0 = All PDFs
2621 1 = All: every
2622 2 = All: ndelta
2623 3 = All: cutoff
2624 4 = Bonds PDFs
2625 5 = Bonds: every
2626 6 = Bonds: ndelta
2627 7 = Bonds: cutoff
2628 8 = Angles PDFs
2629 9 = Angles: every
2630 10 = Angles: ndelta
2631 11 = Dihedrals PDFs
2632 12 = Dihedrals: every
2633 13 = Dihedrals: ndelta
2634 14 = Inversions PDFs
2635 15 = Inversions: every
2636 16 = Inversions: ndelta
2637 17 = print pdfs
2638 18 = rdf
2639 19 = every n steps
2640 20 = bin size
2641 21 = print velocity autocorrelation functions
2642 22 = every n steps
2643 23 = print z-dens
2644 24 = every n steps
2645 25 = Job time
2646 26 = Job closure
2647
2648 2: Electro. stat options:
2649 0 = Evaluate (or not) electrostatics
2650 1 = Electrostatics evaluation method
2651 2 = Param 1
2652 3 = Param 2
2653 4 = Param 3
2654 5 = Param 4
2655
2656 3: Equil. options:
2657
2658 0 = Equil
2659 1 = Equi for n steps
2660 2 = Scale temp
2661 3 = Scale temp: every
2662 4 = cap forces
2663 5 = cap: force max
2664 6 = Resample
2665 7 = Resample: during
2666 8 = Minimize
2667 9 = Minimize: string
2668 10 = Minimize: target
2669 11 = Minimize: every
2670 12 = Optimize
2671 13 = Optimize: string
2672 14 = Optimize: target
2673 15 = zero temp MD
2674 16 = collect
2675
2676 4: Thermo options:
2677
2678 0 = Ensemble
2679 1 = Thermostat
2680 2 to 7 = Thermostat options
2681
2682 5: MD options
2683 0 = target temp
2684 1 = integrator
2685 2 = MD steps
2686 3 = Time step type
2687 4 = Time step
2688 5 = Max time step
2689 6 = Max dist. per time step
2690 7 = Min dist. per time step
2691 8 = Target pressure
2692 9 = shake limit
2693 10 = shake tol
2694 11 = FIQA lim
2695 12 = FIQA tol
2696
2697 17 = Initiate impact
2698 18 = particle index
2699 19 = MD step
2700 20 = impact energy
2701 21 = impact x direct
2702 22 = impact y direct
2703 23 = impact z direct
2704
2705 6: Output options:
2706
2707 0 = Write defects trajectory ...
2708 1 = ... start time to dump defects
2709 2 = ... time step to dump defects
2710 3 = ... site interstitial cutoff
2711 4 = write displacements trajectory ...
2712 5 = ... start time to dump displacements
2713 6 = ... time step to dump displacements
2714 7 = ... displacement qualifying cutoff
2715 8 = Write history/trajectory file ...
2716 9 = ... start time to dump trajectory
2717 10 = ... time step to dump trajectory
2718 11 = ... data level [0=coord, 1=0+velo, 2=1+forces]
2719 12 = Write MSDTMP file ...
2720 13 = ... start time to dump trajectory
2721 14 = ... time step to dump trajectory
2722 15 = print data ...
2723 16 = ... every n steps
2724 17 = accumulate stat ...
2725 18 = ... every n step(s)
2726 19 = set rolling avertage stack ...
2727 20 = ... to n time step(s)
2728 21 = Write RDFs ...
2729 22 = ... every n step(s)
2730 23 = ... bin size *
2731 24 = Write VAFs ...
2732 25 = ... every n step(s)
2733 26 = ... bin size
2734 27 = Write z-dens ...
2735 28 = ... every n step(s)
2736 29 = Ignore time average for VAFs
2737 30 = Dump restart every n step(s)
2738*/
2739
Binding to the Fortran90 subroutines.
Callback declarations for main window.
GtkWidget * thermo_box()
create the thermostat configuration widgets
Definition cpmd_nose.c:1891
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 * 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]
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]
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:1682
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:1043
GtkWidget * field_assistant
Definition dlp_field.c:1030
classical_field * tmp_field
Definition dlp_field.c:1041
Variable declarations for the creation of the DL_POLY input file(s).
#define i18n(String)
Definition global.c:80
double string_to_double(gpointer string)
convert string to double
Definition global.c:612
void run_this_gtk_dialog(GtkWidget *dial, GCallback handler, gpointer data)
run a GTK (3 and 4) basic GtkDialog
Definition gtk-misc.c:533
@ IMG_NONE
Definition global.h:277
int combo_get_active(GtkWidget *combo)
retrieve the active item's position
Definition gtk-misc.c:935
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1401
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
Definition gtk-misc.c:688
GtkWidget * dialogmodal(gchar *str, GtkWindow *parent)
Create a new dialog modal window.
Definition gtk-misc.c:552
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:958
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:652
#define BSEP
Definition global.h:262
void update_entry_int(GtkEntry *entry, int intval)
update the content of a GtkEntry as int
Definition gtk-misc.c:669
GtkWidget * radio_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a radio button
Definition gtk-misc.c:1970
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:1877
GtkWidget * check_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a check button
Definition gtk-misc.c:1937
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:1999
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
Definition gtk-misc.c:1010
GtkWidget * dialog_get_content_area(GtkWidget *widg)
prepare GtkWidget to insert content in a GtkDialog window
Definition gtk-misc.c:861
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1672
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:340
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:247
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:849
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:987
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:2272
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2213
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:318
void update_entry_text(GtkEntry *entry, gchar *text)
update the content of a GtkEntry as string
Definition gtk-misc.c:726
#define min(a, b)
Definition global.h:94
#define MAXDATC
Number of tabs for the description of the classical calculation.
Definition global.h:775
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:837
int button_get_status(GtkWidget *button)
get status of check / toggle button
Definition gtk-misc.c:1899
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:202
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:266
Messaging function declarations.
Function declarations for reading atomes project file Function declarations for saving atomes proje...
Definition glwin.h:350
GtkWidget * res[2]
Definition w_encode.c:342
gchar * rtype[5]
Definition w_rings.c:61
GtkWidget * hbox
Definition workspace.c:71
GtkWidget * vbox
Definition workspace.c:72