Radiation pattern of a few moment tensor earthquake sources

Four type of earthquake sources:
1) explosion M=[1 0 0;0 1 0;0 0 1]
2) single force M=[1 0 0;0 0 0;0 0 0]
3) double couple M=[1 0 0;0 0 0;0 0 -1]
4) CLVD M=[2 0 0;0 -1 0;0 0 -1]
and their corresponding radiation patterns of both P- and S-wave in the far field

Explosion source and vector source

Explosion source and vector source

Double-couple and CLVD source

Double-couple and CLVD source

Other than that explosion generates no S-wave, all other sources generate both P- and S-wave energy in the far field including DC, CLVD.

Automatically generate N distinct colors – A python script

Inspired by discussions here, I coded up a python script to generate N (<=20) distinct colors in RGB.

"""
To generate N distinct colorcode, N < 20
First created by Junwei Huang, March 21 2013
"""
from numpy import *
import matplotlib.pyplot as plt

def hex_to_rgb(value):
	value = value.lstrip('#')
	lv = len(value)
	return tuple(int(value[i:i+lv/3], 16) for i in range(0, lv, lv/3))

N=60

ColourValues=["FF0000", "00FF00", "0000FF", "FFFF00", "FF00FF", "00FFFF", "000000",
        "800000", "008000", "000080", "808000", "800080", "008080", "808080",
        "C00000", "00C000", "0000C0", "C0C000", "C000C0", "00C0C0", "C0C0C0",
        "400000", "004000", "000040", "404000", "400040", "004040", "404040",
        "200000", "002000", "000020", "202000", "200020", "002020", "202020",
        "600000", "006000", "000060", "606000", "600060", "006060", "606060",
        "A00000", "00A000", "0000A0", "A0A000", "A000A0", "00A0A0", "A0A0A0",
        "E00000", "00E000", "0000E0", "E0E000", "E000E0", "00E0E0", "E0E0E0"]
M=len(ColourValues)

plt.figure()
plt.hold('on')
for i in range(N):
	plt.bar(i,1.0,color="#"+ColourValues[mod(i,M)])
	print hex_to_rgb(ColourValues[mod(i,M)])

plt.show()

As seen in the figure, it is distinct if N < 20.

RGB color code

RGB color code

3D visualization of DXF STL file using mayavi python script

extensive googling doesn’t find a good solution. Writing a python script from scratch actually takes much less time.

"""
To read a STL file and plot in mayavi
First created by Junwei Huang @ Toronto, Feb 26, 2013
"""

from numpy import *
from mayavi import mlab

STLfile="test.stl"
f=open(STLfile,'r')

x=[]
y=[]
z=[]

for line in f:
	strarray=line.split()
	if strarray[0]=='vertex':
		x=append(x,double(strarray[1]))
		y=append(y,double(strarray[2]))
		z=append(z,double(strarray[3]))

triangles=[(i, i+1, i+2) for i in range(0, len(x),3)]

mlab.triangular_mesh(x, y, z, triangles)
mlab.show()
tunnel geometry from STL file

tunnel geometry from STL file

Q: What about DXF file?
A: Convert DXF to STL file first before using this script:)

Why a c++ program based on openmpi 1.4.3 failed to execute the system() function

It wasted me a full day to find out why running a c++ program with a system() function call failed.

Background: to output moderate size of files by 30 processors and merge them to a single file.

MPI_Barrier( MPI_COMM_WORLD );
if(my_rank==0) {
   int sysflag;
   if (!system(NULL)) {printf("nError!...command processor is unavailablen");exit(1);}
   for (int i=0;i stackX.bin ",i);sysflag=system(cmd);//printf("system returned %dn", sysflag);
      } else {
         sprintf(cmd,"cat PE%d_loc_stackX.3d >> stackX.bin ",i);sysflag=system(cmd);//printf("system returned %dn", sysflag);
         sprintf(cmd,"rm PE%d_loc_stackX.3d",i);sysflag=system(cmd); //printf("system returned %dn", sysflag);
      }
   }
}
MPI_Barrier( MPI_COMM_WORLD );

