<div dir="ltr"><div dir="ltr">Here is a sample makefile, like what I use with the Intel MPI compilers (used during PETSc configuration) and MKL library.<div><br clear="all"><div><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><span style="font-size:12.8px">Matt Overholt</span><br></div><div dir="ltr"><div><br></div><div>---------------------------------------------</div></div></div></div></div></div></div></div><div><div>#</div><div># makefile for Linux using the Intel C++ Compiler, MKL & MPI libraries + OpenMP</div><div>#   usage: make</div><div>#   or: make clean</div><div>#</div><div># Although explicit paths are used for all libraries and compilers below, it is</div><div># still necessary to first call the Intel scripts as follows:</div><div>#   if [ -z "$I_MPI_ROOT" ]; then</div><div>#     source /opt/intel/compilers_and_libraries/linux/mpi/intel64/bin/mpivars.sh</div><div>#   fi</div><div>#   if [ -z "$MKLROOT" ]; then</div><div>#     source /opt/intel/parallel_studio_xe_2018/bin/psxevars.sh intel64</div><div>#   fi</div><div># Use OMP_NUM_THREADS to set # of threads</div><div><br></div><div>### MPI Compilers for C++ and C ###</div><div>COMPILER_DIR = /opt/intel/compilers_and_libraries/linux/mpi/intel64/bin</div><div>COMPILER = $(COMPILER_DIR)/mpiicpc</div><div>CCOMPILER = $(COMPILER_DIR)/mpiicc</div><div><br></div><div>### Intel MKL & MPI libraries ###</div><div>MKL_DIR = /opt/intel/compilers_and_libraries/linux/mkl</div><div>MKL_INC = $(MKL_DIR)/include</div><div>MKL_LIB = $(MKL_DIR)/lib/intel64</div><div><br></div><div>### Compiling Flags (debug and optimized) ###</div><div># CCFLAGS = -c -O0 -g -traceback -heap-arrays -check=stack,uninit -I$(MKL_INC) -qopenmp</div><div>CCFLAGS = -c -I$(MKL_INC) -qopenmp</div><div><br></div><div>### Linking Flags (debug and optimized) ###</div><div># CLFLAGS = -g -lstdc++ -qopenmp</div><div>CLFLAGS = -lstdc++ -qopenmp</div><div><br></div><div>### MKL Libraries ###</div><div># Sequential threading layer</div><div># MKLFLAGS = -Wl,--start-group \</div><div>#<span style="white-space:pre">  </span>${MKLROOT}/lib/intel64/libmkl_intel_lp64.a \</div><div>#<span style="white-space:pre"> </span>${MKLROOT}/lib/intel64/libmkl_sequential.a \</div><div>#<span style="white-space:pre"> </span>${MKLROOT}/lib/intel64/libmkl_core.a \</div><div>#<span style="white-space:pre">       </span>-Wl,--end-group -lpthread -lm -ldl</div><div># OpenMP parallel threading layer</div><div>MKLFLAGS = -Wl,--start-group \</div><div><span style="white-space:pre">       </span>$(MKL_LIB)/libmkl_intel_lp64.a \</div><div><span style="white-space:pre">      </span>$(MKL_LIB)/libmkl_intel_thread.a \</div><div><span style="white-space:pre">    </span>$(MKL_LIB)/libmkl_core.a \</div><div><span style="white-space:pre">    </span>$(MKL_LIB)/libmkl_blacs_intelmpi_lp64.a \</div><div><span style="white-space:pre">     </span>-Wl,--end-group -liomp5 -lpthread -lm -ldl</div><div><br></div><div>TARGET = myprogram</div><div><br></div><div>### Object Files ###</div><div>OBJFILES = \</div><div><span style="white-space:pre">   </span>class1.o \</div><div><span style="white-space:pre">    </span>class2.o</div><div><br></div><div>all: $(TARGET)</div><div><br></div><div>#</div><div># Build (link) it</div><div>$(TARGET) : $(OBJFILES)</div><div><span style="white-space:pre"> </span>$(COMPILER) -o $(TARGET) $(OBJFILES) $(CLFLAGS) $(MKLFLAGS)</div><div><span style="white-space:pre">   </span>echo $(TARGET) BUILT AS A 64-BIT LINUX APPLICATION!</div><div><br></div><div>#</div><div># Compile the source files with C and CPP MPI compilers</div><div># CPP</div><div>class1.o : class1.cpp</div><div><span style="white-space:pre">    </span>$(COMPILER) $(CCFLAGS) class1.cpp</div><div><br></div><div># C</div><div>class2.o : class2.c</div><div><span style="white-space:pre">        </span>$(CCOMPILER) $(CCFLAGS) class2.c</div><div><br></div><div># main</div><div>myprogram.o : myprogram.c</div><div><span style="white-space:pre">        </span>$(CCOMPILER) $(CCFLAGS) myprogram.c</div><div><br></div><div># to clean up</div><div>.PHONY : clean</div><div><br></div><div>clean:</div><div><span style="white-space:pre">   </span>-rm -f $(OBJFILES)</div><div><span style="white-space:pre">    </span>-rm -f $(TARGET)</div><div><span style="white-space:pre">      </span>echo myprogram cleaned</div></div><div><br></div>---------------------------------------------<br><div class="gmail_quote"><div dir="ltr">On Tue, Oct 23, 2018 at 1:46 PM Matthew Knepley <<a href="mailto:knepley@gmail.com">knepley@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Tue, Oct 23, 2018 at 11:37 AM Yingjie Wu <<a href="mailto:yjwu16@gmail.com" target="_blank">yjwu16@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Dear Petsc developer:<div>Hi,</div><div>Thank you very much for your continuous help, I recently encountered some difficulties in developing programs on Petsc.</div><div><br></div><div>1. I want to use my class definition (class1. h) and class functions (class1. cpp) files in my Petsc program (myprogram. c) and compile my program. I have written other program before: <br></div><div><div>g++ -c class1.cpp myprogram.c </div><div>g++ -o myprogram *.o</div></div><div>I also have some knowledge of Makefile, but I don't know how to modify it to achieve compilation. I really want your help. </div></div></div></div></div></div></div></blockquote><div><br></div><div>With PETSc makefiles, we have automatic rules, so you can use</div><div><br></div><div>myprogram: class1.o myprogram.o</div><div>       ${CLINKER} -o myprogram class1.o myprogram.o ${PETSC_LIB}</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>2.  In my class definition and function implementation program, I want to use Petsc data structures, such as PetscInt, PetscReal. In order to maintain consistency of the main program. What kind of header files should I add to my code, or do I need to add any code? </div></div></div></div></div></div></div></blockquote><div><br></div><div>The easiest thing to do is just</div><div><br></div><div>#include <petsc.h></div><div><br></div><div>  Thanks,</div><div><br></div><div>    Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Thanks,</div><div>Yingjie</div></div></div></div></div></div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail-m_2703218416148015526gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener</div><div><br></div><div><a href="http://www.cse.buffalo.edu/~knepley/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div></div></div></div>
</blockquote></div></div></div>