2
Copyright (C) 2000 by Sean David Fleming
4
sean@power.curtin.edu.au
6
This program is free software; you can redistribute it and/or
7
modify it under the terms of the GNU General Public License
8
as published by the Free Software Foundation; either version 2
9
of the License, or (at your option) any later version.
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
The GNU GPL can also be found at http://www.gnu.org
34
extern struct sysenv_pak sysenv;
35
extern struct elem_pak elements[];
37
/***************************************************/
38
/* get single point energy from a GULP output file */
39
/***************************************************/
40
#define DEBUG_READ_GULP 0
41
gint read_single_gulp(gchar *file, struct model_pak *data)
43
gchar line[LINELEN], **buff;
46
/* open & scan gulp output file */
47
fp = fopen(file,"rt");
50
printf("No output file found!\n");
54
/* look for last (eV) energy output */
55
while(!fgetline(fp,line))
57
buff = get_tokens(line, 10);
59
/* search for energy */
60
if (g_strncasecmp(" Total lattice energy",line,22) == 0)
62
/* if nothing on the rest of this line, then should be on the next */
63
if (!strlen(*(buff+5)))
65
while(!fgetline(fp,line))
66
if (g_strncasecmp(" Primitive unit cell",line,20) == 0)
69
buff = get_tokens(line, 6);
72
if (g_strncasecmp("eV",*(buff+5),2) == 0)
73
sscanf(*(buff+4),"%f",&data->gulp.energy);
76
/* search for free energy */
77
if (g_strncasecmp(" Total free energy",line,19) == 0)
79
if (g_strncasecmp("eV",*(buff+5),2) == 0)
80
sscanf(*(buff+4),"%f",&data->gulp.energy);
83
/* search for surface energy */
84
if (g_strncasecmp(" Surface energy ",line,17) == 0)
86
sscanf(*(buff+5),"%f",&data->gulp.esurf);
87
g_free(data->gulp.esurf_units);
88
data->gulp.esurf_units = g_strdup(*(buff+6));
91
/* search for attachment energy */
92
if (g_strncasecmp(" Attachment energy",line,19) == 0)
94
data->gulp.eatt = str_to_float(*(buff+3));
95
g_free(data->gulp.eatt_units);
96
data->gulp.eatt_units = g_strdup(*(buff+4));
99
if (g_strncasecmp(" Attachment energy/molecule",line,28) == 0)
101
data->gulp.eatt = str_to_float(*(buff+3));
102
g_free(data->gulp.eatt_units);
103
data->gulp.eatt_units = g_strdup("eV/mol");
107
if (g_strncasecmp(" Initial surface dipole ",line,25) == 0)
108
sscanf(*(buff+4),"%f",&data->gulp.sdipole);
113
g_snprintf(line,35,"Single point Energy: %10.4f eV\n", data->gulp.energy);
118
/**********************************************/
119
/* get updated coords from a GULP output file */
120
/**********************************************/
121
gint read_minimize_gulp(gchar *file, struct model_pak *data)
127
/* open & scan gulp output file */
128
fp = fopen(file,"rt");
131
printf("No output file found!\n");
135
/* create new file instead of overwriting */
136
model = sysenv.num_models;
137
tmp = g_strdup_printf("%s_opti", g_strstrip(data->basename));
138
if ((code = load_gulp_output(fp, model, tmp)))
139
printf("Output file load failed, error code %d.\n",code);
142
/* this will trigger a pick_model() call */
152
/*******************/
153
/* run a gulp file */
154
/*******************/
155
#define DEBUG_EXEC_GULP 0
156
gint exec_gulp(gchar *input, gchar *output)
160
/* stop gulp's renaming (if it exists already) */
163
/* TODO - scan output to print updates */
164
/* build & execute command line */
165
cmd = g_string_new(NULL);
167
/* The SG's don't like the ampersand after the '>' */
169
g_string_sprintf(cmd,"%s < %s >& %s",sysenv.gulp_exe,input,output);
171
g_string_sprintf(cmd,"%s < %s > %s",sysenv.gulp_exe,input,output);
174
printf("executing: [%s]\n",cmd->str);
184
g_string_free(cmd, TRUE);
188
/*****************************/
189
/* execute a gulp run (task) */
190
/*****************************/
191
#define DEBUG_EXEC_GULP_TASK 0
192
void exec_gulp_task(gpointer *ptr)
195
gchar *inpfile, *outfile, *argv[2];
197
struct model_pak *data;
199
g_return_if_fail(ptr != NULL);
200
data = (struct model_pak *) ptr;
202
/* get input and output filenames */
203
/* TODO - can we put =, instead of malloc'ing? */
204
inpfile = g_strdup(data->gulp.temp_file);
206
/* TODO - put this in a routine */
207
buff = g_strsplit(data->gulp.temp_file, ".gin", 0);
208
/* copy first token as the base name */
209
outfile = g_malloc((5+strlen(*buff))*sizeof(gchar));
210
strcpy(outfile, *buff);
211
strcat(outfile, ".got");
214
#if DEBUG_EXEC_GULP_TASK
215
printf("output file: %s\n", outfile);
218
/* create the input file */
219
write_gulp(inpfile, data);
222
fi = open(inpfile, O_RDONLY);
225
printf("failed to open: %s\n", inpfile);
231
/* redirect stdout */
232
/* NB: output file must have correct permissions if created */
233
fo = open(outfile, O_RDWR | O_CREAT, S_IREAD | S_IWRITE);
236
printf("failed to open: %s\n", outfile);
242
/* NEW - some machines (mac's) don't like empty argument lists */
246
execvp(sysenv.gulp_exe, argv);
250
/*****************************/
251
/* process a gulp run (task) */
252
/*****************************/
253
#define DEBUG_PROC_GULP 0
254
void proc_gulp_task(gpointer *ptr)
258
struct model_pak *dest, *data;
260
/* TODO - model locking (moldel_ptr RO/RW etc) to prevent screw ups */
261
g_return_if_fail(ptr != NULL);
262
data = (struct model_pak *) ptr;
264
/* TODO - make it possile to get dialog data by request */
265
/* so that we can check if a dialog exsits to be updated */
268
if (data->gulp.run == E_OPTIMIZE)
270
/* NEW - if minimize, we deal with the newly created model */
271
model = read_minimize_gulp(data->gulp.out_file, data);
272
dest = model_ptr(model, RECALL);
275
/* transfer data to new model */
276
copy_gulp_data(data, dest);
277
copy_gulp_extra(data, dest);
278
copy_elem_data(data, dest);
279
/* update coords etc - INIT's */
280
init_objs(REDO_COORDS, dest);
288
/* same model (ie with current energetics dialog) so update */
289
read_single_gulp(data->gulp.out_file, data);
290
/* update energy (TODO - only if successful) */
291
line = g_string_new(NULL);
293
g_string_sprintf(line,"%f (free energy)",data->gulp.energy);
295
g_string_sprintf(line,"%f",data->gulp.energy);
297
/* is there a dialog entry to be updated? */
298
if (GTK_IS_ENTRY(data->gulp.energy_entry))
299
gtk_entry_set_text(GTK_ENTRY(data->gulp.energy_entry), line->str);
300
if (data->periodic == 2)
302
/* update surface energy dialog entry */
303
g_string_sprintf(line,"%f %s",data->gulp.esurf, data->gulp.esurf_units);
304
if (GTK_IS_ENTRY(data->gulp.esurf_entry))
305
gtk_entry_set_text(GTK_ENTRY(data->gulp.esurf_entry), line->str);
307
/* update attachment energy dialog entry */
308
g_string_sprintf(line,"%f %s",data->gulp.eatt, data->gulp.eatt_units);
309
if (GTK_IS_ENTRY(data->gulp.eatt_entry))
310
gtk_entry_set_text(GTK_ENTRY(data->gulp.eatt_entry), line->str);
312
g_string_free(line, TRUE);
316
unlink(data->gulp.out_file);
322
/***********************************************/
323
/* controls the use of GULP to optimise coords */
324
/***********************************************/
325
#define DEBUG_RUN_GULP 0
326
void run_gulp(gint id)
330
struct model_pak *data;
331
struct task_pak task;
333
if (!sysenv.have_gulp)
335
show_text("Sorry, gulp executable was not found.");
339
/* get model attached to dialog id */
340
model = sysenv.dialog[id].model;
341
data = model_ptr(model, RECALL);
342
g_return_if_fail(data != NULL);
344
/* create input file to execute */
345
write_gulp(data->gulp.temp_file, data);
347
/* set up output file to use */
348
g_free(data->gulp.out_file);
350
/* TODO - put this in a routine */
351
buff = g_strsplit(data->gulp.temp_file, ".gin", 0);
352
/* copy first token as the base name */
353
data->gulp.out_file = g_malloc((5+strlen(*buff))*sizeof(gchar));
354
strcpy(data->gulp.out_file, *buff);
355
strcat(data->gulp.out_file, ".got");
359
printf("output file: %s\n", data->gulp.out_file);
362
show_text("Running GULP in the background.");
364
/* run as a background process */
365
task.label = g_strdup("Gulp");
366
task.primary = &exec_gulp_task;
367
task.ptr1 = (gpointer *) data;
368
task.cleanup = &proc_gulp_task;
369
task.ptr2 = (gpointer *) data;
374
/***********************/
375
/* GULP keyword toggle */
376
/***********************/
377
gint gulp_keyword(GtkWidget *w, gpointer *obj)
380
struct model_pak *data;
382
keyword = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(obj), "key"));
384
data = (struct model_pak *) gtk_object_get_data(GTK_OBJECT(obj), "ptr");
385
g_return_val_if_fail(data != NULL, FALSE);
392
data->gulp.run = keyword;
395
data->gulp.no_eatt ^= 1;
398
data->gulp.no_esurf ^= 1;
403
if (data->gulp.run != MD)
405
show_text("I'm ignoring this as it's not a dynamics run type.");
410
data->gulp.ensemble = keyword;
414
data->gulp.method = keyword;
419
data->gulp.optimiser = keyword;
425
data->gulp.coulomb = keyword;
428
data->gulp.temp = (gfloat) GTK_ADJUSTMENT(obj)->value;
431
data->gulp.maxcyc = (gint) GTK_ADJUSTMENT(obj)->value;
434
g_free(data->gulp.temp_file);
435
data->gulp.temp_file = g_strdup(gtk_entry_get_text(GTK_ENTRY(obj)));
438
g_free(data->gulp.dump_file);
439
data->gulp.dump_file = g_strdup(gtk_entry_get_text(GTK_ENTRY(obj)));
442
g_free(data->gulp.lib_file);
443
data->gulp.lib_file = g_strdup(gtk_entry_get_text(GTK_ENTRY(obj)));
450
/***********************************/
451
/* register structure name changes */
452
/***********************************/
453
gint name_entry_changed(gpointer *entry)
455
struct model_pak *data;
457
/* retrieve the appropriate model */
458
data = (struct model_pak *) gtk_object_get_data(GTK_OBJECT(entry), "ptr");
459
g_return_val_if_fail(data != NULL, FALSE);
461
/* set the new basename */
462
g_free(data->basename);
463
data->basename = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
465
/* update the model tree */
466
new_tree_item(data->number, REPLACE);
470
/*************************/
471
/* The GULP setup widget */
472
/*************************/
473
void gulp_widget(GtkWidget *w, struct model_pak *data)
476
struct dialog_pak *gulp_dialog;
477
GtkWidget *main_hbox, *hbox, *vbox, *vbox1, *vbox2, *page;
478
GtkWidget *frame, *button, *label, *entry, *notebook;
483
/* do we have to do anything? */
484
g_return_if_fail(data != NULL);
486
/* NEW - default run setup is done by the template routine */
487
model = data->number;
488
if ((id = request_dialog(model, GULP)) < 0)
490
gulp_dialog = &sysenv.dialog[id];
492
/* string manipulation scratchpad */
493
line = g_string_new(NULL);
495
/* NEW - setup some gulp file name defaults */
496
if (g_strncasecmp(data->gulp.temp_file, "none", 4) == 0)
498
/* FIXME - what if temp_file = filename? (may not want to overwrite) */
499
g_string_sprintf(line,"%s.gin",g_strstrip(data->basename));
500
g_free(data->gulp.temp_file);
501
data->gulp.temp_file = g_strdup(line->str);
503
if (g_strncasecmp(data->gulp.dump_file, "none", 4) == 0)
505
g_string_sprintf(line,"%s.res",g_strstrip(data->basename));
506
g_free(data->gulp.dump_file);
507
data->gulp.dump_file = g_strdup(line->str);
510
/* TODO - show model's name */
511
/* create a new dialogue */
512
gulp_dialog->win = gtk_dialog_new();
513
gtk_window_set_title (GTK_WINDOW(gulp_dialog->win), "GULP interface");
514
gtk_signal_connect(GTK_OBJECT(gulp_dialog->win), "destroy",
515
GTK_SIGNAL_FUNC(event_close_dialog), (gpointer) id);
517
main_hbox = gtk_hbox_new(TRUE,3);
518
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(gulp_dialog->win)->vbox),main_hbox);
521
vbox1 = gtk_vbox_new(FALSE, 0);
522
gtk_box_pack_start (GTK_BOX(main_hbox), vbox1, TRUE, TRUE, 0);
525
frame = gtk_frame_new("run type");
526
gtk_container_add(GTK_CONTAINER(GTK_BOX(vbox1)),frame);
527
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
528
vbox = gtk_vbox_new(TRUE, 0);
529
gtk_container_add(GTK_CONTAINER(frame),vbox);
531
/* do the first (DEFAULT MODE) radio button */
532
button = gtk_radio_button_new_with_label(NULL, "single point");
533
gtk_box_pack_start(GTK_BOX (vbox), button, TRUE, TRUE, 0);
534
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
535
GTK_SIGNAL_FUNC (gulp_keyword),
537
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) E_SINGLE);
538
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
540
if (data->gulp.run == E_SINGLE)
541
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
543
/* make a radio group */
544
keyword[0] = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
545
/* do the next button */
546
button = gtk_radio_button_new_with_label (keyword[0], "minimize");
547
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
548
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
549
GTK_SIGNAL_FUNC (gulp_keyword),
551
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) E_OPTIMIZE);
552
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
554
if (data->gulp.run == E_OPTIMIZE)
555
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
557
/* subsequent button... */
558
button = gtk_radio_button_new_with_label(gtk_radio_button_group
559
(GTK_RADIO_BUTTON(button)), "dynamics");
560
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
561
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
562
GTK_SIGNAL_FUNC (gulp_keyword),
564
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) MD);
565
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
567
if (data->gulp.run == MD)
568
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
575
/* NEW - notebook display for extended options */
576
frame = gtk_frame_new("Run options");
577
gtk_box_pack_start(GTK_BOX (vbox1), frame, FALSE, FALSE, 0);
578
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
580
vbox = gtk_vbox_new(TRUE, 0);
581
gtk_container_add(GTK_CONTAINER(frame),vbox);
583
gtk_container_set_border_width(GTK_CONTAINER(GTK_BOX(vbox)),1);
586
/* create notebook */
587
notebook = gtk_notebook_new();
588
gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
590
gtk_container_add(GTK_CONTAINER(frame),notebook);
592
gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
594
gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
596
/* create minimize page */
597
page = gtk_vbox_new(FALSE,0);
598
gtk_container_set_border_width (GTK_CONTAINER(GTK_BOX(vbox)), 10);
600
/* minimize constraint */
601
frame = gtk_frame_new("method");
602
gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
603
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
604
vbox = gtk_vbox_new(TRUE, 0);
605
gtk_container_add(GTK_CONTAINER(frame),vbox);
607
/* do the first (DEFAULT MODE) radio button */
608
button = gtk_radio_button_new_with_label (NULL, "constant pressure");
609
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
610
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
611
GTK_SIGNAL_FUNC (gulp_keyword),
613
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) CONP);
614
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
616
if (data->gulp.method == CONP)
617
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
619
/* make a radio group */
620
keyword[1] = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
621
/* do the next button */
622
button = gtk_radio_button_new_with_label (keyword[1], "constant volume");
623
gtk_box_pack_start(GTK_BOX (vbox), button, TRUE, TRUE, 0);
624
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
625
GTK_SIGNAL_FUNC (gulp_keyword),
627
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) CONV);
628
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
630
if (data->gulp.method == CONV)
631
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
634
/* optimiser to use */
635
frame = gtk_frame_new("optimiser");
636
gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
637
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
638
vbox = gtk_vbox_new(TRUE, 0);
639
gtk_container_add(GTK_CONTAINER(frame),vbox);
641
/* do the first (DEFAULT MODE) radio button */
642
button = gtk_radio_button_new_with_label (NULL, "bfgs (default)");
643
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
644
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
645
GTK_SIGNAL_FUNC (gulp_keyword),
647
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) BFGS_OPT);
648
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
650
if (data->gulp.optimiser == BFGS_OPT || data->gulp.optimiser == -1)
651
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
653
/* make a radio group */
654
keyword[1] = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
655
/* do the next button */
656
button = gtk_radio_button_new_with_label (keyword[1], "conj");
657
gtk_box_pack_start(GTK_BOX (vbox), button, TRUE, TRUE, 0);
658
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
659
GTK_SIGNAL_FUNC (gulp_keyword),
661
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) CONJ_OPT);
662
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
664
if (data->gulp.optimiser == CONJ_OPT)
665
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
667
/* subsequent button... */
668
button = gtk_radio_button_new_with_label(gtk_radio_button_group
669
(GTK_RADIO_BUTTON (button)), "rfo");
670
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
671
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
672
GTK_SIGNAL_FUNC (gulp_keyword),
674
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) RFO_OPT);
675
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
677
if (data->gulp.optimiser == RFO_OPT)
678
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
680
/* add the page & title */
681
label = gtk_label_new ("minimize");
682
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, label);
691
/* create dynamics page */
692
page = gtk_vbox_new(FALSE,0);
693
gtk_container_set_border_width (GTK_CONTAINER(GTK_BOX(vbox)), 10);
695
/* dynamics ensemble */
696
frame = gtk_frame_new("ensemble");
697
gtk_box_pack_start(GTK_BOX (page), frame, FALSE, FALSE, 0);
698
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
699
vbox = gtk_vbox_new(TRUE, 0);
700
gtk_container_add(GTK_CONTAINER(frame),vbox);
702
/* do the first (DEFAULT MODE) radio button */
703
button = gtk_radio_button_new_with_label (NULL, "NVE");
704
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
705
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
706
GTK_SIGNAL_FUNC (gulp_keyword),
708
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) NVE);
709
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
711
if (data->gulp.ensemble == NVE)
712
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
714
/* make a radio group */
715
keyword[1] = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
716
/* do the next button */
717
button = gtk_radio_button_new_with_label (keyword[1], "NVT");
718
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
719
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
720
GTK_SIGNAL_FUNC (gulp_keyword),
722
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) NVT);
723
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
725
if (data->gulp.ensemble == NVT)
726
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
728
/* subsequent button... */
729
button = gtk_radio_button_new_with_label(gtk_radio_button_group
730
(GTK_RADIO_BUTTON (button)), "NPT");
731
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
732
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
733
GTK_SIGNAL_FUNC (gulp_keyword),
735
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) NPT);
736
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
738
if (data->gulp.ensemble == NPT)
739
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
742
/* step size/run length, trajectory file etc. */
744
/* add the page & title */
745
label = gtk_label_new ("dynamics");
746
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, label);
749
/* create misc page */
750
page = gtk_vbox_new(FALSE,0);
751
gtk_container_set_border_width (GTK_CONTAINER(GTK_BOX(vbox)), 10);
753
/* dynamics ensemble */
754
frame = gtk_frame_new(NULL);
755
gtk_box_pack_start(GTK_BOX (page), frame, FALSE, FALSE, 0);
756
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
757
vbox = gtk_vbox_new(TRUE, 0);
758
gtk_container_add(GTK_CONTAINER(frame),vbox);
760
if (data->periodic == 2)
762
button = gtk_check_button_new_with_label("No attachment energy calculation");
763
gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
764
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
765
GTK_SIGNAL_FUNC (gulp_keyword),
767
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) NO_EATT);
768
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
771
/* add the page & title */
772
label = gtk_label_new ("misc");
773
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, label);
777
gtk_widget_show_all(notebook); /* needed in order to make this work */
778
if (data->gulp.run == MD)
779
gtk_notebook_set_page(GTK_NOTEBOOK(notebook), 1);
781
gtk_notebook_set_page(GTK_NOTEBOOK(notebook), 0);
785
vbox2 = gtk_vbox_new(FALSE, 0);
786
gtk_box_pack_start (GTK_BOX(main_hbox), vbox2, TRUE, TRUE, 0);
789
frame = gtk_frame_new("Molecule options");
790
gtk_container_add(GTK_CONTAINER(GTK_BOX(vbox2)),frame);
791
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
792
vbox = gtk_vbox_new(TRUE, 0);
793
gtk_container_add(GTK_CONTAINER(frame),vbox);
794
/* do the first radio button */
795
button = gtk_radio_button_new_with_label (NULL, "1-2 coulomb subtraction");
796
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
797
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
798
GTK_SIGNAL_FUNC (gulp_keyword),
800
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) MOLE);
801
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
803
if (data->gulp.coulomb == MOLE)
804
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
806
/* make a radio group */
807
keyword[2] = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
808
/* do the next button */
809
button = gtk_radio_button_new_with_label (keyword[2],
810
"1-2 and 1-3 coulomb subtraction");
811
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
812
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
813
GTK_SIGNAL_FUNC (gulp_keyword),
815
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) MOLMEC);
816
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
818
if (data->gulp.coulomb == MOLMEC)
819
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
821
/* subsequent button... */
822
button = gtk_radio_button_new_with_label(gtk_radio_button_group
823
(GTK_RADIO_BUTTON (button)), "build, but retain coulomb interactions");
824
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
825
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
826
GTK_SIGNAL_FUNC (gulp_keyword),
828
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) MOLQ);
829
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
831
if (data->gulp.coulomb == MOLQ)
832
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
834
/* subsequent button... */
835
button = gtk_radio_button_new_with_label(gtk_radio_button_group
836
(GTK_RADIO_BUTTON (button)), "molecule building off");
837
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
838
gtk_signal_connect_object(GTK_OBJECT (button), "clicked",
839
GTK_SIGNAL_FUNC (gulp_keyword),
841
gtk_object_set_data(GTK_OBJECT(button), "key", (gpointer) NOBUILD);
842
gtk_object_set_data(GTK_OBJECT(button), "ptr", (gpointer) data);
844
if (data->gulp.coulomb == NOBUILD)
845
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
850
frame = gtk_frame_new(NULL);
851
gtk_container_add(GTK_CONTAINER(GTK_BOX(vbox2)),frame);
852
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
853
hbox = gtk_hbox_new(FALSE, 0);
854
gtk_container_add (GTK_CONTAINER(frame),hbox);
855
gtk_container_set_border_width(GTK_CONTAINER(hbox),3);
857
/* TODO - ability to edit (via another dialog) */
858
label = gtk_label_new(" Temperature ");
859
gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, FALSE, 0);
861
adj = (GtkAdjustment *) gtk_adjustment_new
862
(data->gulp.temp, 0, 500, 10, 10, 0);
863
button = gtk_spin_button_new(adj, 0, 0);
864
gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(button), FALSE);
865
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
866
gtk_signal_connect_object(GTK_OBJECT (adj), "value_changed",
867
GTK_SIGNAL_FUNC (gulp_keyword),
869
gtk_object_set_data(GTK_OBJECT(adj), "key", (gpointer) TEMPERATURE);
870
gtk_object_set_data(GTK_OBJECT(adj), "ptr", (gpointer) data);
874
frame = gtk_frame_new(NULL);
875
gtk_container_add(GTK_CONTAINER(GTK_BOX(vbox2)),frame);
876
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
877
hbox = gtk_hbox_new(FALSE, 0);
878
gtk_container_add (GTK_CONTAINER(frame),hbox);
879
gtk_container_set_border_width(GTK_CONTAINER(hbox),3);
881
/* TODO - ability to edit (via another dialog) */
882
label = gtk_label_new(" Maximum cycles ");
883
gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, FALSE, 0);
885
adj = (GtkAdjustment *) gtk_adjustment_new
886
(data->gulp.maxcyc, 0, 500, 10, 10, 0);
887
button = gtk_spin_button_new(adj, 0, 0);
888
gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(button), FALSE);
889
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
890
gtk_signal_connect_object(GTK_OBJECT (adj), "value_changed",
891
GTK_SIGNAL_FUNC (gulp_keyword),
893
gtk_object_set_data(GTK_OBJECT(adj), "key", (gpointer) MAXCYC);
894
gtk_object_set_data(GTK_OBJECT(adj), "ptr", (gpointer) data);
896
/* setup the filename entry part */
897
frame = gtk_frame_new("Supplied data");
900
gtk_box_pack_start(GTK_BOX(vbox2),frame,FALSE,FALSE,0);
902
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(gulp_dialog->win)->vbox),frame,FALSE,FALSE,0);
904
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
905
hbox = gtk_hbox_new(FALSE, 0);
906
gtk_container_add (GTK_CONTAINER(frame),hbox);
907
gtk_container_set_border_width(GTK_CONTAINER(hbox),3);
910
vbox = gtk_vbox_new(TRUE, 2);
911
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
913
/* GULP template data */
914
/* TODO - ability to edit (via another dialog) */
915
label = gtk_label_new("Potentials");
916
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
917
gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f);
918
label = gtk_label_new("Species data");
919
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
920
gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f);
921
label = gtk_label_new("Element data");
922
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
923
gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f);
926
vbox = gtk_vbox_new(TRUE, 2);
927
gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
929
g_string_sprintf(line,"%d",data->gulp.num_potentials);
930
label = gtk_label_new(line->str);
931
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
932
g_string_sprintf(line,"%d",data->gulp.num_species);
933
label = gtk_label_new(line->str);
934
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
935
g_string_sprintf(line,"%d",data->gulp.num_elem);
936
label = gtk_label_new(line->str);
937
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
939
/* setup the filename entry */
940
frame = gtk_frame_new("Files");
941
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(gulp_dialog->win)->vbox),frame,FALSE,FALSE,0);
942
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
943
hbox = gtk_hbox_new(FALSE, 0);
944
gtk_container_add (GTK_CONTAINER(frame),hbox);
945
gtk_container_set_border_width(GTK_CONTAINER(hbox),3);
948
vbox = gtk_vbox_new(TRUE, 2);
949
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
951
/* temporary GULP input filename */
952
label = gtk_label_new(" Job input file ");
953
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
954
label = gtk_label_new(" Dump file ");
955
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
956
label = gtk_label_new(" Potential library ");
957
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
960
vbox = gtk_vbox_new(TRUE, 2);
961
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
963
/* temporary input */
964
entry = gtk_entry_new_with_max_length(LINELEN);
965
gtk_entry_set_text(GTK_ENTRY(entry), data->gulp.temp_file);
966
gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
968
gtk_signal_connect_object(GTK_OBJECT (entry), "changed",
969
GTK_SIGNAL_FUNC (gulp_keyword),
971
gtk_object_set_data(GTK_OBJECT(entry), "key", (gpointer) TEMP_FILE);
972
gtk_object_set_data(GTK_OBJECT(entry), "ptr", (gpointer) data);
975
entry = gtk_entry_new_with_max_length(LINELEN);
976
gtk_entry_set_text(GTK_ENTRY(entry), data->gulp.dump_file);
977
gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
979
gtk_signal_connect_object(GTK_OBJECT (entry), "changed",
980
GTK_SIGNAL_FUNC (gulp_keyword),
982
gtk_object_set_data(GTK_OBJECT(entry), "key", (gpointer) DUMP_FILE);
983
gtk_object_set_data(GTK_OBJECT(entry), "ptr", (gpointer) data);
985
/* potential library */
986
entry = gtk_entry_new_with_max_length(LINELEN);
987
gtk_entry_set_text(GTK_ENTRY(entry),data->gulp.lib_file);
988
gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
990
gtk_signal_connect_object(GTK_OBJECT (entry), "changed",
991
GTK_SIGNAL_FUNC (gulp_keyword),
993
gtk_object_set_data(GTK_OBJECT(entry), "key", (gpointer) LIB_FILE);
994
gtk_object_set_data(GTK_OBJECT(entry), "ptr", (gpointer) data);
997
/* setup the filename entry */
998
frame = gtk_frame_new("Details");
999
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(gulp_dialog->win)->vbox),frame,FALSE,FALSE,0);
1000
gtk_container_set_border_width(GTK_CONTAINER(frame),3);
1001
hbox = gtk_hbox_new(FALSE, 0);
1002
gtk_container_add (GTK_CONTAINER(frame),hbox);
1005
vbox = gtk_vbox_new(TRUE, 2);
1006
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
1008
/* temporary GULP input filename */
1009
label = gtk_label_new("Structure name");
1010
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
1011
label = gtk_label_new("Lattice energy (eV)");
1012
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
1013
if (data->periodic == 2)
1015
label = gtk_label_new("Surface bulk energy (eV)");
1016
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
1017
label = gtk_label_new("Surface energy");
1018
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
1019
label = gtk_label_new("Attachment energy");
1020
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
1024
vbox = gtk_vbox_new(TRUE, 2);
1025
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
1027
entry = gtk_entry_new_with_max_length(LINELEN);
1028
gtk_entry_set_text(GTK_ENTRY(entry),data->basename);
1029
gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
1031
gtk_signal_connect_object(GTK_OBJECT (entry), "changed",
1032
GTK_SIGNAL_FUNC (name_entry_changed),
1034
gtk_object_set_data(GTK_OBJECT(entry), "ptr", (gpointer) data);
1037
data->gulp.energy_entry = gtk_entry_new_with_max_length(LINELEN);
1038
if (data->gulp.free)
1039
g_string_sprintf(line,"%f (free energy)",data->gulp.energy);
1041
g_string_sprintf(line,"%f",data->gulp.energy);
1043
gtk_entry_set_text(GTK_ENTRY(data->gulp.energy_entry),line->str);
1044
gtk_box_pack_start (GTK_BOX (vbox), data->gulp.energy_entry, TRUE, TRUE, 0);
1045
gtk_entry_set_editable(GTK_ENTRY(data->gulp.energy_entry), FALSE);
1047
if (data->periodic == 2)
1049
data->gulp.sbe_entry = gtk_entry_new_with_max_length(LINELEN);
1050
g_string_sprintf(line,"%f",data->gulp.sbulkenergy);
1051
gtk_entry_set_text(GTK_ENTRY(data->gulp.sbe_entry),line->str);
1052
gtk_box_pack_start (GTK_BOX (vbox), data->gulp.sbe_entry, TRUE, TRUE, 0);
1053
gtk_entry_set_editable(GTK_ENTRY(data->gulp.sbe_entry), FALSE);
1055
data->gulp.esurf_entry = gtk_entry_new_with_max_length(LINELEN);
1056
g_string_sprintf(line,"%f %s",data->gulp.esurf, data->gulp.esurf_units);
1057
gtk_entry_set_text(GTK_ENTRY(data->gulp.esurf_entry),line->str);
1058
gtk_box_pack_start (GTK_BOX (vbox), data->gulp.esurf_entry, TRUE, TRUE, 0);
1059
gtk_entry_set_editable(GTK_ENTRY(data->gulp.esurf_entry), FALSE);
1061
data->gulp.eatt_entry = gtk_entry_new_with_max_length(LINELEN);
1062
g_string_sprintf(line,"%f %s",data->gulp.eatt, data->gulp.eatt_units);
1063
gtk_entry_set_text(GTK_ENTRY(data->gulp.eatt_entry),line->str);
1064
gtk_box_pack_start (GTK_BOX (vbox), data->gulp.eatt_entry, TRUE, TRUE, 0);
1065
gtk_entry_set_editable(GTK_ENTRY(data->gulp.eatt_entry), FALSE);
1068
/* TODO - choose foreground or background run ?*/
1069
/* terminating buttons */
1070
button = gtk_button_new_with_label ("Run");
1071
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (gulp_dialog->win)->action_area),
1072
button, FALSE, TRUE, 0);
1073
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
1074
GTK_SIGNAL_FUNC (run_gulp), (gpointer) id);
1076
button = gtk_button_new_with_label ("Close");
1077
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (gulp_dialog->win)->action_area),
1078
button, FALSE, TRUE, 0);
1079
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
1080
GTK_SIGNAL_FUNC (close_dialog),
1083
gtk_widget_show_all(gulp_dialog->win);
1085
g_string_free(line, TRUE);
1086
pick_model(data->number);