That “Command processor is unavailable” is always the case, although this “save-individually-and-merge-later” works for another program. Extensive webpage search may indicate openmpi sometimes doesn’t support fork() which is used by system() call. However, this is not the reason in my case, since it works for other programs.

Options:
(a) all slave processors send data to the master which writes to a single file;
(b) all processors write their own file and merge to a single file afterwards;
(c) use MPI I/O.

My choice:
(b). (b) is faster than (a) and is easier to implement than (c).

My guess:
My understanding is the system() will spawn a sub-process costing the same amount of memory as other processors. Therefore in my case, one node running 5 processors already consumed 90% of memory and thus won’t have enough memory to run another sub-process. Consequently, function call of system() fails. In addition, system() does not throw exceptions upon failure. Thus the c++ program doesn’t execute the command passing to system() and appears nothing happened.

My solution:
reduce the number of node from 5 to 4 solves the problem.

Helmer cluster reborn on 21/12/2012

18 cores home make cluster (see here) has been in service since March 07 2012. Some show cases have been demonstrated here, here, and here. All are successful. Today (Dec 21, 2012) this 18-core cluster is upgraded to its maximum capability to host 36 cores. More exciting high-performance results will be posted soon. Stay tuned.

36-core helmer cluster after being upgraded

Doxygen Intergration in Visual Studio 2010 Environment

When the source code package is huge including more than 2000 files and each may have > 10,000 lines of code, it is a good idea to generate some documents using doxygen. “Doxygen is a documentation system for C++, C, Java, Objective-C, Python, IDL (Corba and Microsoft flavors), Fortran, VHDL, PHP, C#, and to some extent D.” (webpage), it works out of the box on Linux/UNIX. For windows under Visual studio environment, some extra settings are needed. Here are the steps:

1. Download the Win32 binaries here and install them. For example, you installed doxygen in c:program filesdoxygen.
2. Create a doxygen configuration file and save it as default.doxygen under the same folder as the project. Notice that to generate graphical representation of class hierachy, you need to install graphivz (link). Here is the one I used.

# Doxyfile 1.8.2

#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
DOXYFILE_ENCODING      = UTF-8
PROJECT_NAME           = "InSite"
PROJECT_NUMBER         = 2.16
OUTPUT_DIRECTORY       =
CREATE_SUBDIRS         = NO
OUTPUT_LANGUAGE        = English
BRIEF_MEMBER_DESC      = YES
REPEAT_BRIEF           = YES
ABBREVIATE_BRIEF       = "The $name class" 
 "The $name widget" 
 "The $name file" 
 is 
 provides 
 specifies 
 contains 
 represents 
 a 
 an 
 the
