1 /*   EXTRAITS DE LA LICENCE
2 	Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2011)
3 
4 	Adresse mèl :
5 	CALISTE, damien P caliste AT cea P fr.
6 
7 	Ce logiciel est un programme informatique servant à visualiser des
8 	structures atomiques dans un rendu pseudo-3D.
9 
10 	Ce logiciel est régi par la licence CeCILL soumise au droit français et
11 	respectant les principes de diffusion des logiciels libres. Vous pouvez
12 	utiliser, modifier et/ou redistribuer ce programme sous les conditions
13 	de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
14 	sur le site "http://www.cecill.info".
15 
16 	Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
17 	pris connaissance de la licence CeCILL, et que vous en avez accepté les
18 	termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel).
19 */
20 
21 /*   LICENCE SUM UP
22 	Copyright CEA, contributors: Damien CALISTE, L_Sim laboratory, (2001-2011)
23 
24 	E-mail address:
25 	CALISTE, damien P caliste AT cea P fr.
26 
27 	This software is a computer program whose purpose is to visualize atomic
28 	configurations in 3D.
29 
30 	This software is governed by the CeCILL  license under French law and
31 	abiding by the rules of distribution of free software.  You can  use,
32 	modify and/ or redistribute the software under the terms of the CeCILL
33 	license as circulated by CEA, CNRS and INRIA at the following URL
34 	"http://www.cecill.info".
35 
36 	The fact that you are presently reading this means that you have had
37 	knowledge of the CeCILL license and that you accept its terms. You can
38 	find a copy of this licence shipped with this software at
39         Documentation/licence.en.txt.
40 */
41 
42 #include <string.h>
43 
44 #include <support.h>
45 #include <visu_basic.h>
46 #include <visu_rendering.h>
47 #include <visu_data.h>
48 #include <renderingMethods/renderingAtomic_ascii.h>
49 #include <coreTools/toolMatrix.h>
50 #include <coreTools/toolPhysic.h>
51 #include <extraFunctions/scalarFields.h>
52 #include <extraGtkFunctions/gtk_toolPanelWidget.h>
53 #include <extraGtkFunctions/gtk_numericalEntryWidget.h>
54 #include <extraGtkFunctions/gtk_elementComboBox.h>
55 #include <panelModules/panelSurfaces.h>
56 #include <gtk_main.h>
57 #include <visu_gtk.h>
58 
59 #include <bigdft.h>
60 
61 #include "bigdftplug.h"
62 
63 enum
64   {
65     LR_OBJECT,
66     LR_LABEL,
67     LR_ID,
68     LR_SHOW_GRID_C,
69     LR_SHOW_GRID_F,
70     LR_COLOR,
71     LR_N_COLUMNS
72   };
73 static GtkListStore *lrdata;
74 
75 /* Local methods. */
76 static void update_lzd(BigDFT_Lzd *lzd);
77 
78 /* Callbacks. */
79 static void onDataLoaded(GObject *obj, VisuData *dataObj, gpointer data);
80 static void onGridToggled(GtkCellRendererToggle *cell_renderer, gchar *path,
81                           gpointer user_data);
82 
bdft_system_init()83 void bdft_system_init()
84 {
85   lrdata = gtk_list_store_new(LR_N_COLUMNS, G_TYPE_OBJECT, G_TYPE_STRING,
86                               G_TYPE_UINT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
87                               GDK_TYPE_PIXBUF);
88 
89   g_signal_connect(VISU_OBJECT_INSTANCE, "dataLoaded",
90                    G_CALLBACK(onDataLoaded), NULL);
91 }
onLzdDefined(BigDFT_Lzd * lzd,gpointer data _U_)92 static void onLzdDefined(BigDFT_Lzd *lzd, gpointer data _U_)
93 {
94   update_lzd(lzd);
95 }
onDataLoaded(GObject * obj _U_,VisuData * dataObj,gpointer data _U_)96 static void onDataLoaded(GObject *obj _U_, VisuData *dataObj, gpointer data _U_)
97 {
98   BigDFT_Wf *wf;
99 
100   if (!dataObj)
101     return;
102 
103   wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_wf");
104   update_lzd(NULL);
105   if (wf)
106     g_signal_connect(G_OBJECT(wf->lzd), "defined",
107                      G_CALLBACK(onLzdDefined), (gpointer)0);
108 
109   DBG_fprintf(stderr, "BigDFT system: 'DataLoaded' signal OK.\n");
110 }
111 
bdft_system_tab(BigDFT_Lzd * lzd)112 GtkWidget* bdft_system_tab(BigDFT_Lzd *lzd)
113 {
114   GtkWidget *wd, *ct, *vbox;
115   GtkCellRenderer *render;
116   GtkTreeViewColumn *col;
117 
118   vbox = gtk_vbox_new(FALSE, 2);
119 
120   ct = gtk_scrolled_window_new((GtkAdjustment*)0, (GtkAdjustment*)0);
121   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ct),
122                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
123   gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct),
124 				      GTK_SHADOW_ETCHED_IN);
125   gtk_box_pack_start(GTK_BOX(vbox), ct, TRUE, TRUE, 0);
126   wd = gtk_tree_view_new_with_model(GTK_TREE_MODEL(lrdata));
127   gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(wd), FALSE);
128   gtk_container_add(GTK_CONTAINER(ct), wd);
129   /* Columns. */
130   render = gtk_cell_renderer_text_new();
131   col = gtk_tree_view_column_new_with_attributes("", render, "markup", LR_LABEL, NULL);
132   gtk_tree_view_column_set_expand(col, TRUE);
133   render = gtk_cell_renderer_pixbuf_new();
134   gtk_tree_view_column_pack_end(col, render, FALSE);
135   gtk_tree_view_column_add_attribute(col, render, "pixbuf", LR_COLOR);
136   gtk_tree_view_append_column(GTK_TREE_VIEW(wd), col);
137   render = gtk_cell_renderer_toggle_new();
138   g_signal_connect(G_OBJECT(render), "toggled",
139                    G_CALLBACK(onGridToggled), (gpointer)LR_SHOW_GRID_C);
140   col = gtk_tree_view_column_new_with_attributes("", render, "active", LR_SHOW_GRID_C, NULL);
141   gtk_tree_view_append_column(GTK_TREE_VIEW(wd), col);
142   render = gtk_cell_renderer_toggle_new();
143   g_signal_connect(G_OBJECT(render), "toggled",
144                    G_CALLBACK(onGridToggled), (gpointer)LR_SHOW_GRID_F);
145   col = gtk_tree_view_column_new_with_attributes("", render, "active", LR_SHOW_GRID_F, NULL);
146   gtk_tree_view_append_column(GTK_TREE_VIEW(wd), col);
147 
148   update_lzd(lzd);
149 
150   return vbox;
151 }
152 
update_lzd(BigDFT_Lzd * lzd)153 static void update_lzd(BigDFT_Lzd *lzd)
154 {
155   GtkTreeIter iter;
156   gchar *lbl;
157   guint i;
158   GdkPixbuf *pixbuf;
159 
160   gtk_list_store_clear(lrdata);
161   if (!lzd)
162     return;
163 
164   /* Global region. */
165   lbl = g_strdup_printf("Global region\n<span size=\"smaller\">"
166                         "   %d / %d (coarse / fine grid pts)</span>",
167                         lzd->parent.nvctr_c, lzd->parent.nvctr_f);
168   gtk_list_store_append(lrdata, &iter);
169   gtk_list_store_set(lrdata, &iter, LR_OBJECT, &lzd->parent,
170                      LR_LABEL, lbl, LR_ID, 0, LR_SHOW_GRID_C,
171                      FALSE, LR_SHOW_GRID_F, FALSE, -1);
172   g_free(lbl);
173   /* Local regions. */
174   if (lzd->nlr > 1)
175     for (i = 0; i < lzd->nlr; i++)
176       {
177         lbl = g_strdup_printf("Local region %d\n<span size=\"smaller\">"
178                               "   %d / %d (coarse / fine grid pts)</span>",
179                               i + 1, lzd->Llr[i]->nvctr_c, lzd->Llr[i]->nvctr_f);
180         pixbuf = tool_color_get_stamp(tool_color_new_bright(i), FALSE);
181         gtk_list_store_append(lrdata, &iter);
182         gtk_list_store_set(lrdata, &iter, LR_OBJECT, lzd->Llr[i],
183                            LR_LABEL, lbl, LR_ID, i + 1, LR_COLOR, pixbuf,
184                            LR_SHOW_GRID_C, FALSE, LR_SHOW_GRID_F, FALSE, -1);
185         g_free(lbl);
186         g_object_unref(pixbuf);
187       }
188 }
189 
onGridToggled(GtkCellRendererToggle * cell_renderer,gchar * path,gpointer user_data)190 static void onGridToggled(GtkCellRendererToggle *cell_renderer, gchar *path,
191                           gpointer user_data)
192 {
193   GtkTreePath* tpath = gtk_tree_path_new_from_string(path);
194   GtkTreeIter iter;
195   gboolean valid;
196   BigDFT_Locreg *lr;
197   GArray *gcoord;
198   BigDFT_Wf *wf;
199   BigDFT_LocregIter iseg;
200   float vect[3];
201   guint nseg, tseg, ilr;
202   VisuData *dataObj;
203   VisuGlView *view;
204   gchar *lbl;
205 
206   valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(lrdata), &iter, tpath);
207   gtk_tree_path_free(tpath);
208   g_return_if_fail(valid);
209 
210   dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT));
211   view = visu_ui_panel_getView(VISU_UI_PANEL(panelBigDFT));
212   g_return_if_fail(dataObj && view);
213   wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_wf");
214   g_return_if_fail(wf);
215 
216   gtk_tree_model_get(GTK_TREE_MODEL(lrdata), &iter,
217                      LR_OBJECT, &lr, LR_ID, &ilr, -1);
218 
219   if (GPOINTER_TO_INT(user_data) == LR_SHOW_GRID_C)
220     {
221       nseg = lr->nseg_c;
222       tseg = GRID_COARSE;
223       lbl = "g";
224     }
225   else
226     {
227       nseg = lr->nseg_f;
228       tseg = GRID_FINE;
229       lbl = "G";
230     }
231 
232   valid = !gtk_cell_renderer_toggle_get_active(cell_renderer);
233   gtk_list_store_set(lrdata, &iter, GPOINTER_TO_INT(user_data), valid, -1);
234   if (valid)
235     {
236       gcoord = g_array_sized_new(FALSE, FALSE, sizeof(gfloat) * 3, 2 * nseg);
237       for (valid = bigdft_lzd_iter_new(wf->lzd, &iseg, tseg, ilr); valid;
238            valid = bigdft_lzd_iter_next(&iseg))
239         {
240           vect[0] = iseg.x0;
241           vect[1] = iseg.y;
242           vect[2] = iseg.z;
243           g_array_append_val(gcoord, vect);
244           if (iseg.x1 != iseg.x0)
245             {
246               vect[0] = iseg.x1;
247               vect[1] = iseg.y;
248               vect[2] = iseg.z;
249               g_array_append_val(gcoord, vect);
250             }
251         }
252     }
253   else
254     gcoord = g_array_sized_new(FALSE, FALSE, sizeof(gfloat) * 3, 1);
255 
256   bigdft_show_grid(dataObj, gcoord, lbl, ilr);
257 
258   g_array_unref(gcoord);
259   g_object_unref(lr);
260 
261   VISU_REDRAW_ADD;
262 }
263