/i3rc-monte-carlo-model

Automatically exported from code.google.com/p/i3rc-monte-carlo-model

Primary LanguageFortranOtherNOASSERTION

Quick start guide to the I3RC Community Monte Carlo Radiative Transfer Model
$Revision$, $Date$
$URL$

This directory contains the I3RC community Monte Carlo model for solving 
problems in solar radiative transfer in three-dimensionally variable 
atmospheres. 

*** Changes since the last release (Bramley, July 2006) 
*) Released under the terms of the GNU public license. NASA has a 
separate license with similar rights. 
*) Support for surface bidirectional reflectance functions via module 
SurfaceProperties and changes to monteCarloRadiativeTransfer. An example 
module that computes Lambertian reflectance is included. 
*) Optional use of message passing via MPI in a parallel-capable  
monteCarloDriver program.
*) New variance reduction methods (see namelists for monteCarloDriver). 
*) Revised plane-parallel solver - now shares most namelists with generic 
solver, and can save problem domain to a file. 
*) Templates/ subdirectory had been removed. 

*** Credit where credit is due

If you use this code in your research or teaching please sign up at the I3RC web site 
(http://i3rc.gsfc.nasa.gov/I3RC_community_model.htm). We won't use your personal information in 
any way - we use the numbers to argue for support from agencies and to notify users about new releases 
of the code. 

If you publish results obtained with this code, please refer to it as the I3RC 
Community Monte Carlo model and reference the I3RC overview paper by Bob 
Cahalan (http://dx.doi.org://10.1175/BAMS-86-9-1275) and the paper by 
Robert Pincus and Frank Evans (http://dx.doi.org/10.1175/2009JAS3137.1). 

*** Quick start: An example

Before you can solve a radiative transfer problem you have to define the 
(three-dimensionally varying) properties of the atmosphere. These are often 
specified in terms of the concentration and sizes of cloud and aerosol problems, 
for which the optical properties must first be computed. That is, one must 
*) compute the single scattering properties of cloud and/or aerosol particles, 
probably as a function of particle size, at appropriate wavelength, then
*) describe the three-dimensional distribution of particles within the domain, then
*) compute the radiative transfer. 

We've provided programs that correspond to each step: 
*) Tools/MakeMieTable creates a table of single scattering properties at a given 
wavelength for a size distribution of spheres as a function of size
*) Tools/PhysicalPropertieToDomain reads several kinds of formatted ASCII files
describing concentration, drop sizes or numbers, etc., combines them with the
phaseFunctionTables, and produces a file describing the domain
  (Tools/OpticalPropertiesToDomain can be used if the optical properties, rather 
than the physical properties, are available). 
*) Example-Drivers/monteCarloDriver reads the domain, computes the radiative
transfer, and writes out the results. 

If what you need are fluxes or intensities at the domain boundaries or heating 
rates within the domain, you can almost certainly use our programs to solve 
your problem and won't need to program anything yourself. 

In the language of the Programmer's Guide, the three steps correspond to the 
creation of three objects: 
*) a phaseFunctionTable (from module scatteringPhaseFunctions), 
*) a domain (from module opticalProperties), and 
*) an integrator (from module monteCarloRadiativeTransfer) which processes a set
of photons (from module monteCarloIllumination).
Problems can also be solved by creating phaseFunctionTables and domains using
calls from Fortran code, saving them using the write functions included in the
modules, then using our driver programs to compute the radiative transfer.

*** What's in the package

The subdirectories contain the code framework for the I3RC community Monte Carlo
radiative transfer model (Code/); a forward Monte Carlo radiative transfer solver
(Integrators/); tools to build tables of phase functions using Mie theory and to
convert ASCII files to the binary versions used by the code framework (Tools/);
and two general purpose drivers that use the code to solve radiative transfer
problems (Example-Drivers). Programs to set up the three I3RC "Phase 1" cases
(I3RC-Examples/) are included as programming examples.