ALWAYS_DETAILED_SEC    = NO
INLINE_INHERITED_MEMB  = NO
FULL_PATH_NAMES        = YES
STRIP_FROM_PATH        =
STRIP_FROM_INC_PATH    =
SHORT_NAMES            = NO
JAVADOC_AUTOBRIEF      = NO
QT_AUTOBRIEF           = NO
MULTILINE_CPP_IS_BRIEF = NO
INHERIT_DOCS           = YES
SEPARATE_MEMBER_PAGES  = NO
TAB_SIZE               = 8
ALIASES                =
OPTIMIZE_OUTPUT_FOR_C  = NO
OPTIMIZE_OUTPUT_JAVA   = NO
OPTIMIZE_FOR_FORTRAN   = NO
OPTIMIZE_OUTPUT_VHDL   = NO
BUILTIN_STL_SUPPORT    = NO
CPP_CLI_SUPPORT        = YES
SIP_SUPPORT            = NO
IDL_PROPERTY_SUPPORT   = YES
DISTRIBUTE_GROUP_DOC   = NO
SUBGROUPING            = YES
TYPEDEF_HIDES_STRUCT   = NO
SYMBOL_CACHE_SIZE      = 0
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL            = YES
EXTRACT_PRIVATE        = YES
EXTRACT_STATIC         = YES
EXTRACT_LOCAL_CLASSES  = YES
EXTRACT_LOCAL_METHODS  = YES
EXTRACT_ANON_NSPACES   = YES
HIDE_UNDOC_MEMBERS     = NO
HIDE_UNDOC_CLASSES     = NO
HIDE_FRIEND_COMPOUNDS  = NO
HIDE_IN_BODY_DOCS      = NO
INTERNAL_DOCS          = NO
CASE_SENSE_NAMES       = YES
HIDE_SCOPE_NAMES       = NO
SHOW_INCLUDE_FILES     = YES
INLINE_INFO            = YES
SORT_MEMBER_DOCS       = YES
SORT_BRIEF_DOCS        = NO
SORT_GROUP_NAMES       = NO
SORT_BY_SCOPE_NAME     = NO
GENERATE_TODOLIST      = YES
GENERATE_TESTLIST      = YES
GENERATE_BUGLIST       = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS       =
MAX_INITIALIZER_LINES  = 30
SHOW_USED_FILES        = YES
SHOW_DIRECTORIES       = NO
SHOW_FILES             = YES
SHOW_NAMESPACES        = YES
FILE_VERSION_FILTER    =
LAYOUT_FILE            =
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET                  = NO
WARNINGS               = YES
WARN_IF_UNDOCUMENTED   = YES
WARN_IF_DOC_ERROR      = YES
WARN_NO_PARAMDOC       = NO
WARN_FORMAT            = "$file:$line: $text"
WARN_LOGFILE           =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
INPUT                  = .
INPUT_ENCODING         = UTF-8
FILE_PATTERNS          = *.c 
 *.cc 
 *.cxx 
 *.cpp 
 *.c++ 
 *.d 
 *.java 
 *.ii 
 *.ixx 
 *.ipp 
 *.i++ 
 *.inl 
 *.h 
 *.hh 
 *.hxx 
 *.hpp 
 *.h++ 
 *.idl 
 *.odl 
 *.cs 
 *.php 
 *.php3 
 *.inc 
 *.m 
 *.mm 
 *.dox 
 *.py 
 *.f90 
 *.f 
 *.vhd 
 *.vhdl
