diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1ce15b09cd0096a7078c2f8c517aa4ec92a3c5b2..9f8440f05f822871ddfa4a78bd4832418fbe63c0 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,33 +1,73 @@
+## Specify the project
 cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
 
+if(NOT CMAKE_CUDA_ARCHITECTURES)
+  set(CMAKE_CUDA_ARCHITECTURES 70 75)
+endif()
+
 # option(USE_CUDA "Use CUDA" ON)
 set(USE_CUDA ON)
 
 if(USE_CUDA)
-# set the project name and version
-project(arbd VERSION 1.2 LANGUAGES CXX CUDA)
+  project(arbd VERSION 1.2 LANGUAGES CXX CUDA)
 else(USE_CUDA)
-project(arbd VERSION 1.2 LANGUAGES CXX)
+  project(arbd VERSION 1.2 LANGUAGES CXX)
 endif()
 
-# specify the C++ standard
+## specify the C++ standard
 set(CMAKE_CXX_STANDARD 14)
 set(CMAKE_CXX_STANDARD_REQUIRED True)
-set(CMAKE_VERBOSE_MAKEFILE True)
+
+# Set a default build type if none was specified
+set(default_build_type "Release")
+
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+  message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
+  set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
+    STRING "Choose the type of build." FORCE)
+  ## Set the possible values of build type for cmake-gui
+  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+    "Debug" "Release" "RelWithDebInfo" "MinSizeRel")
+endif()
+
+
+
+if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+  ## Some CMake versions use -O2 for release; replace with -O3
+  string(REPLACE "-O2" "-O3" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
+  string(REPLACE "-O2" "-O3" CMAKE_CUDA_FLAGS_RELEASE ${CMAKE_CUDA_FLAGS_RELEASE})
+endif()
+
 
 ## OPTIONS
-option(USE_NCCL "Use NCCL for single node GPU peer communication" ON)
+option(USE_NCCL "Use NCCL for single node GPU peer communication" False)
+option(USE_NVTX "Build with NVTX profiling ranges" False)
+option(DEBUG "Build with debug flags" False)
 
+# (not yet optional) message(STATUS "USE_CUDA: ${USE_CUDA}")
+message(STATUS "USE_NCCL: ${USE_NCCL}")
+message(STATUS "USE_NVTX: ${USE_NVTX}")
+message(STATUS "DEBUG: ${DEBUG}")
+
+
+## Set flags before adding executable 
 # configure_file(TutorialConfig.h.in TutorialConfig.h)
-message(STATUS "USE_CUDA: ${USE_CUDA}")
 if(USE_CUDA)
-    add_definitions(-DUSE_CUDA)
-    ## CUDA_INCLUDE_DIRS wasn't getting set on my system with cmake 3.14.1, so check if in env
-    if(DEFINED ENV{CUDA_INCLUDE_DIRS})
+  add_definitions(-DUSE_CUDA)
+  ## CUDA_INCLUDE_DIRS wasn't getting set on my system with cmake 3.14.1, so check if in env
+  if(DEFINED ENV{CUDA_INCLUDE_DIRS})
     set(CUDA_INCLUDE_DIRS $ENV{CUDA_INCLUDE_DIRS})
-    endif()    
-    message(STATUS "CUDA_INC: ${CUDA_INCLUDE_DIRS}")
-    include_directories(${CUDA_INCLUDE_DIRS})
+  endif()
+  # message(STATUS "CUDA_INC: ${CUDA_INCLUDE_DIRS}")
+  include_directories(${CUDA_INCLUDE_DIRS})
+endif()
+
+if(USE_NVTX)
+  add_definitions(-DUSE_NVTX)
+endif()
+if(USE_NCCL)
+  add_definitions(-DUSE_NCCL)
+  target_link_libraries(arbd PRIVATE nccl)
 endif()
 
 ## Two lines below needed?
@@ -45,47 +85,51 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
 set(CMAKE_MACOSX_RPATH 1)	# Unsure if this works for CMAKE_BUIlD_RPATH, or just CMAKE_INSTALL_RPATH
 set(CMAKE_BUILD_RPATH "${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES}")
 
+# set(CMAKE_VERBOSE_MAKEFILE True)
 add_executable(arbd arbd.cpp
-Configuration.cpp
-FlowForce.cpp
-GPUManager.cpp
-Scatter.cpp
-SignalManager.cpp
-WKFUtils.cpp
-Angle.cu
-BaseGrid.cu
-BrownianParticle.cu
-BrownianParticleType.cpp
-RigidBodyController.cu
-RigidBody.cu
-RigidBodyGrid.cu
-RigidBodyType.cu
-CellDecomposition.cu
-ComputeForce.cuh
-ComputeForce.cu
-ComputeGridGrid.cuh
-ComputeGridGrid.cu
-CudaUtil.cu
-CudaUtil.cuh
-Dihedral.cu
-Exclude.cu
-GrandBrownTown.cu
-GrandBrownTown.cuh
-imd.cpp
-vmdsock.cpp
-JamesBond.cu
-RandomCUDA.cu
-Reservoir.cu
-TabulatedAngle.cu
-TabulatedDihedral.cu
-TabulatedMethods.cuh
-TabulatedPotential.cu
-useful.cu
-)
-
-target_link_libraries(arbd PRIVATE curand)
-
-message(STATUS "Run: ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS")
-## target_link_libraries(ARBD PUBLIC) MPI::MPI_CXX)
+  Configuration.cpp
+  FlowForce.cpp
+  GPUManager.cpp
+  Scatter.cpp
+  SignalManager.cpp
+  WKFUtils.cpp
+  Angle.cu
+  BaseGrid.cu
+  BrownianParticle.cu
+  BrownianParticleType.cpp
+  RigidBodyController.cu
+  RigidBody.cu
+  RigidBodyGrid.cu
+  RigidBodyType.cu
+  CellDecomposition.cu
+  ComputeForce.cuh
+  ComputeForce.cu
+  ComputeGridGrid.cuh
+  ComputeGridGrid.cu
+  CudaUtil.cu
+  CudaUtil.cuh
+  Dihedral.cu
+  Exclude.cu
+  GrandBrownTown.cu
+  GrandBrownTown.cuh
+  imd.cpp
+  vmdsock.cpp
+  JamesBond.cu
+  RandomCUDA.cu
+  Reservoir.cu
+  TabulatedAngle.cu
+  TabulatedDihedral.cu
+  TabulatedMethods.cuh
+  TabulatedPotential.cu
+  useful.cu
+  )
+
+## Add optional libraries
+if(USE_CUDA)
+  target_link_libraries(arbd PRIVATE curand)
+endif()
+if(USE_NCCL)
+  target_link_libraries(arbd PRIVATE nccl)
+endif()
 
 install(TARGETS arbd)