diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9e8fc58..6039cfb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,26 +1,30 @@
+##### Modifiable options that control version of code ######################
+
+option(USE_FFT3 "Use the fft3_mod file (and FFT3.0). Else, use fft2_mod" ON)
+option(USE_DEVEL "Use the -D DEVEL option with the Fortran preprocessor" OFF)
+option(BUILD_DMG "Build a DMG based application for OSX clients" OFF)
+
+############################################################################
+
IF (USE_INTEL)
set (CMAKE_C_COMPILER "icc")
set (CMAKE_CXX_COMPILER "icpc")
ENDIF (USE_INTEL)
-
-# CMakeLists files in this project can
-# refer to the root source directory of the project as ${PSCF_SOURCE_DIR} and
-# to the root binary directory of the project as ${PSCF_BINARY_DIR}.
cmake_minimum_required (VERSION 2.8.11)
project (PSCF Fortran)
#### Based on https://cmake.org/Wiki/CMakeForFortranExamplea ####
enable_language (Fortran)
-option(USE_FFT3 "Use the fft3_mod file (and FFT3.0). Otherwise, use fft2_mod (and FFTW2)" ON)
-option(USE_DEVEL "Use the -D DEVEL option with the Fortran preprocessor" OFF)
-option(BUILD_DMG "Build a DMG based application for OSX clients" OFF)
+# CMakeLists files in this project refer to the root source directory
+# of the project as ${PSCF_SOURCE_DIR} and to the root build/binary
+# directory of the project as ${PSCF_BINARY_DIR}.
# Add our extra Find*.cmake modules
LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/")
-# make sure that the default is a RELEASE
+# Make sure that the default is a RELEASE
if (NOT CMAKE_BUILD_TYPE)
set (CMAKE_BUILD_TYPE RELEASE CACHE STRING
"Choose the type of build, options are: None Debug Release."
@@ -30,12 +34,13 @@ endif (NOT CMAKE_BUILD_TYPE)
# default installation
#get_filename_component (default_prefix ".." ABSOLUTE)
#set (CMAKE_INSTALL_PREFIX ${default_prefix} CACHE STRING
-# "Choose the installation directory; by default it installs in the NORMA directory."
+# "Choose the install prefix; by default it installs in the NORMA directory."
# FORCE)
-# FFLAGS depend on the compiler
+# Identify fortran compiler name
get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)
+# Set compiler flags depend on the compiler
if (Fortran_COMPILER_NAME MATCHES "gfortran.*")
# gfortran
set (CMAKE_Fortran_FLAGS_RELEASE "-funroll-all-loops -fno-f2c -O3 -ffree-form")
@@ -44,10 +49,6 @@ elseif (Fortran_COMPILER_NAME MATCHES "ifort.*")
# ifort (untested)
set (CMAKE_Fortran_FLAGS_RELEASE "-O3 -free")
set (CMAKE_Fortran_FLAGS_DEBUG "-free -O0 -g")
-elseif (Fortran_COMPILER_NAME MATCHES "g77")
- # g77
- set (CMAKE_Fortran_FLAGS_RELEASE "-funroll-all-loops -fno-f2c -O3 -m32")
- set (CMAKE_Fortran_FLAGS_DEBUG "-fno-f2c -O0 -g -m32")
else (Fortran_COMPILER_NAME MATCHES "gfortran.*")
message ("CMAKE_Fortran_COMPILER full path: " ${CMAKE_Fortran_COMPILER})
message ("Fortran compiler: " ${Fortran_COMPILER_NAME})
@@ -57,12 +58,21 @@ else (Fortran_COMPILER_NAME MATCHES "gfortran.*")
endif (Fortran_COMPILER_NAME MATCHES "gfortran.*")
#### End based on https://cmake.org/Wiki/CMakeForFortranExamplea ####
+if (USE_DEVEL)
+ set (DEVEL "-DDEVEL=1")
+endif (USE_DEVEL)
-# Recurse into the "PSCF" subdirectory. This does not actually
-# cause another cmake executable to run. The same process will walk through
-# the project's entire directory structure.
-add_subdirectory (src)
+if (BUILD_DMG)
+ set (BUILD_MACOSX_BUNDLE "MACOSX_BUNDLE")
+ set (MACOSX_BUNDLE_EXT ".app")
+endif (BUILD_DMG)
+set(FORPEDO ${CMAKE_SOURCE_DIR}/tools/python/preprocess-0.6.1/preprocess.py)
+
+find_package(LAPACK)
+
+# Recurse into the "src" subdirectory.
+add_subdirectory (src)
# Setup the packaging
set(CPACK_PACKAGE_NAME "pscf")
diff --git a/make/INSTALL b/make/INSTALL
index 167075d..ba2a95a 100644
--- a/make/INSTALL
+++ b/make/INSTALL
@@ -58,7 +58,6 @@ defined in config.mk, enter:
6. If desired, to remove all of the files generated by compilation from
the make/ directory, enter:
-
> make clean
To remove any files that were created by the "make install" command,
diff --git a/make/Makefile b/make/Makefile
index 57670a7..8ed9c9b 100644
--- a/make/Makefile
+++ b/make/Makefile
@@ -54,17 +54,21 @@ pscf.f90: $(SRC)/pscf.fp.f90
# ====== Install =================================================
BIN_DIR=$(INSTALL)/bin
-PYTHON_DIR=$(INSTALL)/lib/python2.7/site-packages
+PYTHON_DIR=$(INSTALL)/lib/python2.7/site-packages/pscf
+MATLAB_DIR=$(INSTALL)/lib/matlab
install: pscf
mkdir -p $(BIN_DIR)
cp pscf $(BIN_DIR)/pscf
cp $(REPO)/tools/bin/pscf-env $(BIN_DIR)
cp $(REPO)/tools/bin/pscf-read-sweep $(BIN_DIR)
- mkdir -p $(PYTHON_DIR)/pscf
- cp $(REPO)/tools/python/pscf/*.py $(PYTHON_DIR)/pscf
+ mkdir -p $(PYTHON_DIR)
+ cp $(REPO)/tools/python/pscf/*.py $(PYTHON_DIR)
+ mkdir -p $(MATLAB_DIR)
+ cp $(REPO)/tools/matlab/*.m $(MATLAB_DIR)
uninstall:
rm -rf $(BIN_DIR)/pscf*
- rm -rf $(PYTHON_DIR)/pscf/*
+ rm -rf $(PYTHON_DIR)/*
+ rm -rf $(MATLAB_DIR)/*
diff --git a/make/modules.mk b/make/modules.mk
index a012aa8..feb5159 100644
--- a/make/modules.mk
+++ b/make/modules.mk
@@ -1,4 +1,3 @@
-# ====== Modules =================================================
# Utility modules
@@ -23,7 +22,7 @@ grid_mod.o: $(SRC)/grid_mod.f90 const_mod.o\
$(FFT_FILE).o: $(SRC)/$(FFT_FILE).f90 const_mod.o
$(F90) $(FAST) -c $(SRC)/$(FFT_FILE).f90
-# crystallography modules
+# Crystallography modules
group_mod.o: $(SRC)/group_mod.f90 const_mod.o version_mod.o
$(F90) $(FAST) -c $(SRC)/group_mod.f90
@@ -51,7 +50,7 @@ field_io_mod.o: $(SRC)/field_io_mod.f90 const_mod.o io_mod.o\
$(FFT_FILE).o grid_basis_mod.o
$(F90) $(FAST) -c $(SRC)/field_io_mod.f90
-# scft modules
+# SCFT modules
chemistry_mod.o: $(SRC)/chemistry_mod.f90 const_mod.o io_mod.o
$(F90) $(FAST) -c $(SRC)/chemistry_mod.f90
@@ -76,7 +75,7 @@ spinodal_mod.o: $(SRC)/spinodal_mod.f90 const_mod.o io_mod.o\
response_pd_mod.o chemistry_mod.o
$(F90) $(FAST) -c $(SRC)/spinodal_mod.f90
-# iteration modules
+# Iteration modules
iterate_mod.f90: $(SRC)/iterate_mod.fp.f90
$(FORPEDO) $(DEVEL) $(SRC)/iterate_mod.fp.f90 > iterate_mod.f90
@@ -95,7 +94,8 @@ sweep_mod.o: $(SRC)/sweep_mod.f90 const_mod.o io_mod.o\
chemistry_mod.o unit_cell_mod.o basis_mod.o
$(F90) $(FAST) -c $(SRC)/sweep_mod.f90
-# response directory
+# Linear response modules
+
response_step_mod.o: $(SRC)/response_step_mod.f90\
chemistry_mod.o $(FFT_FILE).o
$(F90) $(FAST) -c $(SRC)/response_step_mod.f90
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4e3c107..1b32072 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,40 +1,28 @@
-# TODO: move these options to the top file
-
-if (USE_FFT3)
- set (FFT_FILE fft3_mod.f90)
- find_package(FFTW)
-else (USE_FFT3)
- set (FFT_FILE fft2_mod.f90)
- find_package(FFTW)
-endif (USE_FFT3)
-
-if (USE_DEVEL)
- set (DEVEL "-DDEVEL=1")
-endif (USE_DEVEL)
-
-if (BUILD_DMG)
- set (BUILD_MACOSX_BUNDLE "MACOSX_BUNDLE")
- set (MACOSX_BUNDLE_EXT ".app")
-endif (BUILD_DMG)
-
-set(FORPEDO ${CMAKE_SOURCE_DIR}/tools/python/preprocess-0.6.1/preprocess.py)
-
-find_package(LAPACK)
+# Preprocess scf_mod module
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/scf_mod.f90
COMMAND ${FORPEDO} ${DEVEL} ${CMAKE_CURRENT_SOURCE_DIR}/scf_mod.fp.f90 > ${CMAKE_CURRENT_BINARY_DIR}/scf_mod.f90
DEPENDS scf_mod.fp.f90
)
+# Preprocess iterate_mod module
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/iterate_mod.f90
COMMAND ${FORPEDO} ${DEVEL} ${CMAKE_CURRENT_SOURCE_DIR}/iterate_mod.fp.f90 > ${CMAKE_CURRENT_BINARY_DIR}/iterate_mod.f90
DEPENDS iterate_mod.fp.f90
)
-# Create a library called "pscf_lib", which includes module source files.
-# The extension is already found. Any number of sources could be listed here.
+# Choose version of wrapper for FFTW library
+if (USE_FFT3)
+ set (FFT_FILE fft3_mod.f90)
+ find_package(FFTW)
+else (USE_FFT3)
+ set (FFT_FILE fft2_mod.f90)
+ find_package(FFTW)
+endif (USE_FFT3)
+
+# Create library called "pscf_lib" that contains all module files.
add_library(pscf_lib
const_mod.f90
io_mod.f90
@@ -61,35 +49,37 @@ add_library(pscf_lib
spinodal_mod.f90
)
-# Ensure that linker can find any headers or fortram *.mod module files,
-# including preprocessor geneerated sources placed in the build directory.
-# This is the in-core source dir
+# Add source and build directories to list of include directories
+# used when building pscf_lib. We add the build directory to ensure
+# that the compiler/archiver can find fortran module (*.mod) files
+# and preprocessor generated source (*.f90) files, all of which are
+# placed in the build directory.
+
+# Add the source directory.
target_include_directories (pscf_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
-# This is the out-of-source build dir, with generated sources
+
+# Add the out-of-source build dir
target_include_directories (pscf_lib PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
-# Link to FFTW and Lapack libraries
+# Link pscf_lib to FFTW and Lapack libraries
target_link_libraries(pscf_lib LINK_PUBLIC ${FFTW_LIBRARIES} ${LAPACK_LIBRARIES})
-
-### PREPROCESS THE MAIN FILE ###
+# Preprocess the main pscf program
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pscf.f90
COMMAND ${FORPEDO} ${DEVEL} ${CMAKE_CURRENT_SOURCE_DIR}/pscf.fp.f90 > ${CMAKE_CURRENT_BINARY_DIR}/pscf.f90
DEPENDS pscf.fp.f90
)
+# Build executable pscf from pscf.f90
add_executable(pscf
${BUILD_MACOSX_BUNDLE} WIN32
${CMAKE_CURRENT_BINARY_DIR}/pscf.f90
)
-set(APPS ${CMAKE_CURRENT_BINARY_DIR}/pscf${MACOSX_BUNDLE_EXT})
-set(DIRS "")
-
-# TODO: clean up these links
target_link_libraries(pscf LINK_PUBLIC pscf_lib)
+# Install target
install(TARGETS pscf
BUNDLE DESTINATION . COMPONENT Runtime
RUNTIME DESTINATION bin COMPONENT Runtime
@@ -97,6 +87,9 @@ install(TARGETS pscf
ARCHIVE DESTINATION lib/static COMPONENT Runtime
)
+set(APPS ${CMAKE_CURRENT_BINARY_DIR}/pscf${MACOSX_BUNDLE_EXT})
+set(DIRS "")
+
if (BUILD_DMG)
# Copy libraries into the DMG
INSTALL(CODE "
@@ -106,8 +99,3 @@ if (BUILD_DMG)
" COMPONENT Runtime)
endif (BUILD_DMG)
-#install(TARGETS pscf
-# RUNTIME DESTINATION bin
-# LIBRARY DESTINATION lib
-# ARCHIVE DESTINATION lib/static
-#)
diff --git a/src/README b/src/README
index af1bcdd..9711219 100644
--- a/src/README
+++ b/src/README
@@ -1,214 +1,218 @@
+========================================================================
+Source File Name Conventions:
-File Name Conventions:
+ Files named _mod.f90 are Fortran 90 module source files
+ Files named .fp.f90 are preprocessor input files.
- Files named _mod.f90 are Fortran 90 modules
- Files named .fp.f90 are preprocessor input files.
-
- The un-preprocessed version of the main program is src/pscf.fp.f90.
+ The un-preprocessed version of the main program is src/pscf.fp.f90.
A corresponding compilable fortran program is generated by applying
- a preprocessor script, which installs the resulting program in the
- build directory. See the end of this file for a discussion of the
+ a preprocessor script, which installs the resulting program in the
+ build directory. See the end of this file for a discussion of the
use of a preprocessor.
-Main Program:
+========================================================================
+Source Files:
pscf.fp.f90
- Main program (preprocessor input file). Used to generate the
+ Main program (preprocessor input file). Used to create a
compilable fortran file pscf.f90 in the build directory.
Utility Modules:
-=======
-const_mod.f
- Defines global variable dim (= # dimensions of space) and
+----------------
+
+const_mod.f90
+ Defines global variable dim (= # dimensions of space) and
parameter long (=real kind for double precision). Used by
all other modules.
-io_mod.f
+io_mod.f90
Defines generic interfaces for parameter input and output.
-field_io_mod.f
- Routines to input and output fields, as lists of coefficients
+field_io_mod.f90
+ Routines to input and output fields, as lists of coefficients
of symmetry-adapted basis functions.
-string_mod.f
+string_mod.f90
Utilities to convert integers to strings. Used in io formats.
-version_mod
- Defines a version_type derived type, with major and minor
+version_mod.f90
+ Defines a version_type derived type, with major and minor
integer version numbers, and routines to read and write this.
Version numbers are used to specify file format versions.
FFT grid Modules:
+----------------
-fft3_mod.f
- Fortran 90 wrappers for FFTW Fourier transform functions,
+fft3_mod.f90
+ Fortran 90 wrappers for FFTW Fourier transform functions,
for FFTW version 3 (Either this or fft2_mod.f90 is linked)
-fft2_mod.f
+fft2_mod.f90
Fortran 90 wrappers for FFTW Fourier transform functions,
for FFTW version 2 (Either this or fft3_mod.f90 is linked)
-grid_mod.f
+grid_mod.f90
Defines scf data structures on an FFT grid, and routines
to allocate, deallocate, and manipulate these structures.
- Defines ngrid, rho_grid, omega_grid, and ksq_grid. Also
- contains several functions for manipulating single FFT
+ Defines ngrid, rho_grid, omega_grid, and ksq_grid. Also
+ contains several functions for manipulating single FFT
wavevectors, including norm, G_to_fft and G_to_bz.
Crystallography Modules:
+------------------------
-unit_cell_mod.f
- Creates Bravais and reciprocal basis vectors, using user
- supplied name of crystal system and cell parameters. Defines
- data structures specifying cell parameters, Bravais and
- reciprocal lattice basis vectors, and some related quantities.
+unit_cell_mod.f90
+ Creates Bravais and reciprocal basis vectors, using user
+ supplied name of crystal system and cell parameters. Defines
+ data structures specifying cell parameters, Bravais and
+ reciprocal lattice basis vectors, and some related quantities.
-group_mod.f
- Defines derived types and operations for space group
+group_mod.f90
+ Defines derived types and operations for space group
symmetries and space groups
-space_groups_mod.f
- Routine space_groups creates space group specified by user
- by name or number, using look-up table of all 230 3D space
- groups, 17 2D plane groups, and 2 1D groups.
+space_groups_mod.f90
+ Routine space_groups creates space group specified by user
+ by name or number, using look-up table of all 230 3D space
+ groups, 17 2D plane groups, and 2 1D groups.
-basis_mod.f
+basis_mod.f90
Module to construct basis functions for periodic crystal.
- Defines data structures describing reciprocal wavevectors and
- stars. Contains routines to generate reciprocal wavevectors,
+ Defines data structures describing reciprocal wavevectors and
+ stars. Contains routines to generate reciprocal wavevectors,
to group them into stars of wavevectors related by symmetry,
and to calculate coefficients of plane waves in symmetry
- adapted basis functions. A discussion of the data structures
+ adapted basis functions. A discussion of the data structures
and conventions used in basis_mod is given within a long
- comment within basis_mod, which is reproduced in the
- developer/api documentation for the module.
+ comment within basis_mod, which is reproduced in the
+ developer/api documentation for the module.
-grid_basis_mod.f
+grid_basis_mod.f90
Contains routines to convert between representations of a
field as a 1D array of coefficients of symmetry-adpated
basis functions and as a set of values defined at points
- on a regular grid.
+ on a regular grid.
-Self-Consistent Field Modules:
+Self-consistent field modules:
+------------------------------
-chemistry_mod.f
- Defines data structures required to specify chemistry of an
+chemistry_mod.f90
+ Defines data structures required to specify chemistry of an
incompressible polymer blend (chi, Kuhn lengths, block lengths,
- molecular volume fractions etc.), and routines to input and
- output this data.
+ molecular volume fractions etc.), and routines to input and
+ output this data.
-chain_mod.f
+chain_mod.f90
Defines a derived type chain_type that contains the
- q(r,s) =qf and q^{+}(r,s) =qr functions for a chain, and
- information about discretization in r and s. Also defines
- arrays of chain_types and subroutines to allocate and
- destroy these arrays.
+ q(r,s) =qf and q^{+}(r,s) =qr functions for a chain, and
+ information about discretization in r and s. Also defines
+ arrays of chain_types and subroutines to allocate and
+ destroy these arrays.
-step_mod.f
+step_mod.f90
Contains routines to solve diffusion equation by the
- pseudo-spectral method, and to calculate monomer
+ pseudo-spectral method, and to calculate monomer
concentration fields, the free and energy, and stress.
Note: scf/scf_mod.fp.f90 is a preprocessor input file, which
is used to generate file scf_mod.f90 in the build directory.
-
-scf_mod.fp.f
+scf_mod.fp.f90
Contains routines to solve diffusion equation by the
- pseudo-spectral method, and to calculate monomer
+ pseudo-spectral method, and to calculate monomer
concentration fields, the free and energy, and stress.
- Note: scf_mod.fp.f is a preprocessor input file, which
- is used to generate file scf_mod.f in the build directory.
+ Note: scf_mod.fp.f90 is a preprocessor input file, which
+ is used to generate file scf_mod.f90 in the build directory.
-scf/chain_mod.f90
+chain_mod.f90
Defines a derived type chain_type that contains the
- q(r,s) =qf and q^{+}(r,s) =qr functions for a chain, and
- information about discretization in r and s. Also defines
- arrays of chain_types and subroutines to allocate and
- destroy these arrays.
+ q(r,s) =qf and q^{+}(r,s) =qr functions for a chain, and
+ information about discretization in r and s. Also defines
+ arrays of chain_types and subroutines to allocate and
+ destroy these arrays.
Iteration Modules:
+------------------
-iterate_mod.fp.f
- Iterates scf equations to convergence. Currently contains
- Newton-Raphson (NR) algorithm for both fixed and variable
- unit cells. Note: File iterate_mod.fp.f90 is a preprocessor
- input file, which is used to generate file iterate_mod.f90
- in the build directory.
+iterate_mod.fp.f90
+ Iterates scf equations to convergence.
+ Note: iterate_mod.fp.f90 is a preprocessor input file, which
+ is used to generate file iterate_mod.f90 in the build directory.
-sweep_mod
- Used to conduct a "sweep" along a path through the space
+sweep_mod.f90
+ Used to conduct a "sweep" along a path through the space
of SCF input parameters (i.e., chi, block_lengths, etc).
- Implements 1st and 2nd order continuation of solutions
+ Implements 1st and 2nd order continuation of solutions
along such a path.
-respond_pd_mod.f
+respond_pd_mod.f90
Calculate response of periodic structures in form needed to
construct approximate Jacobian for quasi-Newton method in
- iterate_mod.f
+ iterate_mod.f90
Linear Response Modules:
+------------------------
-response_mod.f
+response_mod.f90
Module for calculating SCF linear response of period structure
-response_step_mod.f
- Routines to integrate inhomogeneous PDE required in the ideal
+response_step_mod.f90
+ Routines to integrate inhomogeneous PDE required in the ideal
gas perturbation theory
-extrapolate_mod.f
- Implements extrapolation with respect to contour length step
- size ds.
+extrapolate_mod.f90
+ Implements extrapolation with respect to contour length step
+ size ds.
+
+========================================================================
+Preprocessor Usage
----------------------------------------------------------------------
-! Preprocessor Usage !
----------------------------------------------------------------------
+ Several fortran files are generated by applying a python
+ preprocessor script named FORPEDO to corresponding preprocessor
+ input files. This script is included as part of the pscf package
+ in a subdirectory of the tools/python directory.
- Several fortran files are generated by applying a python
- preprocessor script named FORPEDO to corresponding preprocessor
- input files. This script is included as part of the pscf package
- in a subdirectory of the tools/python directory.
-
The relevant preprocesor input files are:
- src/pscf.fp.f90
- src/iterate_mod.fp.f90
- src/scf_mod.fp.f90
+ src/pscf.fp.f90
+ src/iterate_mod.fp.f90
+ src/scf_mod.fp.f90
These are fortran files that contain preprocessor directives that
- control conditional compilation of some sections of code. The
- FORPEDO preprocessor is used here in manner similar to the use
- of the standard C preprocessor to control conditional compilation
- in C and C++ programs. Preprocessing each of these files generates
- a Fortran file with the same name as the preprocessor input file
- without the .fp. string. The resulting fortran files are thus named:
-
- build/scf.f90
- build/iterate_mod.f90
- build/scf_mod.f90
-
- These preprocessed fortran files installed in the build directory
- from which make is invoked, rather than in the src/ directory. If
- pscf is built using the simple makefile that is provided in the
- pscf/make directory, then these files are installed in the
- pscf/make directory. If pscf is built out-of-source using cmake,
- by invoking cmake and make from a build directory outside the
- pscf/ directory tree, then these fortran files will be installed
- in that build directory tree.
-
- An external script is used for preprocessing because Fortran
- (unlike C) does not provide a standard preprocessor. The use of
- a preprocessor makes it easier for developers to maintain code
- that contains experimental features that are not yet ready to be
- released as part of a stable version, without maintaining separate
- development and release version. Sections of code containing
- features that are not ready for prime time are surrounded by
+ control conditional compilation of some sections of code. The
+ FORPEDO preprocessor is used here in manner similar to the use
+ of the standard C preprocessor to control conditional compilation
+ in C and C++ programs. Preprocessing each of these files generates
+ a Fortran file with the same name as the preprocessor input file
+ without the ".fp." string. The resulting fortran files are thus
+ named:
+
+ build/scf.f90
+ build/iterate_mod.f90
+ build/scf_mod.f90
+
+ These preprocessed fortran files installed in the build directory
+ from which make is invoked, rather than in the src/ directory. If
+ pscf is built using the simple makefile that is provided in the
+ pscf/make directory, then the build directory is the directory
+ pscf/make. If pscf is built out-of-source using cmake, by invoking
+ cmake and make from a build directory outside the pscf/ directory
+ tree, then these fortran files will be installed in that build
+ directory tree.
+
+ An external script is used for preprocessing because Fortran
+ (unlike C) does not provide a standard preprocessor. The use of
+ a preprocessor makes it easier for developers to maintain code
+ that contains experimental features that are not yet ready to be
+ released as part of a stable version, without maintaining separate
+ development and release version. Sections of code containing
+ features that are not ready for prime time are surrounded by
conditional compilation directives and are excluded from release
- versions of the corresponding fortran files.
+ versions of the corresponding fortran files.
- If the *.fp.f90 preprocessor files are modified, and the program
- is then recompiled using either cmake or the make file in the
- pscf/make directory, then the *.f90 fortran files will be regenerated
- regenerated as part of the build process. When compiled with make
- in the src/make directory, the src/make/*.f90 fortran files are also
+ If the *.fp.f90 preprocessor files are modified, and the program
+ is then recompiled using either cmake or the make file in the
+ pscf/make directory, then the *.f90 fortran files will be automatically
+ regenerated as part of the build process. When compiled with make in
+ the make directory, the generated make/*.f90 fortran files are also
removed by the 'make clean' command.