RECURSIVE              = YES
EXCLUDE                =
EXCLUDE_SYMLINKS       = NO
EXCLUDE_PATTERNS       =
EXCLUDE_SYMBOLS        =
EXAMPLE_PATH           =
EXAMPLE_PATTERNS       = *
EXAMPLE_RECURSIVE      = NO
IMAGE_PATH             =
INPUT_FILTER           =
FILTER_PATTERNS        =
FILTER_SOURCE_FILES    = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER         = YES
INLINE_SOURCES         = YES
STRIP_CODE_COMMENTS    = YES
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION    = YES
REFERENCES_LINK_SOURCE = YES
USE_HTAGS              = NO
VERBATIM_HEADERS       = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
COLS_IN_ALPHA_INDEX    = 5
IGNORE_PREFIX          =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML          = YES
HTML_OUTPUT            = html
HTML_FILE_EXTENSION    = .html
HTML_HEADER            =
HTML_FOOTER            =
HTML_STYLESHEET        =
HTML_ALIGN_MEMBERS     = YES
HTML_DYNAMIC_SECTIONS  = NO
GENERATE_DOCSET        = NO
DOCSET_FEEDNAME        = "Doxygen generated docs"
DOCSET_BUNDLE_ID       = org.doxygen.Project
GENERATE_HTMLHELP      = NO
CHM_FILE               =
HHC_LOCATION           =
GENERATE_CHI           = NO
CHM_INDEX_ENCODING     =
BINARY_TOC             = NO
TOC_EXPAND             = NO
GENERATE_QHP           = NO
QCH_FILE               =
QHP_NAMESPACE          = org.doxygen.Project
QHP_VIRTUAL_FOLDER     = doc
QHG_LOCATION           =
DISABLE_INDEX          = NO
ENUM_VALUES_PER_LINE   = 4
GENERATE_TREEVIEW      = ALL
TREEVIEW_WIDTH         = 250
FORMULA_FONTSIZE       = 10
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX         = NO
LATEX_OUTPUT           = latex
LATEX_CMD_NAME         = latex
MAKEINDEX_CMD_NAME     = makeindex
COMPACT_LATEX          = NO
PAPER_TYPE             = a4wide
EXTRA_PACKAGES         =
LATEX_HEADER           =
PDF_HYPERLINKS         = YES
USE_PDFLATEX           = YES
LATEX_BATCHMODE        = NO
LATEX_HIDE_INDICES     = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
GENERATE_RTF           = NO
RTF_OUTPUT             = rtf
COMPACT_RTF            = NO
RTF_HYPERLINKS         = NO
RTF_STYLESHEET_FILE    =
RTF_EXTENSIONS_FILE    =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
GENERATE_MAN           = NO
MAN_OUTPUT             = man
MAN_EXTENSION          = .3
MAN_LINKS              = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML           = NO
XML_OUTPUT             = xml
XML_SCHEMA             =
XML_DTD                =
XML_PROGRAMLISTING     = YES
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF   = NO
#---------------------------------------------------------------------------
# configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD       = NO
PERLMOD_LATEX          = NO
PERLMOD_PRETTY         = YES
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING   = YES
MACRO_EXPANSION        = NO
EXPAND_ONLY_PREDEF     = NO
SEARCH_INCLUDES        = YES
INCLUDE_PATH           =
INCLUDE_FILE_PATTERNS  =
PREDEFINED             =
EXPAND_AS_DEFINED      =
SKIP_FUNCTION_MACROS   = YES
#---------------------------------------------------------------------------
# Configuration::additions related to external references
#---------------------------------------------------------------------------
TAGFILES               =
GENERATE_TAGFILE       =
ALLEXTERNALS           = NO
EXTERNAL_GROUPS        = YES
PERL_PATH              = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS         = YES
MSCGEN_PATH            =
HIDE_UNDOC_RELATIONS   = YES
HAVE_DOT               = YES
DOT_FONTNAME           = FreeSans
DOT_FONTPATH           =
CLASS_GRAPH            = YES
COLLABORATION_GRAPH    = YES
GROUP_GRAPHS           = YES
UML_LOOK               = YES
TEMPLATE_RELATIONS     = YES
INCLUDE_GRAPH          = YES
INCLUDED_BY_GRAPH      = YES
CALL_GRAPH             = YES
CALLER_GRAPH           = YES
GRAPHICAL_HIERARCHY    = YES
DIRECTORY_GRAPH        = YES
DOT_IMAGE_FORMAT       = png
DOT_PATH               = "C:Program Files (x86)Graphviz 2.28bindot.exe"
DOTFILE_DIRS           =
DOT_GRAPH_MAX_NODES    = 50
MAX_DOT_GRAPH_DEPTH    = 1000
DOT_TRANSPARENT        = YES
DOT_MULTI_TARGETS      = YES
GENERATE_LEGEND        = YES
DOT_CLEANUP            = YES
#---------------------------------------------------------------------------
# Configuration::additions related to the search engine
#---------------------------------------------------------------------------
SEARCHENGINE           = YES

3. Add a new custom tool, called “DoxyGen”, with the following parameters:
Command: c:program filesdoxygenbindoxygen.exe (or where you installed it)
Arguments: “$(ItemDir)default.doxygen” (the config file – including the quotes)
Initial Directory: $(ItemDir)
Check the “Use the output window” box
4. Add another tool, to view the results new “View DoxyDoc” tool, to view the results:
Command your favorite browser, e.g. C:Program Files (x86)Mozilla Firefoxfirefox.exe
Arguments: “$(ItemDir)htmlindex.html” (including the quotes)
Initial Directory: leave empty
5. Under the solution view, right click the project and select “Add”->”Existing Item…” and in the pop-up window select default.doxygen under your project folder. Open it for editing in VC++, and Change the PROJECT_NAME and the PROJECT_NUMBER to match your project.
6. Choose Tools/doxygen from the menu, and watch the output dump into the Output window of visual studio. Once finished, check for any error messages.
7. You are done! Use Tool->View DoxyDoc to open the index.html file.

Doxygen in Visual Studio 2010

Doxygen in Visual Studio 2010


This article was inspired by this blog (link).