The example radiative transfer solver computes fluxes at the top and bottom of
the domain and absorption through the domain (in units of flux per volume). It
will also compute intensity if supplied with a set of directions, though this is
of course much slower. See the example programs and their example namelists for
information on how to specify the problem you want to solve, and the User's
Guide for more detailed information.

*** Building the code 

This code relies on the netCDF libraries, which are available at
http://www.unidata.ucar.edu/software/netcdf/. These must be built before
compiling the I3RC code. In my experience, it's easiest to build the Fortran
interface to netCDF using the same compiler with which you'll build the I3RC
code. You can build the I3RC code without netCDF if you remove or replace all
the read_ and write_ subroutines from the modules in the Code/ directory. If you
simply remove the subroutines you won't be be able to store information for
later use, so I don't recommend this if you can possibly avoid it.

This code conforms to the ANSI Fortran 95 standard but it really stresses
compilers, and many fail while building the code. Some will simply dump core,
often while compiling the file scatteringPhaseFunctions.f95 in the Code/
subdirectory. If this happens be sure you have the most up-to-date version of
the compiler available. Some compilers (those from Portland Group, and at least
some versions of the Sun Forte compilers) simply don't work on this code. Most
of the development work has been done on Power PC Macs running xlf 8.1 on system
10.3 and 10.4, and on Intel Linux boxes running the Intel Fortran compiler
(versions 8 - 11. 
 
The code builds under the g95 compiler, which is available for a wide range of
systems (Windows, Solaris, HP-UX, Mac) from http://g95.org/. Unfortunately, as
of this writing the g95 compiler produces code that runs very slowly (4-6 times
more slowly than other compilers) because it spends a lot of time managing
temporary memory. This will hopefully improve in future.
 
Compilation options, including the compiler name and compilation flags, are set
in the Makefile in the top level directory.This is also where the location of
the (required) netcdf files is set, as well as the (optional) location of the
MPI message-passing libraries and include files.  This information is used by
the Makefiles in each subdirectory. We've provided production and debugging
settings for a range of compilers (Intel ifort, g65, Mac Absoft, IBM xlf, and
the mpif90 Fortran 90 wrapper). If you're using a new platform add the compiler
and flag definitions following these examples. I'd appreciate copies of working
configurations for other platforms.

In the examples we have provided most of the parameters are specified using
namelists. The name of the namelist file must be supplied at run time. Many Unix
systems support reading arguments from the command line; on platforms that don't
the file name is read from standard in. You can choose which behavior you want
by commenting out the approriate subroutines in Code/userInterface_Unix.f95
before compiling.

Edit the Makefile in the root directory to reflect your compiler choices and
type "./Build" in the top level directory. This will build everything in all the
subdirectories in the proper order. Note that the directories must be built in
order (Code/, Integrators/, Example-Drivers/; Tools/ must be built after Code/)
because the dependencies are set in the directories themselves.

The subdirectory Tools/ contains general purpose programs to build "domain"
files that describe the 3D distribution of optical properties within a domain.
Typically one would first build one or more phase function tables describing the
single scattering properties of clouds, aerols, etc. using MakeMieTable. We've
provided example namelists for clouds and aerosol, though you may want to tweak
these. Program PhysicalPropertiesToDomain reads an ASCII description of the 3D
liquid water content field, combines it with a phase function table, and creates
the final domain. Alternatively, you can use the program
OpticalPropertiesToDomain to convert files similar to those used by SHDOM to the
internal format. ASCII file formats are described in the example programs. The
domain files can then used as input to the program
Example-Drivers/monteCarloDriver. 

The programs in I3RC-Examples/ will build files describing the I3RC Phase 1 test
cases using the files provided by the I3RC (available in I3RC-Examples/Data).

This code makes extensive use of dynamic memory. If program seems to crash 
without explanation be sure the shell is not imposing limits on the amount 
of memory each process can request (i.e. "unlimit stacksize" when using tcsh). 

Please see the I3RC Community Model Programmer's Guide for more information. 

Best - 

Robert Pincus, University of Colorado/NOAA Earth System Research Lab
Robert.Pincus@colorado.edu