atomes 1.3.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
dlp_control.c
Go to the documentation of this file.
1/* This file is part of the 'atomes' software
2
3'atomes' is free software: you can redistribute it and/or modify it under the terms
4of the GNU Affero General Public License as published by the Free Software Foundation,
5either version 3 of the License, or (at your option) any later version.
6
7'atomes' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9See the GNU General Public License for more details.
10
11You should have received a copy of the GNU Affero General Public License along with 'atomes'.
12If not, see <https://www.gnu.org/licenses/>
13
14Copyright (C) 2022-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 }
393#endif
394 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_nvs_butt[i], FALSE, FALSE, 20);
395 if (i == 2)
396 {
397 nvs_label = markup_label(_(opts_npt_nvs[1][2]), 150, -1, 0.0, 0.5);
399 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_label, FALSE, FALSE, 0);
400 j = 4;
401 nvs_entry = create_entry(G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(j));
403 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_entry, FALSE, FALSE, 10);
404 if (val) update_entry_double (GTK_ENTRY(nvs_entry), tmp_field -> thermo_opts[4]);
405 nvs_unit = markup_label(unit_npt_nvs[1][2], 50, -1, 0.0, 0.5);
407 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_unit, FALSE, FALSE, 0);
408 }
409 if (i > 1)
410 {
411 val = (((int)tmp_field -> thermo_opts[3] == i) && tmp_field -> thermo_opts[5] == 1.0) ? TRUE : FALSE;
412 nvs_check[i-2] = check_button(_("Semi-anisotropic constraint"), 200, -1, val, G_CALLBACK(check_semi), GINT_TO_POINTER(5));
414 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, nvs_check[i-2], FALSE, FALSE, 10);
415 }
416 add_box_child_start (GTK_ORIENTATION_VERTICAL, vvbox, hbox, FALSE, FALSE, 0);
417 }
418 }
419 break;
420 }
421 return vbox;
422}
423
432G_MODULE_EXPORT void set_thermostat (GtkComboBox * box, gpointer data)
433{
434 int i, j;
435 i = GPOINTER_TO_INT(data);
436 switch (i)
437 {
438 case 0:
439 tmp_field -> thermostat = combo_get_active ((GtkWidget *)box);
440 for (j=0; j<6; j++) tmp_field -> thermo_opts[j] = 0.0;
441 if (tmp_field -> ensemble)
442 {
445 add_box_child_start (GTK_ORIENTATION_VERTICAL, o_vbox, o_ent_vbox, FALSE, FALSE, 0);
447 }
448 break;
449 case 1:
450 tmp_field -> thermo_opts[7] = combo_get_active ((GtkWidget *)box);
451 break;
452 }
453}
454
462GtkWidget * create_thermo_box (int ensemble)
463{
464 GtkWidget * vbox = create_vbox (5);
465 GtkWidget * hbox = create_hbox (5);
466 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
467 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Thermostat:"), 100, -1, 0.0, 0.5), FALSE, FALSE, 30);
468 GtkWidget * thermo_box = create_combo();
469 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, thermo_box, FALSE, FALSE, 0);
470 int i;
471 for (i=0; i<DLP_ENS_TYPE; i++)
472 {
473 if (md_ens_opt[ensemble][i])
474 {
475 combo_text_append (thermo_box, (i == 5 || i == 8 || i == 9) ? _(md_thermo[i]) : md_thermo[i]);
476 }
477 }
479 g_signal_connect (G_OBJECT (thermo_box), "changed", G_CALLBACK(set_thermostat), GINT_TO_POINTER(0));
480 if (ensemble)
481 {
483 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, o_vbox, FALSE, FALSE, 0);
485 add_box_child_start (GTK_ORIENTATION_VERTICAL, o_vbox, o_ent_vbox, FALSE, FALSE, 0);
486 }
487 return vbox;
488}
489
498G_MODULE_EXPORT void set_ensemble (GtkComboBox * box, gpointer data)
499{
500 int i;
501 if (tmp_field -> ensemble)
502 {
503 for (i=0; i<4; i++)
504 {
506 }
508 }
509 tmp_field -> ensemble = combo_get_active ((GtkWidget *)box);
510 tmp_field -> thermostat = 0;
511
512 for (i=0; i<6; i++) tmp_field -> thermo_opts[i] = 0.0;
513 if (tmp_field -> ensemble)
514 {
517 add_box_child_start (GTK_ORIENTATION_VERTICAL, ens_box, thermo_option_box, FALSE, FALSE, 0);
518 }
519}
520
527{
528 GtkWidget * vbox = create_vbox (5);
529 GtkWidget * hbox = create_hbox (5);
530 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
531 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Ensemble:"), 100, -1, 0.0, 0.5), FALSE, FALSE, 30);
532 GtkWidget * ensemble = create_combo ();
533 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ensemble, FALSE, FALSE, 0);
534 int i;
535 for (i=0; i<DLP_ENS; i++)
536 {
537 combo_text_append (ensemble, md_ensemble[i]);
538 }
539 combo_set_active (ensemble, tmp_field -> ensemble);
540 g_signal_connect (G_OBJECT (ensemble), "changed", G_CALLBACK(set_ensemble), NULL);
541
543 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, ens_box, FALSE, FALSE, 0);
544 if (tmp_field -> ensemble)
545 {
547 add_box_child_start (GTK_ORIENTATION_VERTICAL, ens_box, thermo_option_box, FALSE, FALSE, 0);
548 }
549 gtk_widget_set_size_request (vbox, -1, 390);
550
551 gboolean val = (tmp_field -> thermo_opts[6] == 1.0) ? TRUE : FALSE;
552 bath_box = create_hbox (5);
553 add_box_child_end (vbox, bath_box, FALSE, FALSE, 0);
554 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);
556 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label(_("Thermostat type:"), 150, -1, 0.0, 0.5), FALSE, FALSE, 0);
557 GtkWidget * combo = create_combo();
558 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, combo, FALSE, FALSE, 00);
559 combo_text_append (combo, _("Langevin + Direct"));
560 combo_text_append (combo, "Langevin");
561 combo_text_append (combo, "Gauss");
562 combo_text_append (combo, _("Direct"));
563 combo_set_active (combo, (int)tmp_field -> thermo_opts[7]);
564 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_thermostat), GINT_TO_POINTER(1));
565 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label(_("Thickness:"), 100, -1, 1.0, 0.5), FALSE, FALSE, 0);
566 GtkWidget * entry = create_entry(G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(8));
567 update_entry_double (GTK_ENTRY(entry), tmp_field -> thermo_opts[8]);
568 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, entry, FALSE, FALSE, 5);
569 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label("<b>&#xC5;</b>", 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
570 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label(_("Target T°:"), 100, -1, 1.0, 0.5), FALSE, FALSE, 0);
571 entry = create_entry (G_CALLBACK(set_thermo_param), 100, 10, FALSE, GINT_TO_POINTER(9));
572 update_entry_double (GTK_ENTRY(entry), tmp_field -> thermo_opts[9]);
573 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, entry, FALSE, FALSE, 5);
574 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, bath_box, markup_label("<b>K</b>", 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
575 return vbox;
576}
577
578GtkWidget * step_button;
579GtkWidget * extra_vbox[2];
580GtkWidget * extra_lab[4];
581gchar * md_data[6] = {i18n("Target temperature:"), i18n("Verlet integrator:"), i18n("Number of steps:"), i18n("Time step δt:"), i18n("Target pressure:"), ""};
582gchar * md_extra[2][4] = {{i18n("Shake iterations limit:"), i18n("Shake tolerance:"), "", ""},
583 {i18n("Rattle iterations limit:"), i18n("Rattle tolerance:"), i18n("FIQA iterations limit:"), i18n("FIQA quaternions tolerance:")}};
584gchar * md_unit[6] = {"<b>K</b>", "", "", "<b>ps</b>", "<b>katms</b>", ""};
585gchar * extra_unit[4] = {i18n("<b>cycle(s)</b>"), "", i18n("<b>cycle(s)</b>"), ""};
586gchar * dt_data[3] = {i18n("Maximum time step:"), i18n("Maximum distance allowed:"), i18n("Minimum distance allowed:")};
587gchar * dt_unit[3] = {"<b>ps</b>", "<b>&#xC5;</b>", "<b>&#xC5;</b>"};
588gchar * md_combo[2][2] = {{i18n("Velocity"), i18n("Leapfrog")}, {i18n("Fixed"), i18n("Variable")}};
589
598G_MODULE_EXPORT void set_md_param (GtkEntry * res, gpointer data)
599{
600 int i;
601 i = GPOINTER_TO_INT(data);
602 const gchar * m = entry_get_text (res);
603 double v = string_to_double ((gpointer)m);
604 if (i == 14)
605 {
606 if (v >= 1.0 && v <= tmp_proj -> natomes)
607 {
608 tmp_field -> md_opts[i] = v;
609 }
610 }
611 else if (v >= 0.0 && v != tmp_field -> md_opts[i])
612 {
613 tmp_field -> md_opts[i] = v;
614 }
615 if (i == 2 || i == 9 || i == 11 || i == 14 || i == 15)
616 {
617 update_entry_int (res, (int)tmp_field -> md_opts[i]);
618 }
619 else
620 {
621 update_entry_double (res, tmp_field -> md_opts[i]);
622 }
623}
624
633G_MODULE_EXPORT void show_advance_time_step (GtkButton * but, gpointer data)
634{
635 GtkWidget * dialog = dialogmodal (_("Variable time step information"), GTK_WINDOW(field_assistant));
636 GtkWidget * vbox = dialog_get_content_area (dialog);
637 GtkWidget * hbox;
638 GtkWidget * entry;
639 int i, j;
640 i = 6;
641 for (j=0; j<3; j++)
642 {
643 hbox = create_hbox (0);
644 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 2);
645 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(dt_data[j]), 250, -1, 1.0, 0.5), FALSE, FALSE, 5);
646 entry = create_entry (G_CALLBACK(set_md_param), 100, 10, FALSE, GINT_TO_POINTER(i+j));
647 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[i+j]);
648 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
649 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(dt_unit[j], 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
650 }
651 run_this_gtk_dialog (dialog, G_CALLBACK(run_destroy_dialog), NULL);
652}
653
662G_MODULE_EXPORT void set_md_combo (GtkComboBox * box, gpointer data)
663{
664 int i, j;
665 i = GPOINTER_TO_INT(data);
666 tmp_field -> md_opts[i] = combo_get_active ((GtkWidget *)box);
667 if (i == 3) widget_set_sensitive (step_button, (int)tmp_field -> md_opts[i]);
668 if (i == 3 && tmp_field -> md_opts[i] == 1.0) show_advance_time_step (NULL, NULL);
669 if (i == 1)
670 {
671 gtk_widget_set_visible (extra_vbox[1], (int)tmp_field -> md_opts[1]);
672 for (j=0 ;j<2; j++)
673 {
674 gtk_label_set_text (GTK_LABEL(extra_lab[2*j]),
675 ((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]);
676 gtk_label_set_text (GTK_LABEL(extra_lab[2*j+1]),
677 ((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]);
678 }
679 }
680}
681
682GtkWidget * impact_but;
683gchar * imp_dir[3] = {"x", "y", "z"};
684
685#ifdef GTK4
694G_MODULE_EXPORT void check_impact (GtkCheckButton * but, gpointer data)
695#else
704G_MODULE_EXPORT void check_impact (GtkToggleButton * but, gpointer data)
705#endif
706{
707 gboolean i = button_get_status ((GtkWidget *)but);
708 tmp_field -> md_opts[13] = (i) ? 1.0 : 0.0;
710}
711
720G_MODULE_EXPORT void show_impact_dialog (GtkButton * but, gpointer data)
721{
722 GtkWidget * dialog = dialogmodal (_("Initiate impact on particle"), GTK_WINDOW(field_assistant));
723 GtkWidget * vbox = dialog_get_content_area (dialog);
724 GtkWidget * hbox, * hhbox;
725 GtkWidget * entry;
726 int i, j;
727 gchar * str;
728 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
729 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):")};
730 gchar * imp_unit[2] = {i18n("<b>n<sup>th</sup> step</b>"), "<b>k eV</b>"};
731
732 for (i=0; i<4; i++)
733 {
734 hbox = create_hbox (5);
735 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 2);
736 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(imp_info[i]), 200, -1, 1.0, 0.5), FALSE, FALSE, 5);
737 if (i < 3)
738 {
739 j = (i < 2) ? 5 : 10;
740 entry = create_entry (G_CALLBACK(set_md_param), j*10, j + j/6, FALSE, GINT_TO_POINTER(i+14));
741 if (i < 2)
742 {
743 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> md_opts[i+14]);
744 }
745 else
746 {
747 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[i+14]);
748 }
749 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
750 if (! i)
751 {
752 str = g_strdup_printf ("<b>∈ [1-%d]</b>", tmp_proj -> natomes);
753 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(str, 30, -1, 0.0, 0.5), FALSE, FALSE, 0);
754 g_free (str);
755 }
756 else
757 {
758 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);
759 }
760 }
761 else
762 {
763 hbox = create_hbox (5);
764 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 2);
765 hhbox = create_hbox (5);
766 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 50);
767 for (j=0; j<3; j++)
768 {
769 str = g_strdup_printf (_("on %s:"), imp_dir[j]);
770 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(str, 50, -1, 1.0, 0.5), FALSE, FALSE, 0);
771 g_free (str);
772 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(j+17));
773 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[j+17]);
774 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, entry, FALSE, FALSE, 5);
775
776 }
777 }
778 }
779 run_this_gtk_dialog (dialog, G_CALLBACK(run_destroy_dialog), NULL);
780}
781
787GtkWidget * create_md_box ()
788{
789 GtkWidget * vbox = create_vbox (BSEP);
790 gtk_widget_set_size_request (vbox, -1, 450);
791 GtkWidget * hbox;
792 GtkWidget * combo;
793 GtkWidget * entry;
794 int i, j, k, l;
795 l = 0;
796 for (i=0; i<3; i++)
797 {
798 hbox = create_hbox (5);
799 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
800 for (j=0; j<2; j++, l++)
801 {
802 k = (j) ? 110 : 150;
803 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox,
804 markup_label((2*i+j) < 5 ? _(md_data[2*i+j]) :md_data[2*i+j], k, -1, 1.0, 0.5),
805 FALSE, FALSE, 5);
806 if (j)
807 {
808 if (i < 2)
809 {
810 combo = create_combo ();
811 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 0);
812 for (k=0; k<2; k++)
813 {
814 combo_text_append (combo, _(md_combo[i][k]));
815 }
816 combo_set_active (combo, 0);
817 gtk_widget_set_size_request (combo, 100, -1);
818 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_md_combo), GINT_TO_POINTER(l));
819 if (i)
820 {
821 l ++;
822 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(l));
823 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[l]);
824 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
825 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(md_unit[l-1], 30, -1, 0.0, 0.5), FALSE, FALSE, 0);
826 }
827 }
828 else
829 {
830 step_button = create_button (_("Time step details"), IMG_NONE, NULL, 100, -1, GTK_RELIEF_NORMAL, G_CALLBACK(show_advance_time_step), NULL);
831 widget_set_sensitive (step_button, (int)tmp_field -> md_opts[3]);
832 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, step_button, FALSE, FALSE, 10);
833 }
834 }
835 else
836 {
837 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(l));
838 if (i == 1 && j == 0)
839 {
840 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> md_opts[l]);
841 }
842 else
843 {
844 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[l]);
845 }
846 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
847 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(md_unit[2*i+j], 60, -1, 0.0, 0.5), FALSE, FALSE, 0);
848 }
849 }
850 }
851
852 k = (int)tmp_field -> md_opts[1];
853 l = 9;
854 gchar * extra_info[2] = {i18n("<b>Bond constraint(s) dynamics:</b>"), i18n("<b>Rotational motion of rigid body(ies):</b>")};
855 for (i=0; i<2; i++)
856 {
857 extra_vbox[i] = create_vbox (5);
858 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, extra_vbox[i], FALSE, FALSE, 20);
859 add_box_child_start (GTK_ORIENTATION_VERTICAL, extra_vbox[i], markup_label(_(extra_info[i]), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
860 hbox = create_hbox (5);
861 add_box_child_start (GTK_ORIENTATION_VERTICAL, extra_vbox[i], hbox, FALSE, FALSE, 0);
862 for (j=0; j<2; j++, l++)
863 {
864 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);
865 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, extra_lab[2*i+j], FALSE, FALSE, 5);
866 entry = create_entry (G_CALLBACK(set_md_param), 100, 11, FALSE, GINT_TO_POINTER(l));
867 if (j)
868 {
869 update_entry_double (GTK_ENTRY(entry), tmp_field -> md_opts[l]);
870 }
871 else
872 {
873 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> md_opts[l]);
874 }
875 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
876 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);
877 }
878 }
879 gtk_widget_set_visible (extra_vbox[1], (int)tmp_field -> md_opts[1]);
880 j = (int)tmp_field -> md_opts[1];
881 for (i=0 ;i<2; i++)
882 {
883 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]);
884 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]);
885 }
886
887 hbox = create_hbox (5);
888 add_box_child_end (vbox, hbox, FALSE, FALSE, 0);
889 gboolean val = (tmp_field -> md_opts[13] == 1.0) ? TRUE : FALSE;
890 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);
891 impact_but = create_button (_("Impact details"), IMG_NONE, NULL, 100, -1, GTK_RELIEF_NORMAL, G_CALLBACK(show_impact_dialog), NULL);
893 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, impact_but, FALSE, FALSE, 10);
894 return vbox;
895}
896
897GtkWidget * equi_lab[6];
898GtkWidget * equi_entry[3];
899GtkWidget * equi_box[9];
900
901gchar * equi_info[8]= {i18n("Equilibrate for the first:"), i18n("Scale temperature:"), i18n("Cap forces:"),
902 i18n("Resample the momenta distribution:"), i18n("Minimize system configuration:"),
903 i18n("Optimize system configuration from start:"), i18n("Perform zero temperature (10 K) optimization"), i18n("Include equilibration data in statistics")};
904gchar * equi_data[5]= {i18n("Every:"), "f<sub>max</sub>=", i18n("During:"), i18n("Minimize:"), i18n("Optimize")};
905gchar * equi_unit[3]= {i18n("<b>step(s)</b>"), "<b>k<sub><i>B</i></sub>T / &#xC5;</b>", i18n("<b>step(s)</b>")};
906gchar * equi_min[3]= {i18n("Force"), i18n("Energy"), i18n("Distance")};
907gchar * equi_minu[3]= {"<b>k<sub><i>B</i></sub>T / &#xC5;</b>", "", "<b>&#xC5;</b>"};
908
909double equi_lim[2][3] = {{1.0, 0.0, 0.000001}, {1000.0, 0.01, 0.1}};
910float init_minop[3]={50.0, 0.005, 0.005};
911
920G_MODULE_EXPORT void set_equi_combo (GtkComboBox * box, gpointer data)
921{
922 int i, j, k;
923 i = GPOINTER_TO_INT(data);
924 tmp_field -> equi_opts[i] = combo_get_active ((GtkWidget *)box);
925 j = (i == 9) ? 11 : 14;
926 k = (i == 9) ? 0 : 1;
927 tmp_field -> equi_opts[j] = init_minop[(int)tmp_field -> equi_opts[i]];
928 update_entry_double (GTK_ENTRY(equi_entry[2*k]), tmp_field -> equi_opts[j]);
929 gtk_label_set_text (GTK_LABEL(equi_lab[4*k]), g_strdup_printf ("%s:", _(equi_min[(int)tmp_field -> equi_opts[i]])));
930 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]]));
931 gtk_label_set_use_markup (GTK_LABEL(equi_lab[4*k+1]), TRUE);
932}
933
942G_MODULE_EXPORT void set_equi_param (GtkEntry * res, gpointer data)
943{
944 int i, j;
945 i = GPOINTER_TO_INT(data);
946 const gchar * m = entry_get_text (res);
947 double v = string_to_double ((gpointer)m);
948 if (i == 10 || i == 14)
949 {
950 j = (i == 10) ? 9 : 13;
951 if (v >= equi_lim[0][(int)tmp_field -> equi_opts[j]] && v <= equi_lim[1][(int)tmp_field -> equi_opts[j]])
952 {
953 tmp_field -> equi_opts[i] = v;
954 }
955 else
956 {
957 gchar * str = g_strdup_printf (_("Minimization parameter must ∈ [ %f - %f ]"),
958 equi_lim[0][(int)tmp_field -> equi_opts[j]], equi_lim[1][(int)tmp_field -> equi_opts[j]]);
960 g_free (str);
961 }
962 }
963 else if (v >= 0.0 && v != tmp_field -> equi_opts[i])
964 {
965 tmp_field -> equi_opts[i] = v;
966 }
967 if (i == 1 || i == 3 || i == 7 || i == 11)
968 {
969 update_entry_int (res, (int)tmp_field -> equi_opts[i]);
970 }
971 else
972 {
973 update_entry_double (res, tmp_field -> equi_opts[i]);
974 }
975}
976
977#ifdef GTK4
986G_MODULE_EXPORT void check_equi (GtkCheckButton * but, gpointer data)
987#else
996G_MODULE_EXPORT void check_equi (GtkToggleButton * but, gpointer data)
997#endif
998{
999 int i, k;
1000 i = GPOINTER_TO_INT(data);
1001 gboolean j = button_get_status ((GtkWidget *)but);
1002 k = 2*i + 2*(i/5) + i/6 - i/7;
1003 tmp_field -> equi_opts[k] = (j) ? 1.0 : 0.0;
1004 if (i < 6) widget_set_sensitive (equi_box[i], j);
1005}
1006
1012GtkWidget * create_equi_box ()
1013{
1014 GtkWidget * vbox = create_vbox (5);
1015 GtkWidget * hbox, * hhbox;
1016 GtkWidget * entry;
1017 GtkWidget * combo;
1018 gboolean val;
1019 int i, j, k, l, m;
1020 hbox = create_hbox (5);
1021 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1022 val = (tmp_field -> equi_opts[0] == 1.0) ? TRUE : FALSE;
1023 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);
1024 equi_box[0] = create_vbox (5);
1026 gtk_box_set_homogeneous (GTK_BOX (equi_box[0]), TRUE);
1027 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, equi_box[0], FALSE, FALSE, 0);
1028 for (i=0; i<8; i++)
1029 {
1030 hbox = create_hbox (5);
1031 j = 2*i + 2*(i/5) - i/7;
1032 k = (i != 2) ? 5 : 10;
1033 l = j + 1;
1034
1035 add_box_child_start (GTK_ORIENTATION_VERTICAL, equi_box[0], hbox, FALSE, FALSE, 0);
1036
1037 if (i < 4)
1038 {
1039 entry = create_entry (G_CALLBACK(set_equi_param), k*10, k + k/6, FALSE, GINT_TO_POINTER(l));
1040 if (i == 2)
1041 {
1042 update_entry_double (GTK_ENTRY(entry), tmp_field -> equi_opts[l]);
1043 }
1044 else
1045 {
1046 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> equi_opts[l]);
1047 }
1048 }
1049 if (i)
1050 {
1051 val = (tmp_field -> equi_opts[j] == 1.0) ? TRUE : FALSE;
1052 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);
1053 if (i == 4 || i == 5)
1054 {
1055 hhbox = create_hbox (5);
1056 add_box_child_start (GTK_ORIENTATION_VERTICAL, equi_box[0], hhbox, FALSE, FALSE, 0);
1057 hbox = create_hbox (5);
1058 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, hbox, FALSE, FALSE, 50);
1059 }
1060 equi_box[i] = create_hbox (5);
1062 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, equi_box[i], FALSE, FALSE, 5);
1063 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);
1064 if (i < 4)
1065 {
1066 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], entry, FALSE, FALSE, 5);
1067 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);
1068 }
1069 else if (i < 6)
1070 {
1071 combo = create_combo();
1072 for (m=0; m<3; m++) combo_text_append (combo, _(equi_min[m]));
1073 combo_set_active (combo, (int)tmp_field -> equi_opts[l]);
1074 gtk_widget_set_size_request (combo, 100, -1);
1075 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_equi_combo), GINT_TO_POINTER(l));
1076 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], combo, FALSE, FALSE, 5);
1077 for (m=i-4; m<2; m++, l++)
1078 {
1079 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);
1080 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], equi_lab[(i-4)*2+2*m], FALSE, FALSE, 0);
1081 k = (i == 4 && m) ? 5 : 10;
1082 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));
1083 if (i == 4 && m)
1084 {
1085 update_entry_int (GTK_ENTRY(equi_entry[i-4+m]), (int)tmp_field -> equi_opts[l+1+m/2]);
1086 }
1087 else
1088 {
1089 update_entry_double (GTK_ENTRY(equi_entry[i-4+m]), tmp_field -> equi_opts[l+1+m/2]);
1090 }
1091 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], equi_entry[i-4+m], FALSE, FALSE, 5);
1092 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);
1093 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, equi_box[i], equi_lab[(i-4)*2+2*m+1], FALSE, FALSE, 0);
1094 }
1095 }
1096 }
1097 else
1098 {
1099 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(equi_info[i]), 250, -1, 0.8, 0.5), FALSE, FALSE, 0);
1100 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
1101 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);
1102 }
1103 }
1104 return vbox;
1105}
1106
1107gchar * traj_data[4] = {i18n("Defects:"),
1108 i18n("Displacements:"),
1109 i18n("History:"),
1110 i18n("Atom's MSD:")};
1111
1112gchar * traj_info[4][3] = {{i18n("From step:"), i18n("Every:"), i18n("Site interstitial cutoff:")},
1113 {i18n("From step:"), i18n("Every:"), i18n("Qualifying cutoff:")},
1114 {i18n("From step:"), i18n("Every:"), i18n("Data level:")},
1115 {i18n("From step:"), i18n("Every:"), NULL}};
1116
1117gchar * traj_level[3]={"0", "1", "2"};
1118
1119gchar * out_print[3]={i18n("Radial distribution functions (RDFs):"),
1120 i18n("Velocity autocorrelation functions (VAFs):"),
1121 i18n("Z density profile:")};
1122
1123GtkWidget * out_hbox[11];
1124GtkWidget * out_entry[3];
1125
1134G_MODULE_EXPORT void set_out_param (GtkEntry * res, gpointer data)
1135{
1136 int i;
1137 i = GPOINTER_TO_INT(data);
1138 const gchar * m = entry_get_text (res);
1139 double v = string_to_double ((gpointer)m);
1140 if (i == 3 || i == 7 || i == 23)
1141 {
1142 if (v >= 0.0 && v != tmp_field -> out_opts[i])
1143 {
1144 tmp_field -> out_opts[i] = v;
1145 }
1146 update_entry_double (res, tmp_field -> out_opts[i]);
1147 if (i == 23)
1148 {
1149 update_entry_double (GTK_ENTRY(out_entry[0]), tmp_field -> out_opts[i]);
1150 update_entry_double (GTK_ENTRY(out_entry[2]), tmp_field -> out_opts[i]);
1151 }
1152 }
1153 else
1154 {
1155 if ((int)v != (int)tmp_field -> out_opts[i])
1156 {
1157 tmp_field -> out_opts[i] = (int)v;
1158 }
1159 update_entry_int (res, (int)tmp_field -> out_opts[i]);
1160 }
1161}
1162
1163#ifdef GTK4
1172G_MODULE_EXPORT void check_out (GtkCheckButton * but, gpointer data)
1173#else
1182G_MODULE_EXPORT void check_out (GtkToggleButton * but, gpointer data)
1183#endif
1184{
1185 int i, k;
1186 i = GPOINTER_TO_INT(data);
1187 gboolean j = button_get_status ((GtkWidget *)but);
1188 if (i < 7)
1189 {
1190 k = 4*i - i/4 - 2*(i/5) - 2*(i/6);
1191 tmp_field -> out_opts[k] = (j) ? 1.0 : 0.0;
1193 }
1194 else
1195 {
1196 tmp_field -> out_opts[i] = (j) ? 1.0 : 0.0;
1197 if (i < 29)
1198 {
1199 k = (i == 21) ? 7 : (i == 24) ? 8 : 9;
1201 if (i == 24) widget_set_sensitive (out_hbox[10], j);
1202 }
1203 }
1204}
1205
1214G_MODULE_EXPORT void set_print_level (GtkComboBox * box, gpointer data)
1215{
1216 tmp_field -> out_opts[12] = combo_get_active ((GtkWidget *)box);
1217}
1218
1224GtkWidget * create_traj_box ()
1225{
1226 GtkWidget * vbox = create_vbox (5);
1227 GtkWidget * hbox;
1228 GtkWidget * combo;
1229 GtkWidget * entry;
1230 gboolean val;
1231 int i, j, k, l;
1232 for (i=0; i<4; i++)
1233 {
1234 hbox = create_hbox (0);
1235 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1236 k = (i < 4) ? 4*i : 15;
1237 val = (tmp_field -> out_opts[k] == 1.0) ? TRUE : FALSE;
1238 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);
1239 out_hbox[i] = create_hbox (5);
1240 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[i], FALSE, FALSE, 0);
1242
1243 for (j=0; j<3-i/3; j++)
1244 {
1245 l = (j == 2) ? 150 : 50;
1246 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);
1247 if (i != 2 || j != 2)
1248 {
1249 l = (j<2) ? 50 : 100;
1250 entry = create_entry (G_CALLBACK(set_out_param), l, l/10, FALSE, GINT_TO_POINTER(k+j+1));
1251 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], entry, FALSE, FALSE, 0);
1252 if (j == 2)
1253 {
1254 update_entry_double (GTK_ENTRY(entry), tmp_field -> out_opts[k+j+1]);
1255 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1256 }
1257 else
1258 {
1259 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[k+j+1]);
1260 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);
1261 }
1262 }
1263 else
1264 {
1265 combo = create_combo();
1266 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], combo, FALSE, FALSE, 0);
1267 for (l=0; l<3; l++) combo_text_append (combo, traj_level[l]);
1268 combo_set_active (combo, (int)tmp_field -> out_opts[k+j+1]);
1269 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_print_level), NULL);
1270 }
1271 }
1272 }
1273 return vbox;
1274}
1275
1281GtkWidget * create_dump_box ()
1282{
1283 GtkWidget * vbox = create_vbox (5);
1284 GtkWidget * hbox;
1285 GtkWidget * entry;
1286
1287 hbox = create_hbox (0);
1288 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1289 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Dump restart information every:"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
1290 entry = create_entry (G_CALLBACK(set_out_param), 50, 6, FALSE, GINT_TO_POINTER(30));
1291 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
1292 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[30]);
1293 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("<b>step(s)</b>"), 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1294
1295 return vbox;
1296}
1297
1298gchar * out_data[3] = {i18n("Print system data:"),
1299 i18n("Accumulate statistics data:"),
1300 i18n("Rolling average stack:")};
1301
1302gchar * out_info[3] = {i18n("Every:"), i18n("Every:"), " "};
1303
1309GtkWidget * create_out_box ()
1310{
1311 GtkWidget * vbox = create_vbox (5);
1312 GtkWidget * hbox;
1313 GtkWidget * entry;
1314 gboolean val;
1315 int i, j;
1316 for (i=4; i<7; i++)
1317 {
1318 hbox = create_hbox (0);
1319 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1320 j = 2*(i-4)+15;
1321 val = (tmp_field -> out_opts[j] == 1.0) ? TRUE : FALSE;
1322 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);
1323 out_hbox[i] = create_hbox (5);
1324 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[i], FALSE, FALSE, 0);
1326 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);
1327 entry = create_entry (G_CALLBACK(set_out_param), 50, 5, FALSE, GINT_TO_POINTER(j+1));
1328 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i], entry, FALSE, FALSE, 0);
1329 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[j+1]);
1330 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);
1331 }
1332 return vbox;
1333}
1334
1341{
1342 GtkWidget * vbox = create_vbox (5);
1343 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
1344 GtkWidget * hbox, * hhbox;
1345 GtkWidget * entry;
1346 gboolean val;
1347 int i, k, l, m, n;
1348 i = 6;
1349 for (l=0; l<3; l++)
1350 {
1351 k = 21 + 3*l;
1352 hbox = create_hbox (5);
1353 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1354 val = (tmp_field -> out_opts[k] == 1.0) ? TRUE : FALSE;
1355 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);
1356 out_hbox[i+l+1] = create_hbox (5);
1358 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[i+l+1], FALSE, FALSE, 5);
1359 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], markup_label(_("Every:"), 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1360 entry = create_entry (G_CALLBACK(set_out_param), 50, 5, FALSE, GINT_TO_POINTER(k+1));
1361 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> out_opts[k+1]);
1362 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], entry, FALSE, FALSE, 0);
1363 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);
1364 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);
1365 m = (l==1) ? k + 2 : 23;
1366 n = (l==1) ? 1 : 2;
1367 out_entry[l] = create_entry (G_CALLBACK(set_out_param), n*50, n*5, FALSE, GINT_TO_POINTER(m));
1368 if (l != 1)
1369 {
1370 update_entry_double (GTK_ENTRY(out_entry[l]), tmp_field -> out_opts[m]);
1371 }
1372 else
1373 {
1374 update_entry_int (GTK_ENTRY(out_entry[l]), (int)tmp_field -> out_opts[m]);
1375 }
1376 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, out_hbox[i+l+1], out_entry[l], FALSE, FALSE, 0);
1377 if (l != 1)
1378 {
1379 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);
1380 }
1381 if (l == 1)
1382 {
1383 hbox = create_hbox (0);
1384 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1385 out_hbox[10] = create_hbox (0);
1386 hhbox = create_hbox (0);
1387 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 0);
1388 gtk_widget_set_size_request (hhbox, 330, -1);
1389 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, out_hbox[10], FALSE, FALSE, 0);
1390 val = (tmp_field -> out_opts[29] == 1.0) ? TRUE : FALSE;
1391 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);
1393 }
1394 }
1395 return vbox;
1396}
1397
1398GtkWidget * ana_box[5];
1399gchar * ana_info[5]={i18n("All:"), i18n("Bonds:"), i18n("Angles:"), i18n("Dihedrals:"), i18n("Inversions:")};
1400gchar * ana_param[3]={i18n("Every:"), i18n("Num. δ"), i18n("Cutoff = ")};
1401
1410G_MODULE_EXPORT void set_ana_param (GtkEntry * res, gpointer data)
1411{
1412 int i;
1413 i = GPOINTER_TO_INT(data);
1414 const gchar * m = entry_get_text (res);
1415 double v = string_to_double ((gpointer)m);
1416 if (v >= 0.0 && v != tmp_field -> ana_opts[i])
1417 {
1418 tmp_field -> ana_opts[i] = v;
1419 }
1420 if (i == 3 || i == 7)
1421 {
1422 update_entry_double (GTK_ENTRY(res), tmp_field -> ana_opts[i]);
1423 }
1424 else
1425 {
1426 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> ana_opts[i]);
1427 }
1428}
1429
1430#ifdef GTK4
1439G_MODULE_EXPORT void check_ana (GtkCheckButton * but, gpointer data)
1440#else
1449G_MODULE_EXPORT void check_ana (GtkToggleButton * but, gpointer data)
1450#endif
1451{
1452 int i, k;
1453 i = GPOINTER_TO_INT(data);
1454 gboolean j = button_get_status ((GtkWidget *)but);
1455 tmp_field -> ana_opts[i] = (j) ? 1.0 : 0.0;
1456 switch (i)
1457 {
1458 case 14:
1459 k = 4;
1460 break;
1461 case 11:
1462 k = 3;
1463 break;
1464 default:
1465 k = i / 4;
1466 break;
1467 }
1469}
1470
1477{
1478 GtkWidget * vbox = create_vbox (5);
1479 GtkWidget * hbox;
1480 GtkWidget * entry;
1481 gboolean val;
1482 gchar * str;
1483
1484 int i, j;
1485 for (i=0; i<5; i++)
1486 {
1487 hbox = create_hbox (5);
1488 j = (i < 3) ? 4*i: 11 + 3*(i-3);
1489 val = (tmp_field -> ana_opts[j] == 1.0) ? TRUE : FALSE;
1490 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1491 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);
1492 ana_box[i] = create_hbox (5);
1493
1495 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ana_box[i], FALSE, FALSE, 0);
1496
1497 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(_(ana_param[0]), 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1498 entry = create_entry (G_CALLBACK(set_ana_param), 50, 5, FALSE, GINT_TO_POINTER(j+1));
1499
1500 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> ana_opts[j+1]);
1501 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], entry, FALSE, FALSE, 0);
1502 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);
1503 if (i < 2)
1504 {
1505 str = g_strdup_printf (_("%sr in [0 : r]"), _(ana_param[1]));
1506 }
1507 else if (i == 3)
1508 {
1509 str = g_strdup_printf (_("%s° in [-180 : 180]"), _(ana_param[1]));
1510 }
1511 else
1512 {
1513 str = g_strdup_printf (_("%s° in [0 : 180]"), _(ana_param[1]));
1514 }
1515 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(str, 160, -1, 1.0, 0.5), FALSE, FALSE, 5);
1516 g_free (str);
1517 entry = create_entry (G_CALLBACK(set_ana_param), 50, 5, FALSE, GINT_TO_POINTER(j+2));
1518 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> ana_opts[j+2]);
1519 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], entry, FALSE, FALSE, 0);
1520 if (i < 2)
1521 {
1522 str = g_strdup_printf ("<b>δr</b>");
1523 }
1524 else
1525 {
1526 str = g_strdup_printf ("<b>δ°</b>");
1527 }
1528 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(str, 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1529 g_free (str);
1530 if (i < 2)
1531 {
1532 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label(_(ana_param[2]), 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1533 entry = create_entry (G_CALLBACK(set_ana_param), 100, 11, FALSE, GINT_TO_POINTER(j+3));
1534 update_entry_double (GTK_ENTRY(entry), tmp_field -> ana_opts[j+3]);
1535 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], entry, FALSE, FALSE, 0);
1536 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ana_box[i], markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1537 }
1538
1539 }
1540 return vbox;
1541}
1542
1543GtkWidget * time_box[2];
1544GtkWidget * io_box[2];
1545GtkWidget * io_pre;
1546GtkWidget * misc_box;
1547gchar * time_info[2]={i18n("Set job time:"), i18n("Set job closure time:")};
1548gchar * io_rw_m[4] = {"MPI I/O", "FORTRAN I/O", i18n("Traditional master I/O"), "netCDF I/O"};
1549gchar * io_info[2] = {i18n("<b>General Input/Output (I/O) read interface:</b>"), i18n("<b>General Input/Output (I/O) write interface:</b>")};
1550gchar * io_para[4] = {i18n("Reader count:"), i18n("Batch size:"), i18n("Buffer size:"), i18n("// error check")};
1551gchar * io_pres[2] = {"Float - 32 bit", "Double - 64 bit"};
1552GtkWidget * io_hp[2][4];
1553GtkWidget * check_e[2];
1554
1563G_MODULE_EXPORT void set_io_param (GtkEntry * res, gpointer data)
1564{
1565 int i;
1566 i = GPOINTER_TO_INT(data);
1567 const gchar * m = entry_get_text (res);
1568 double v = string_to_double ((gpointer)m);
1569 if (i < 2)
1570 {
1571 if (v >= 0.0 && v != tmp_field -> io_opts[2*i+1])
1572 {
1573 tmp_field -> io_opts[2*i+1] = v;
1574 }
1575 update_entry_double (GTK_ENTRY(res), tmp_field -> io_opts[2*i+1]);
1576 }
1577 else
1578 {
1579 if (i == 7 || i == 15)
1580 {
1581 if (v >= 1.0 && v <= 100000000.0)
1582 {
1583 if (v != tmp_field -> io_opts[i])
1584 {
1585 tmp_field -> io_opts[i] = v;
1586 }
1587 }
1588 else
1589 {
1590 show_warning (_("The batch size or max. number of particles by batch\n"
1591 "must &#x2208; [1 - 10 000 000]"),
1593 }
1594 }
1595 else if (i == 8 || i == 16)
1596 {
1597 if (v >= 100.0 && v <= 100000.0)
1598 {
1599 if (v != tmp_field -> io_opts[i])
1600 {
1601 tmp_field -> io_opts[i] = v;
1602 }
1603 }
1604 else
1605 {
1606 show_warning (_("The buffer size or max. number of ASCII line records by batch\nmust &#x2208; [100 - 100 000]"), field_assistant);
1607 }
1608 }
1609 else if (i == 19 || i == 20 || i == 21)
1610 {
1611 if (v != tmp_field -> io_opts[i])
1612 {
1613 tmp_field -> io_opts[i] = v;
1614 }
1615 }
1616 else if (v > 0.0 && v != tmp_field -> io_opts[i])
1617 {
1618 tmp_field -> io_opts[i] = v;
1619 }
1620 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> io_opts[i]);
1621 }
1622}
1623
1624#ifdef GTK4
1633G_MODULE_EXPORT void check_io (GtkCheckButton * but, gpointer data)
1634#else
1643G_MODULE_EXPORT void check_io (GtkToggleButton * but, gpointer data)
1644#endif
1645{
1646 int i, k;
1647 i = GPOINTER_TO_INT(data);
1648 gboolean j = button_get_status ((GtkWidget *)but);
1649 if (i < 2)
1650 {
1651 tmp_field -> io_opts[2*i] = (j) ? 1.0 : 0.0;
1653 }
1654 else
1655 {
1656 tmp_field -> io_opts[i] = (j) ? 1.0 : 0.0;
1657 if (i < 18)
1658 {
1659 k = (i == 4) ? 0 : 1;
1661 }
1662 else if (i == 18)
1663 {
1665 }
1666 }
1667}
1668
1677G_MODULE_EXPORT void set_io_method (GtkComboBox * box, gpointer data)
1678{
1679 int i, j, k;
1680 gboolean l;
1681 i = GPOINTER_TO_INT(data);
1682 j = combo_get_active ((GtkWidget *)box);
1683 tmp_field -> io_opts[i] = (double)j;
1684 if (i < 12)
1685 {
1686 k = (i == 5) ? 0 : 1;
1687 l = (j == 2) ? FALSE : TRUE;
1688 widget_set_sensitive (io_hp[k][0], l);
1689 widget_set_sensitive (io_hp[k][2], l);
1691 if (i == 11)
1692 {
1693 l = (j == 3) ? TRUE : FALSE;
1695 }
1696 }
1697}
1698
1704GtkWidget * create_job_box ()
1705{
1706 GtkWidget * vbox = create_vbox (BSEP);
1707 GtkWidget * hbox;
1708 GtkWidget * entry;
1709 gboolean val;
1710 int i;
1711 for (i=0; i<2; i++)
1712 {
1713 hbox = create_hbox (5);
1714 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
1715 val = (tmp_field -> io_opts[2*i] == 1.0) ? TRUE : FALSE;
1716 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);
1717 time_box[i] = create_hbox (5);
1719 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, time_box[i], FALSE, FALSE, 0);
1720 entry = create_entry (G_CALLBACK(set_io_param), 100, 11, FALSE, GINT_TO_POINTER(i));
1721 update_entry_double (GTK_ENTRY(entry), tmp_field -> io_opts[i*2+1]);
1722 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, time_box[i], entry, FALSE, FALSE, 5);
1723 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, time_box[i], markup_label("<b>s</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
1724 }
1725 return vbox;
1726}
1727
1733GtkWidget * create_io_box ()
1734{
1735 GtkWidget * vbox = create_vbox (BSEP);
1736 GtkWidget * hbox;
1737 GtkWidget * combo;
1738 GtkWidget * entry;
1739 gboolean val;
1740 int i, j, k;
1741 gboolean l, m;
1742 k = 4;
1743 for (i=0; i<2; i++)
1744 {
1745 hbox = create_hbox (5);
1746 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 10);
1747 val = (tmp_field -> io_opts[k] == 1.0) ? TRUE : FALSE;
1748 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);
1749 io_box[i] = create_vbox (5);
1751 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, io_box[i], FALSE, FALSE, 0);
1752 hbox = create_hbox (5);
1753 add_box_child_start (GTK_ORIENTATION_VERTICAL, io_box[i], hbox, FALSE, FALSE, 0);
1754 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Method:"), 100, -1, 1.0, 0.5), FALSE, FALSE, 5);
1755 combo = create_combo();
1756 for (j=0; j<4; j++)
1757 {
1758 combo_text_append(combo, (j == 2) ? _(io_rw_m[j]) : io_rw_m[j]);
1759 }
1760 k ++;
1761 combo_set_active (combo, (int)tmp_field -> io_opts[k]);
1762 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_io_method), GINT_TO_POINTER(k));
1763 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 5);
1764 l = tmp_field -> io_opts[k] == 2.0 ? FALSE : TRUE;
1765 m = tmp_field -> io_opts[k] == 3.0 ? TRUE : FALSE;
1766 if (i)
1767 {
1768 io_pre = create_hbox(5);
1769 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, io_pre, FALSE, FALSE, 0);
1770 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, io_pre, markup_label(_("Real precision:"), 150, -1, 1.0, 0.5), FALSE, FALSE, 5);
1771 combo = create_combo();
1772 for (j=0; j<2; j++) combo_text_append(combo, io_pres[j]);
1773 k ++;
1774 combo_set_active (combo, (int)tmp_field -> io_opts[k]);
1775 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_io_method), GINT_TO_POINTER(k));
1776 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, io_pre, combo, FALSE, FALSE, 5);
1778 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Type:"), 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1779 combo = create_combo();
1780 combo_text_append (combo, _("Sorted"));
1781 combo_text_append (combo, _("Unsorted"));
1782 k ++;
1783 combo_set_active (combo, (int)tmp_field -> io_opts[k]);
1784 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_io_method), GINT_TO_POINTER(k));
1785 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 5);
1786 }
1787 hbox = create_hbox (5);
1788 add_box_child_start (GTK_ORIENTATION_VERTICAL, io_box[i], hbox, FALSE, FALSE, 0);
1789 for (j=0; j<3; j++)
1790 {
1791 io_hp[i][j] = create_hbox (5);
1792 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, io_hp[i][j], FALSE, FALSE, 0);
1793 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);
1794 k++;
1795 entry = create_entry (G_CALLBACK(set_io_param), 70, 8, FALSE, GINT_TO_POINTER(k));
1796 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> io_opts[k]);
1797 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, io_hp[i][j], entry, FALSE, FALSE, 5);
1798 if (j == 1) widget_set_sensitive (io_hp[i][j], l);
1799 }
1800 k++;
1801 check_e[i] = check_button(_(io_para[j]), 50, -1, val, G_CALLBACK(check_io), GINT_TO_POINTER(k));
1802 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, check_e[i], FALSE, FALSE, 20);
1804 k ++;
1805 }
1806 return vbox;
1807}
1808
1814GtkWidget * create_misc_box ()
1815{
1816 GtkWidget * vbox = create_vbox (BSEP);
1817 GtkWidget * hbox;
1818 GtkWidget * entry;
1819 gchar * str;
1820 gboolean val;
1821 int i;
1822 hbox = create_hbox (5);
1823 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
1824 val = (tmp_field -> io_opts[18] == 1.0) ? TRUE : FALSE;
1825 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);
1826 misc_box = create_hbox (5);
1828 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, misc_box, FALSE, FALSE, 0);
1829 for (i=19; i<22; i++)
1830 {
1831 str = g_strdup_printf ("<i>n</i><sub>%d</sub>", i-18);
1832 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, misc_box, markup_label(str, 50, -1, 1.0, 0.5), FALSE, FALSE, 5);
1833 g_free (str);
1834 entry = create_entry (G_CALLBACK(set_io_param), 70, 10, FALSE, GINT_TO_POINTER(i));
1835 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> io_opts[i]);
1836 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, misc_box, entry, FALSE, FALSE, 5);
1837 }
1838 hbox = create_hbox (5);
1839 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
1840 val = (tmp_field -> io_opts[22] == 1.0) ? TRUE : FALSE;
1841 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);
1842 return vbox;
1843}
1844
1845
1846GtkWidget * elec_box[4];
1847GtkWidget * pres_spin;
1848gchar * eval_m[10] = {i18n("Direct Coulomb sum"), i18n("Distance dependent dielectric Coulomb sum"),
1849 i18n("Ewald sum (auto)"), i18n("Ewald sum"),
1850 i18n("Reaction field electrostatics"), i18n("Reaction field with Fennel damping"),
1851 i18n("Reaction field with Fennel damping (auto)"),
1852 i18n("Force-shifted Coulomb sum"), i18n("Force-shifted Coulomb sum with Fennel damping"),
1853 i18n("Force-shifted Coulomb sum with Fennel damping (auto)")};
1854
1863G_MODULE_EXPORT void set_elec_param (GtkEntry * res, gpointer data)
1864{
1865 int i;
1866 i = GPOINTER_TO_INT(data);
1867 const gchar * m = entry_get_text (res);
1868 double v = string_to_double ((gpointer)m);
1869 if (i == 1)
1870 {
1871 if (v > 0.0 && v != tmp_field -> elec_opts[i])
1872 {
1873 tmp_field -> elec_opts[i] = v;
1874 }
1875 else if (v < 0.0)
1876 {
1877 show_warning (_("Cutoff must be > 0.0 &#xC5;"), field_assistant);
1878 }
1879 }
1880 else if (i == 3)
1881 {
1882 if (v > 0.0 && v != tmp_field -> elec_opts[i])
1883 {
1884 if (v >= min(0.05, 0.5*tmp_field -> elec_opts[1]/100.0))
1885 {
1886 tmp_field -> elec_opts[i] = v;
1887 }
1888 else
1889 {
1890 show_warning (_("Padding must be &#8805; min(0.05, 0.5%r<sub>cut</sub>) &#xC5;"), field_assistant);
1891 }
1892 }
1893 else if (v < 0.0)
1894 {
1895 show_warning (_("Padding must be > 0.0 &#xC5;"), field_assistant);
1896 }
1897 }
1898 else
1899 {
1900 if (i != 6 && (v >= 0.0 && v != tmp_field -> elec_opts[i]))
1901 {
1902 tmp_field -> elec_opts[i] = v;
1903 }
1904 else if (i == 6)
1905 {
1906 if (tmp_field -> elec_opts[5] == 2.0 || tmp_field -> elec_opts[5] == 6.0 || tmp_field -> elec_opts[5] == 9.0)
1907 {
1908 int j = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(pres_spin));
1909 double w = v * pow (10, j);
1910 if ((w >= 1e-20 && w <= 0.5) && w != tmp_field -> elec_opts[i])
1911 {
1912 tmp_field -> elec_opts[i] = w;
1913 w = v;
1914 }
1915 else if (w < 1e-20 || w > 0.5)
1916 {
1917 show_warning (_("Precision must &#x2208; [10<sup>-20</sup> - 0.5]"), field_assistant);
1918 w = tmp_field -> elec_opts[i] / pow (10, j);
1919 }
1920 }
1921 else if (v >= 0.0 && v != tmp_field -> elec_opts[i])
1922 {
1923 tmp_field -> elec_opts[i] = v;
1924 }
1925 }
1926 }
1927 if (i == 10)
1928 {
1929 if (tmp_field -> elec_opts[i] == 0.0) tmp_field -> elec_opts[i] = 1.0;
1930 if (tmp_field -> elec_opts[i] > 10.0) tmp_field -> elec_opts[i] = 4.0;
1931 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> elec_opts[i]);
1932 }
1933 else if (i == 7 || i == 8 || i == 9)
1934 {
1935 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> elec_opts[i]);
1936 }
1937 else
1938 {
1939 if (i == 6)
1940 {
1941 update_entry_double (GTK_ENTRY(res), v);
1942 }
1943 else
1944 {
1945 update_entry_double (GTK_ENTRY(res), tmp_field -> elec_opts[i]);
1946 }
1947 }
1948}
1949
1958G_MODULE_EXPORT void adjust_precision (GtkSpinButton * res, gpointer data)
1959{
1960 int powa = gtk_spin_button_get_value_as_int(res);
1961 double v = tmp_field -> elec_opts[6];
1962 while (v < 0.1)
1963 {
1964 v = v*10;
1965 }
1966 v = v*10;
1967 tmp_field -> elec_opts[6] = v * pow(10, powa);
1968}
1969
1976{
1977 GtkWidget * vbox, * vvbox;
1978 GtkWidget * hbox, * hhbox;
1979 GtkWidget * entry;
1980 vvbox = create_hbox (5);
1981 vbox = create_vbox (5);
1982 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
1983 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, vvbox, vbox, FALSE, FALSE, 50);
1984 gchar * dir[3] = {"x:", "y:", "z:"};
1985 if (tmp_field -> elec_opts[5] == 2.0 || tmp_field -> elec_opts[5] == 6.0 || tmp_field -> elec_opts[5] == 9.0)
1986 {
1987 hbox = create_hbox (5);
1988 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1989 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Precision:"), 180, -1, 0.0, 0.5), FALSE, FALSE, 0);
1990 // tmp_field -> elec_opts[6] = 1e-20;
1991 entry = create_entry (G_CALLBACK(set_elec_param), 100, 11, FALSE, GINT_TO_POINTER(6));
1992 double v = tmp_field -> elec_opts[6];
1993 int i = -1;
1994 while (v < 0.1)
1995 {
1996 v = v*10;
1997 i --;
1998 }
1999 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[6] / pow(10,i));
2000 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2001 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(" x 10<sup>-</sup>", 5, -1, 0.0, 0.5), FALSE, FALSE, 0);
2002 pres_spin = spin_button (G_CALLBACK(adjust_precision), i, -20, -1, 1, 0, 15, NULL);
2003 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, pres_spin, FALSE, FALSE, 5);
2004 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);
2005 }
2006 else if (tmp_field -> elec_opts[5] == 3.0)
2007 {
2008 hbox = create_hbox (5);
2009 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2010 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Ewald convergence parameter:"), 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2011 // tmp_field -> elec_opts[6] = 1.0;
2012 entry = create_entry (G_CALLBACK(set_elec_param), 100, 11, FALSE, GINT_TO_POINTER(6));
2013 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[6]);
2014 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2015 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);
2016 hbox = create_hbox (5);
2017 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2018 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);
2019 hbox = create_hbox (5);
2020 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2021 int i;
2022 for (i=0; i<3; i++)
2023 {
2024 hhbox = create_hbox (5);
2025 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 40);
2026 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(dir[i], 10, -1, 0.0, 0.5), FALSE, FALSE, 0);
2027 // tmp_field -> elec_opts[7+i] = 1.0;
2028 entry = create_entry (G_CALLBACK(set_elec_param), 50, 5, FALSE, GINT_TO_POINTER(7+i));
2029 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> elec_opts[7+i]);
2030 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 5);
2031 }
2032 }
2033 else if (tmp_field -> elec_opts[5] == 5.0 || tmp_field -> elec_opts[5] == 8.0)
2034 {
2035 hbox = create_hbox (5);
2036 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2037 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Fennell damping parameter (&#x3B1;):"), 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
2038 entry = create_entry (G_CALLBACK(set_elec_param), 100, 11, FALSE, GINT_TO_POINTER(6));
2039 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[6]);
2040 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2041 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>&#xC5;<sup>-1</sup></b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2042 }
2043 if (tmp_field -> elec_opts[5] == 2.0 || tmp_field -> elec_opts[5] == 3.0)
2044 {
2045 hbox = create_hbox (5);
2046 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2047 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);
2048 entry = create_entry (G_CALLBACK(set_elec_param), 50, 5, FALSE, GINT_TO_POINTER(10));
2049 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> elec_opts[10]);
2050 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2051 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("<b>step(s)</b>"), 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2052 }
2053 return vvbox;
2054}
2055
2064G_MODULE_EXPORT void set_elec_eval (GtkComboBox * box, gpointer data)
2065{
2066 tmp_field -> elec_opts[5] = combo_get_active ((GtkWidget *)box);
2070 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[2], elec_box[3], FALSE, FALSE, 10);
2071}
2072
2073#ifdef GTK4
2082G_MODULE_EXPORT void check_elec (GtkCheckButton * but, gpointer data)
2083#else
2092G_MODULE_EXPORT void check_elec (GtkToggleButton * but, gpointer data)
2093#endif
2094{
2095 int i = GPOINTER_TO_INT(data);
2096 gboolean j = button_get_status ((GtkWidget *)but);
2097 tmp_field -> elec_opts[i] = (j) ? 1.0 : 0.0;
2098 if (! i) widget_set_sensitive (elec_box[j], j);
2099 if (i == 2) widget_set_sensitive (elec_box[1], j);
2100}
2101
2108{
2109 GtkWidget * vbox = create_vbox (BSEP);
2110 GtkWidget * hbox;
2111 gboolean val = (tmp_field -> elec_opts[0] == 1.0) ? TRUE : FALSE;
2112 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);
2113 hbox = create_hbox(0);
2114 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2115 elec_box[0] = create_vbox(5);
2117 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, elec_box[0], FALSE, FALSE, 50);
2118 hbox = create_hbox(5);
2119 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[0], hbox, FALSE, FALSE, 0);
2120 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);
2121 GtkWidget * entry = create_entry (G_CALLBACK(set_elec_param), 100, 10, FALSE, GINT_TO_POINTER(1));
2122 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[1]);
2123 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2124 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>&#xC5;</b>", 30, -1, 0.0, 0.5), FALSE, FALSE, 5);
2125 val = (tmp_field -> elec_opts[2] == 1.0) ? TRUE : FALSE;
2126 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);
2127 elec_box[1] = create_hbox(5);
2128 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, elec_box[1], FALSE, FALSE, 0);
2129 entry = create_entry (G_CALLBACK(set_elec_param), 100, 10, FALSE, GINT_TO_POINTER(3));
2130 update_entry_double (GTK_ENTRY(entry), tmp_field -> elec_opts[3]);
2131 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, elec_box[1], entry, FALSE, FALSE, 10);
2132 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, elec_box[1], markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2134 val = (tmp_field -> elec_opts[4] == 1.0) ? TRUE : FALSE;
2135 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);
2136 hbox = create_hbox(5);
2137 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[0], hbox, FALSE, FALSE, 0);
2138 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Evaluation method:"), 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2139 GtkWidget * combo = create_combo();
2140 int i;
2141 for (i=0; i<10; i++)
2142 {
2143 combo_text_append(combo, _(eval_m[i]));
2144 }
2145 combo_set_active (combo, (int)tmp_field -> elec_opts[5]);
2146 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_elec_eval), NULL);
2147 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 10);
2148 elec_box[2] = create_vbox (BSEP);
2149 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[0], elec_box[2], FALSE, FALSE, 0);
2151 add_box_child_start (GTK_ORIENTATION_VERTICAL, elec_box[2], elec_box[3], FALSE, FALSE, 10);
2152 return vbox;
2153}
2154
2155GtkWidget * vdw_box[2];
2156gchar * eval_vdw[6] = {"Lorentz-Berthelot", "Fender-Halsey", "Hogervorst",
2157 "Halgren HHG", "Tang-Toennies", i18n("Functional")};
2158
2167G_MODULE_EXPORT void set_vdw_param (GtkEntry * res, gpointer data)
2168{
2169 int i;
2170 i = GPOINTER_TO_INT(data);
2171 const gchar * m = entry_get_text (res);
2172 double v = string_to_double ((gpointer)m);
2173 if (i == 1)
2174 {
2175 if (v > 0.0 && v != tmp_field -> vdw_opts[i])
2176 {
2177 tmp_field -> vdw_opts[i] = v;
2178 }
2179 else if (v < 0.0)
2180 {
2181 show_warning (_("Cutoff must be > 0.0 &#xC5;"), field_assistant);
2182 }
2183 }
2184 update_entry_double (GTK_ENTRY(res), tmp_field -> vdw_opts[i]);
2185}
2186
2195G_MODULE_EXPORT void set_vdw_mix (GtkComboBox * box, gpointer data)
2196{
2197 tmp_field -> vdw_opts[5] = combo_get_active ((GtkWidget *)box);
2198}
2199
2200#ifdef GTK4
2209G_MODULE_EXPORT void check_vdw (GtkCheckButton * but, gpointer data)
2210#else
2219G_MODULE_EXPORT void check_vdw (GtkToggleButton * but, gpointer data)
2220#endif
2221{
2222 int i, j;
2223 j = GPOINTER_TO_INT(data);
2224 i = button_get_status ((GtkWidget *)but);
2225 tmp_field -> vdw_opts[j] = (double)i;
2226 if (j == 0) widget_set_sensitive (vdw_box[0], i);
2227 if (j == 4) widget_set_sensitive (vdw_box[1], i);
2228}
2229
2235GtkWidget * create_vdws_box ()
2236{
2237 GtkWidget * vbox = create_vbox (BSEP);
2238 GtkWidget * hbox;
2239 gboolean val = (tmp_field -> vdw_opts[0] == 1.0) ? TRUE : FALSE;
2240 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);
2241 hbox = create_hbox(0);
2242 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2243 vdw_box[0] = create_vbox(5);
2244 gtk_box_set_homogeneous (GTK_BOX (vdw_box[0]), TRUE);
2246 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vdw_box[0], FALSE, FALSE, 50);
2247 hbox = create_hbox(5);
2248 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], hbox, FALSE, FALSE, 0);
2249 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Short range interaction cutoff:"), 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2250 GtkWidget * entry = create_entry (G_CALLBACK(set_vdw_param), 100, 10, FALSE, GINT_TO_POINTER(1));
2251 update_entry_double (GTK_ENTRY(entry), tmp_field -> vdw_opts[1]);
2252 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2253 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>&#xC5;</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 5);
2254
2255 hbox = create_hbox(5);
2256 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], hbox, FALSE, FALSE, 0);
2257 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);
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(_("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);
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 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);
2266 vdw_box[1] = create_vbox(5);
2267 val = (tmp_field -> vdw_opts[4] == 1.0) ? TRUE : FALSE;
2269 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[0], vdw_box[1], FALSE, FALSE, 0);
2270 hbox = create_hbox(5);
2271 add_box_child_start (GTK_ORIENTATION_VERTICAL, vdw_box[1], hbox, FALSE, FALSE, 0);
2272 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_("Mixing rule:"), 200, -1, 0.0, 0.5), FALSE, FALSE, 0);
2273 GtkWidget * combo = create_combo();
2274 int i;
2275 for (i=0; i<6; i++)
2276 {
2277 combo_text_append(combo, (i == 5) ? _(eval_vdw[i]) : eval_vdw[i]);
2278 }
2279 combo_set_active (combo, (int)tmp_field -> vdw_opts[5]);
2280 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_vdw_mix), NULL);
2281 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, combo, FALSE, FALSE, 10);
2282
2283 return vbox;
2284}
2285
2286#ifdef GTK4
2295G_MODULE_EXPORT void check_met (GtkCheckButton * but, gpointer data)
2296#else
2305G_MODULE_EXPORT void check_met (GtkToggleButton * but, gpointer data)
2306#endif
2307{
2308 int i, j;
2309 j = GPOINTER_TO_INT(data);
2310 i = button_get_status ((GtkWidget *)but);
2311 tmp_field -> met_opts[j] = (double)i;
2312}
2313
2319GtkWidget * create_metal_box ()
2320{
2321 GtkWidget * vbox = create_vbox (BSEP);
2322 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
2323 GtkWidget * hbox;
2324 gboolean val = (tmp_field -> met_opts[0] == 1.0) ? TRUE : FALSE;
2325 hbox = create_hbox(5);
2326 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2327 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"),
2328 -1, 25, val, G_CALLBACK(check_met), GINT_TO_POINTER(0)), FALSE, FALSE, 5);
2329 val = (tmp_field -> met_opts[1] == 1.0) ? TRUE : FALSE;
2330 hbox = create_hbox(5);
2331 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2332 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>"),
2333 -1, 25, val, G_CALLBACK(check_met), GINT_TO_POINTER(1)), FALSE, FALSE, 5);
2334 return vbox;
2335}
2336
2345G_MODULE_EXPORT void set_sys_param (GtkEntry * res, gpointer data)
2346{
2347 int i;
2348 i = GPOINTER_TO_INT(data);
2349 const gchar * m = entry_get_text (res);
2350 double v = string_to_double ((gpointer)m);
2351 if (i == 9)
2352 {
2353 if (v >= 1.0 && v != tmp_field -> sys_opts[i])
2354 {
2355 tmp_field -> sys_opts[i] = v;
2356 }
2357 else if (v < 1.0)
2358 {
2359 show_warning (_("Subcelling threshold density must be &#8805; 1.0"), field_assistant);
2360 }
2361 }
2362 else if (v >= 0.0 && v != tmp_field -> sys_opts[i])
2363 {
2364 tmp_field -> sys_opts[i] = v;
2365 }
2366 if (i > 10)
2367 {
2368 update_entry_int (GTK_ENTRY(res), (int)tmp_field -> sys_opts[i]);
2369 }
2370 else
2371 {
2372 update_entry_double (GTK_ENTRY(res), tmp_field -> sys_opts[i]);
2373 }
2374}
2375
2376GtkWidget * sys_box[4];
2377gchar * sys_opts[10] = {i18n("Relative dielectric constant &#949;<sub>r</sub>"),
2378 i18n("Allowed local variation of system density:"),
2379 i18n("Ignore the particle indices in CONFIG file"),
2380 i18n("Ignore strict checks, hide warnings and assume safe simulation parameters"),
2381 i18n("Skip detailed topology reporting during read of FIELD file in output"),
2382 i18n("Ignore center of mass removal during the calculation"),
2383 i18n("Set tolerance for relaxed shell model:"),
2384 i18n("Set the subcelling threshold density of particles per link cell:"),
2385 i18n("Create an expanded version of the current model:"),
2386 i18n("Restart calculation:")};
2387
2396G_MODULE_EXPORT void set_sys_restart (GtkComboBox * box, gpointer data)
2397{
2398 tmp_field -> sys_opts[15] = combo_get_active ((GtkWidget *)box);
2399}
2400
2401#ifdef GTK4
2410G_MODULE_EXPORT void check_sys (GtkCheckButton * but, gpointer data)
2411#else
2420G_MODULE_EXPORT void check_sys (GtkToggleButton * but, gpointer data)
2421#endif
2422{
2423 int i, k;
2424 i = GPOINTER_TO_INT(data);
2425 gboolean j = button_get_status ((GtkWidget *)but);
2426 tmp_field -> sys_opts[i] = (j) ? 1.0 : 0.0;
2427 if (i > 5)
2428 {
2429 k = i - 6;
2430 if (i == 14) k = 3;
2432 }
2433}
2434
2440GtkWidget * create_sys_box ()
2441{
2442 GtkWidget * vbox;
2443 GtkWidget * hbox, * hhbox;
2444 GtkWidget * entry;
2445 gboolean val;
2446 hhbox = create_hbox (5);
2447 vbox = create_vbox (5);
2448 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
2449 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, vbox, FALSE, FALSE, 10);
2450 int i, j, k;
2451 for (i=0; i<9; i++)
2452 {
2453 hbox = create_hbox(5);
2454 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2455 if (i < 2)
2456 {
2457 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(_(sys_opts[i]), 350, -1, 0.0, 0.5), FALSE, FALSE, 5);
2458 entry = create_entry (G_CALLBACK(set_sys_param), 100, 10, FALSE, GINT_TO_POINTER(i));
2459 update_entry_double (GTK_ENTRY(entry), tmp_field -> sys_opts[i]);
2460 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, entry, FALSE, FALSE, 10);
2461 if (i) add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>%</b>", 50, -1, 0.0, 0.5), FALSE, FALSE, 0);
2462 }
2463 else
2464 {
2465 j = (i < 7) ? i : (i == 7) ? 8 : 10;
2466 val = (tmp_field -> sys_opts[j] == 1.0) ? TRUE : FALSE;
2467 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);
2468 if (i > 5)
2469 {
2470 sys_box[i-6] = create_hbox(5);
2471 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, sys_box[i-6], FALSE, FALSE, 0);
2473 if (i < 8)
2474 {
2475 entry = create_entry (G_CALLBACK(set_sys_param), 100, 10, FALSE, GINT_TO_POINTER(j+1));
2476 update_entry_double (GTK_ENTRY(entry), tmp_field -> sys_opts[j+1]);
2477 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sys_box[i-6], entry, FALSE, FALSE, 10);
2478 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);
2479 }
2480 else
2481 {
2482 for (k=0; k<3; k++)
2483 {
2484 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);
2485 entry = create_entry (G_CALLBACK(set_sys_param), 50, 5, FALSE, GINT_TO_POINTER(j+k+1));
2486 update_entry_int (GTK_ENTRY(entry), (int)tmp_field -> sys_opts[j+k+1]);
2487 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sys_box[i-6], entry, FALSE, FALSE, 5);
2488 }
2489 }
2490 }
2491 }
2492 }
2493
2494 return hhbox;
2495}
2496
2503{
2504 GtkWidget * vbox = create_vbox (5);
2505 GtkWidget * hbox = create_hbox (0);
2506 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2507 gboolean val = (tmp_field -> sys_opts[14] == 1.0) ? TRUE : FALSE;
2508 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);
2509 sys_box[3] = create_hbox(5);
2510 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, sys_box[3], FALSE, FALSE, 0);
2512 gchar * rtype[3]={i18n("Continue current simulation"),
2513 i18n("Start new simulation from older run without temperature reset"),
2514 i18n("Start new simulation from older run with temperature reset")};
2515 GtkWidget * combo = create_combo();
2516 int i;
2517 for (i=0; i<3; i++) combo_text_append(combo, _(rtype[i]));
2518 combo_set_active (combo, (int)tmp_field -> sys_opts[15]);
2519 g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK(set_sys_restart), NULL);
2520 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sys_box[3], combo, FALSE, FALSE, 20);
2521 return vbox;
2522}
2523
2524
2532GtkWidget * vbox_control (int f)
2533{
2534 GtkWidget * vbox;
2535 vbox = create_vbox (5);
2536 switch (f)
2537 {
2538 case 0:
2539 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Global options:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2540 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_sys_box(), FALSE, FALSE, 0);
2541 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Restart options:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2542 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_restart_box(), FALSE, FALSE, 0);
2543 break;
2544 case 1:
2545 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);
2546 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_analyze_box(), FALSE, FALSE, 0);
2547 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Overall analysis:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 10);
2548 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_overall_box(), FALSE, FALSE, 0);
2549 break;
2550 case 2:
2551 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);
2552 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_vdws_box(), FALSE, FALSE, 0);
2553 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);
2554 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_electro_box(), FALSE, FALSE, 0);
2555 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Metallic interactions:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2556 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_metal_box(), FALSE, FALSE, 0);
2557 break;
2558 case 3:
2559 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Equilibration:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2560 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_equi_box(), FALSE, FALSE, 0);
2561 break;
2562 case 4:
2563 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Thermodynamics:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2564 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_ensemble_box(), FALSE, FALSE, 0);
2565 break;
2566 case 5:
2567 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Molecular dynamics:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2568 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_md_box(), FALSE, FALSE, 0);
2569 break;
2570 case 6:
2571 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Output information:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2572 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_out_box(), FALSE, FALSE, 10);
2573 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Trajectory file(s):</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2574 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_traj_box(), FALSE, FALSE, 10);
2575 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Restart file:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2576 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_dump_box(), FALSE, FALSE, 10);
2577 break;
2578 case 7:
2579 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Job options:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2580 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_job_box(), FALSE, FALSE, 0);
2581 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>I/O options:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2582 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_io_box(), FALSE, FALSE, 0);
2583 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<b>Other options:</b>"), 250, -1, 0.0, 0.5), FALSE, FALSE, 5);
2584 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_misc_box(), FALSE, FALSE, 0);
2585 break;
2586 default:
2587 break;
2588 }
2589 return vbox;
2590}
2591
2592/*
2593 0: System options:
2594
2595 0 = Epsilon
2596 1 = Density variation
2597 2 = no index
2598 3 = no strict
2599 4 = no topology
2600 5 = no vafar
2601 6 = no vom
2602 7 = Set tolerance for rsm ...
2603 8 = ... rsm tolerance
2604 9 = Set subscelling threshold ...
2605 10 = ... subscelling threshold
2606 11 = Create expanded system ...
2607 12 = ... x ...
2608 13 = ... y ...
2609 14 = ... z
2610 15 = Restart calc ...
2611 16 = ... restart type
2612
2613
2614 1: Calc. options:
2615
2616 0 = All PDFs
2617 1 = All: every
2618 2 = All: ndelta
2619 3 = All: cutoff
2620 4 = Bonds PDFs
2621 5 = Bonds: every
2622 6 = Bonds: ndelta
2623 7 = Bonds: cutoff
2624 8 = Angles PDFs
2625 9 = Angles: every
2626 10 = Angles: ndelta
2627 11 = Dihedrals PDFs
2628 12 = Dihedrals: every
2629 13 = Dihedrals: ndelta
2630 14 = Inversions PDFs
2631 15 = Inversions: every
2632 16 = Inversions: ndelta
2633 17 = print pdfs
2634 18 = rdf
2635 19 = every n steps
2636 20 = bin size
2637 21 = print velocity autocorrelation functions
2638 22 = every n steps
2639 23 = print z-dens
2640 24 = every n steps
2641 25 = Job time
2642 26 = Job closure
2643
2644 2: Electro. stat options:
2645 0 = Evaluate (or not) electrostatics
2646 1 = Electrostatics evaluation method
2647 2 = Param 1
2648 3 = Param 2
2649 4 = Param 3
2650 5 = Param 4
2651
2652 3: Equil. options:
2653
2654 0 = Equil
2655 1 = Equi for n steps
2656 2 = Scale temp
2657 3 = Scale temp: every
2658 4 = cap forces
2659 5 = cap: force max
2660 6 = Resample
2661 7 = Resample: during
2662 8 = Minimize
2663 9 = Minimize: string
2664 10 = Minimize: target
2665 11 = Minimize: every
2666 12 = Optimize
2667 13 = Optimize: string
2668 14 = Optimize: target
2669 15 = zero temp MD
2670 16 = collect
2671
2672 4: Thermo options:
2673
2674 0 = Ensemble
2675 1 = Thermostat
2676 2 to 7 = Thermostat options
2677
2678 5: MD options
2679 0 = target temp
2680 1 = integrator
2681 2 = MD steps
2682 3 = Time step type
2683 4 = Time step
2684 5 = Max time step
2685 6 = Max dist. per time step
2686 7 = Min dist. per time step
2687 8 = Target pressure
2688 9 = shake limit
2689 10 = shake tol
2690 11 = FIQA lim
2691 12 = FIQA tol
2692
2693 17 = Initiate impact
2694 18 = particle index
2695 19 = MD step
2696 20 = impact energy
2697 21 = impact x direct
2698 22 = impact y direct
2699 23 = impact z direct
2700
2701 6: Output options:
2702
2703 0 = Write defects trajectory ...
2704 1 = ... start time to dump defects
2705 2 = ... time step to dump defects
2706 3 = ... site interstitial cutoff
2707 4 = write displacements trajectory ...
2708 5 = ... start time to dump displacements
2709 6 = ... time step to dump displacements
2710 7 = ... displacement qualifying cutoff
2711 8 = Write history/trajectory file ...
2712 9 = ... start time to dump trajectory
2713 10 = ... time step to dump trajectory
2714 11 = ... data level [0=coord, 1=0+velo, 2=1+forces]
2715 12 = Write MSDTMP file ...
2716 13 = ... start time to dump trajectory
2717 14 = ... time step to dump trajectory
2718 15 = print data ...
2719 16 = ... every n steps
2720 17 = accumulate stat ...
2721 18 = ... every n step(s)
2722 19 = set rolling avertage stack ...
2723 20 = ... to n time step(s)
2724 21 = Write RDFs ...
2725 22 = ... every n step(s)
2726 23 = ... bin size *
2727 24 = Write VAFs ...
2728 25 = ... every n step(s)
2729 26 = ... bin size
2730 27 = Write z-dens ...
2731 28 = ... every n step(s)
2732 29 = Ignore time average for VAFs
2733 30 = Dump restart every n step(s)
2734*/
2735
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:611
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:276
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:261
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:93
#define MAXDATC
Number of tabs for the description of the classical calculation.
Definition global.h:771
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