450 likes | 584 Views
Configuring ROMS for South of Java. Kate Hedstrom, ARSC/UAF October, 2007. Requirements. Input files Grid Initial conditions Boundary conditions Forcing Code changes JAVA_1 cpp flag ocean_java.in makefile. Define Grid Coordinate System.
E N D
Configuring ROMS for South of Java Kate Hedstrom, ARSC/UAF October, 2007
Requirements • Input files • Grid • Initial conditions • Boundary conditions • Forcing • Code changes • JAVA_1 cpp flag • ocean_java.in • makefile
Define Grid Coordinate System • Provide a coastline file and point to it with XCOASTDATA • Run xcoast • Set the map projection
Land Mask • The bathymetry finder will optionally set the land mask based on sea level • The land mask might not be quite how you want it, so run editmask • Interactive matlab tool needing a matlab coastline file too
Bathymetric Steepness • Ratio of |h1-h2| / (h1+h2)
Initial and Boundary Files • Matlab scripts to create them from the North Pacific run • Requires matlab-netcdf interface • Requires rnt toolbox from Emanuelle di Lorenzo • Tell rnt_gridinfo about both grids - location of the files, vertical grid information
North Pacific at 18 km • Run with CCSM CORE forcing and POP boundary conditions • CORE files from 1958 through 2004 • NPAC was run through 1976 so far • Pick a file from 1976 to use as initial conditions 100 days before the end • Enrique saved four-day averages
Forcing Files • ROMS can now internally interpolate from coarse forcing files to the ROMS grid • Liz Dobbins prepared the CORE (Large and Yeager) forcing files in a format that ROMS can use • This saves a lot of time, effort, and disk space
ROMS Code • Outline of the code • cpp • cppdefs.h • Modules • ocean.in • Note: understanding gnu make is important, but not covered in this talk
ls roms Atmosphere/ Lib/ User/ Build/ makefile Waves/ Compilers/ Master/ Data/ ROMS/ I also have an Apps directory here for my applications.
ls ROMS Adjoint/ License_ROMS.txt Bin/ Modules/ SeaIce/ Drivers/ Nonlinear/ Tangent/ External/ Obsolete/ Utility/ Functionals/ Programs/ Version Include/ Representer/
Most Important • Drivers • Various model main programs • Nonlinear • The regular ocean physics (forward model) • Modules • Ocean model data types, with allocation and initialization routines • Utility • File reading and writing routines and other files common to the various models
Support • Include • Include files, including cppdefs.h • Bin • Perl and shell scripts • Compilers • System-dependent parts of the makefile • Lib • ARPACK and MCT libraries (optional) • External • ASCII input files
Other • Data Assimilation • Adjoint • Representer • Tangent • SeaIce • Functionals • Analytic expressions for initial conditions, etc. • Obsolete • Programs
cpp • The C preprocessor, cpp, comes with some C compilers, or the functionality can be built into a C compiler • Very simple macro processor • Used in ROMS primarily for conditional compilation • We probably won’t switch to coco when it becomes widely available
cpp Versions • People started using the C preprocessor before there was a C standard - the Standard cpp isn’t quite the version we want • Gnu “cpp -traditional” does the right thing for Fortran
File Inclusion • In Fortran, you can include files with: include ‘file.h’ • In cpp, the equivalent is: #include “file.h” • We use the cpp version to make sure the #defines in the include files are seen
Macro Substitution • A macro definition has the form: #define text replacement text • This is done in ROMS: #define WESTERN_EDGE Istr.eq.1 • and used in: if (WESTERN_EDGE) then …. • Safe as long as the replacement text is not much longer than the original
More on Macros • Another type of macro substitution is like statement functions in Fortran • Statement functions and the more modern inlined functions are better because the compiler can do type checking
Logical Macros • A third kind of macro is something like: #define MASKING • or #define MASKING 1 • These can be tested like: #ifdef MASKING (first case) #if MASKING (second case) • We use the first style for historical reasons, gnu has officially gone to the second
Conditional Compilation • ROMS uses conditional code everywhere. #ifdef ICE ! Stuff having to do with sea ice #endif • If you want to find out about (say) sediment code, do a search on SEDIMENT
More on Conditionals • When setting up a problem of your own, it’s best to surround code you add with a unique cpp flag: #define LOMBOK_STRAIT : #ifdef LOMBOK_STRAIT ! My code #endif
Still More • The #define for our case is now happening in the makefile, passed in with a -DMY_CASE flag • The name of our case is used in the search for an include file, -DROMS_HEADER=my_case.h
Even More • The ROMS Makefile will take our .F files and run them through cpp for us before passing them to the compiler • The intermediate files have a .f90 extension • The compiler errors will refer to line numbers in the .f90 file, not the original source file • Fix the .F file, but feel free to look at the .f90 files to see what happened
cppdefs.h • Every ROMS source file starts with: #include “cppdefs.h” • This file has been changed to contain #if defined ROMS_HEADER # include ROMS_HEADER #endif • The ROMS_HEADER variable comes from the makefile
Modules • The model variables are stored in Fortran 90 modules defining specific types • You no longer have to modify mod_param.F for your domain
Input file • ROMS has an ascii input file which it reads during initialization • The file is not a namelist, but similar in intent • It specifies things like: • Number of timesteps • Number of gridpoints (Lm, Mm, N) • Parallel grid partitioning • Other input filenames, output options • Many others
Code Changes • makefile - ROMS_APPLICATION := JAVA_1 • Create User/Include/java_1.h file with cpp options • Specify grid dimensions in ocean_java.in • User/Functionals/ana_hmixcoef.h - add sponge layer with #ifdef JAVA_1
ocean_java.in • ASCII input file for ROMS • Tells number of gridpoints • Provide the paths to the grid, forcing, etc. files • Specify the timestep and timestep ratio, viscosity values, etc. • Which fields do you want to output and how often?
makefile • Check the name of the compiler • Set Debug/MPI/OpenMP/Large as needed • Set name of application: JAVA_1 • Provide number of grids (usually 1) • Check “uname -s” on your computer • Check location of netcdf library and set it in the Compilers/system-compiler.mk fragment • Type “make”
Run it! • Create a working directory with: • oceanS • External/ • ocean_java.in • varinfo.dat • Run the thing: ./oceanS < External/ocean_java.in
It should spit out a lot of text • You can redirect this with: ./oceanS < External/ocean.in > ocean.out • If successful, you will also obtain some other output files in NetCDF format
Get bold and try it in parallel! • Change the makefile (MPI or OpenMP) • The executable will be called OceanM or OceanO • If using MPI, run it with the input file as an argument, not standard in: ./oceanM External/ocean_java.in