530 likes | 678 Views
Scientific Visualization in SCIRun. David Weinstein SIAM CSE 02.09.2003. Scientific Computing and Imaging Institute School of Computing University of Utah. Overview. Examples Tour of SCIRun - How To Get / Install It - Dataflow - Building A Module Live Demos.
E N D
Scientific Visualization inSCIRun David Weinstein SIAM CSE 02.09.2003 Scientific Computing and Imaging Institute School of Computing University of Utah
Overview • Examples • Tour of SCIRun • - How To Get / Install It • - Dataflow • - Building A Module • Live Demos
What If? user guides Integration and Interaction Modeling Simulation Visualization
Elements of SCIRun • Visual programming Environment
Extensibility • Leverage existing utilities • Extensibility through bridges GENESIS Matlab libimage SQL lib socket SCIRun Teem lib mpeg lib
Documentation: The Central Source http://internal.sci.utah.edu/developer/doc/
Documentation: User Support • On-line Documentation • Tutorial • User’s Manual • FAQ Lists • Printed Documentation • User’s Manuals • Mailing List • scirun-users@sci.utah.edu • Direct Contact • Email and Bugzilla • Phone
System Specs and Requirements • Required OS and Build Tools • SGI • IRIX 6.5 • MIPSPro Compilers (CC) 7.3.1.1m • Linux • Kernel 2.2.17 • GCC 2.95.3 • Both • GNU Make 3.79.1 http://software.sci.utah.edu/doc/TechnicalGuide/p1c1.html
Minimum System Requirements • Tested Systems: Gateway, Micron, Dell. • http://software.sci.utah.edu/tested_systems/tested_systems.html http://software.sci.utah.edu/doc/TechnicalGuide/p1c2.html
Network Design • Dataflow Vocabulary • Module • Dataport • Datapipe • UI • Send and Get • GuiVars • Scheduler • Dependencies • loops: send_intermediate
Packages • Encapsulated project • External code resides in Thirdparty • Packages enabled via “configure” options % configure ‘--enable-package=BioPSE mypackage’
Module Categories • …/Dataflow/Modules/{Fields,Math,…}
Fields Data int, float, double, … Vector, Tensor, … PointCloudField Geometry Regular Irregular ScanlineField CurveField QuadSurfField TriSurfField ImageField Properties Data_at (center) TetVolField LatVolField HexVolField
On-the-fly Compilation • Combinatorial Explosion! • Geometry • Data type • Data_at • Build source, compile, link – all at run time
Error Messages • Run-time messages are sent to the module’s “log” Startup messages Log message indicator Gray: no messages Red: error Blue: warning/remark
How To Build A Module • Before You Start • Structure of a Module • Ports and Datatypes • Component Wizard • GUI’s • Dynamic Compilation Algorithm
Before You Start • Design Your Function • A Module is a Function • Inputs and Outputs • User Input (GUI Variables) • Dataflow • Coding Standard • Standards • Advice • SCIRun/doc/Developer/Guide/coding_standard.html
Module Structure • Support Files • .cc file • sub.mk • .xml file • .tcl file • sub.mk • .h file (optional)
Ports and Datatypes • Ports • LockingHandles • Generation number • Memory Management • Sending Data • Cache Results • Datatypes • Fields, Matrix, SceneGraph • Detach (Dataflow) • Properties
Component Wizard • Adding a Module
Component Wizard • Edit a Port • Name • Namespace
Component Wizard • Package • Category • Path
Component Wizard • New Package? • New Category? • Reconfiguring.
Component Wizard • After Compiling
Component Wizard • Your Skeleton GUI
GUI’s • TCL • itcl • blt • Use Simple GUI as a Pattern • GuiVars
GUI’s • itcl_class SCIRun_Fields_SelectField { inherit Module constructor {config} { set name SelectField global $this-stampvalue global $this-runmode set_defaults } method set_defaults {} { set $this-stampvalue 100 set $this-runmode 0 # 0 nothing 1 accumulate 2 replace } method replace {} { set $this-runmode 2 $this-c needexecute } method accumulate {} { set $this-runmode 1 $this-c needexecute }
GUI’s • method ui {} { set w .ui[modname] if {[winfo exists $w]} { raise $w return } toplevel $w frame $w.row1 frame $w.row3 frame $w.row4 pack $w.row1 $w.row3 $w.row4 -side top -e y -f both -padx 5 -pady 5 label $w.row1.value_label -text "Selection Value" entry $w.row1.value -textvariable $this-stampvalue pack $w.row1.value_label $w.row1.value -side left button $w.row3.execute -text "Replace" -command "$this replace" pack $w.row3.execute -side top -e n -f both button $w.row4.execute -text "Accumulate" -command "$this accumulate" pack $w.row4.execute -side top -e n -f both }
GUI’s • GuiVars • Values to from C side • Initialize • C++ side constructor synchs with tcl name • tcl side sets the initial value • my_var.reset() • my_var.get() • tcl_command(...) • $this-c “needexecute”
Algorithm Structure • Algorithm Base Class • Inherits from common base class • Defines the pure virtual interface needed by a module • Provides a static CompileInfo • Templated Algorithm • Implements the pure virtual interface in the base class • Potentially specialized for specific field type template<class Field> RenderField : public RenderFieldBase virtual void render(FieldBase&)=0;
TypeDescription • TypeDescription object augments RTTI • Holds: • Strings that describe object’s exact type • Namespace string • Path to the .h file that declares the object • Has a recursive structure • Example: foo<bar, foobar<int> >;
CompileInfo • Similar info as a TypeDescription • Algorithm is not instantiated, so cannot yet be queried • Start with a CompileInfo from Algorithm base class • Augmented with information from all pertinent TypeDescription objects for the specific types involved • Passed to DynamicLoader, which creates the proper type
DynamicLoader • Returns Requested Algorithm • Writes C++ instantiation code • Compile shared library, using SCIRun makefiles • Load shared library (dlopen) • Return Instance of Algorithm (Cached for next use) • Synchronization code such that • Only 1 thread can compile at a time per algorithm • Multiple algorithms can compile and load at the same time
Calling Module • void ShowField::execute(){// Get a Field from input field port. field = (FieldIPort *)get_iport("Field"); field->get(field_handle);// Get the input field's type info. const TypeDescription *td = field_handle->get_type_description();// Get the Algorithm. CompileInfo *ci = RenderFieldBase::get_compile_info(td); if (! DynamicLoader::scirun_loader().get(*ci, rend_algo)) { error("Could not compile algorithm for ShowField -"); • return; } RenderFieldBase *rf = dynamic_cast<RenderFieldBase*>(rend_algo);// Let the templated algorithm render this field. rf->render(field_handle, /* any other parameters from gui */);// Send results downstream...} No template instantiations for the exact algorithm type
Example • //! ConvertTetBase supports the dynamically loadable algorithm concept.//! when dynamically loaded the user will dynamically cast to a //! ConvertTetBase from the DynamicAlgoBase they will have a pointer to.class ConvertTetBase : public DynamicAlgoBase{public: virtual FieldHandle convert_quadratic(FieldHandle in) = 0; virtual ~ConvertTetBase(); static const string& get_h_file_path(); static string dyn_file_name(const TypeDescription *td) {// add no extension. return template_class_name() + "." + td->get_filename() + "."; } static const string base_class_name() { static string name("ConvertTetBase"); return name; } static const string template_class_name() { static string name("ConvertTet"); return name; }//! support the dynamically compiled algorithm concept static CompileInfo *get_compile_info(const TypeDescription *td);};