1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/c-lamp_rewrite.f90 Sun Sep 21 21:59:01 2008 -0400
1.3 @@ -0,0 +1,229 @@
1.4 + program clamp_rewrite
1.5 +
1.6 +! Program to use CMOR routines to rewrite model results from the simulations
1.7 +! for the Carbon-Land Model Intercomparison Project (C-LAMP).
1.8 +!
1.9 +! Forrest M. Hoffman <forrest@climatemodeling.org>
1.10 +! Created: Fri Jun 8 11:50:01 EDT 2007
1.11 +
1.12 +
1.13 + use cmor_users_functions
1.14 + use netcdf
1.15 + use kind_mod
1.16 + use clm_mod, only: namelen, varnamelen, coord, var_data, &
1.17 + clm_read_coord, clm_copy_grid_data, clm_read_data, clm_convert_data, &
1.18 + clm_free_data
1.19 + implicit none
1.20 +
1.21 + integer, parameter :: maxf = 2500
1.22 + integer, parameter :: maxv = 200
1.23 + integer :: i, numf, numv
1.24 +
1.25 + integer, allocatable :: iaxis(:) ! CMOR handle for axes (time, [hour,] [z-level,] latitude, longitude)
1.26 + integer :: ivar ! CMOR handle for variable
1.27 + integer :: ierr ! error flag
1.28 + integer :: axis_num ! axis counter
1.29 + integer :: realization ! model run realization
1.30 + character (len=128) :: input_path ! input path
1.31 + character (len=128) :: fnames(maxf) = '' ! input file names
1.32 + integer :: tshift(maxf) = 0 ! time shift for files
1.33 + character (len=128) :: output_path ! output path
1.34 + character (len=128) :: input_table ! CMOR table path
1.35 + character (len=32) :: vnames(maxv) = '' ! input variable names
1.36 + character (len=256) :: source = '' ! source global attribute
1.37 + character (len=128) :: experiment = '' ! experiment_id global attribute
1.38 + logical :: casa_flux_bug ! scale fluxes due to bug in CASA'
1.39 +
1.40 + real(r4) :: imissing = 1.0e+36 ! missing-data flag on input
1.41 + real(r4) :: omissing = 1.0e+36 ! missing-data flag on output
1.42 +
1.43 + casa_flux_bug = .false.
1.44 +
1.45 + namelist /inparm/ input_table, output_path, experiment, source, &
1.46 + realization, input_path, fnames, tshift, vnames, casa_flux_bug
1.47 +
1.48 + open(10, file='namelist', status='old')
1.49 + ierr = 1
1.50 + do while(ierr /= 0)
1.51 + read(10, inparm, iostat=ierr)
1.52 + if (ierr < 0) then
1.53 + stop 'End of file on namelist read'
1.54 + end if
1.55 + end do
1.56 + close(10)
1.57 +
1.58 + ! Count number of input data files
1.59 + numf = 0
1.60 + do i = 1, maxf
1.61 + if (trim(fnames(i)) /= '') numf = numf + 1
1.62 + end do
1.63 + ! Count number of variables
1.64 + numv = 0
1.65 + do i = 1, maxv
1.66 + if (trim(vnames(i)) /= '') numv = numv + 1
1.67 + end do
1.68 +
1.69 + print *, 'Reading input files for coordinates and counts...'
1.70 + call clm_read_coord(numf, input_path, fnames, .true.)
1.71 +
1.72 + do i = 1, numv
1.73 + select case (vnames(i))
1.74 + ! gca
1.75 + case ('area')
1.76 + call clm_copy_grid_data(vnames(i))
1.77 + ! lbm
1.78 + case ('landmask')
1.79 + call clm_copy_grid_data(vnames(i))
1.80 + ! orog
1.81 + case ('topo')
1.82 + call clm_copy_grid_data(vnames(i))
1.83 + ! sftlf
1.84 + case ('landfrac')
1.85 + call clm_copy_grid_data(vnames(i))
1.86 + case default
1.87 + print *, 'Reading input files for variable ', vnames(i)
1.88 + call clm_read_data(numf, input_path, fnames, tshift, vnames(i))
1.89 +
1.90 + !print *,'var_data%varname = ',var_data%varname
1.91 + !print *,'var_data%ndims = ',var_data%ndims
1.92 + !print *,'var_data%time = ',var_data%time
1.93 + !print *,'var_data%long_name = ',trim(var_data%long_name)
1.94 + !print *,'var_data%missing_value = ',var_data%missing_value
1.95 + !print *,'var_data%units = ',trim(var_data%units)
1.96 + end select
1.97 +
1.98 + print *, 'Performing unit conversion on data...'
1.99 + call clm_convert_data(casa_flux_bug)
1.100 +
1.101 + print *, 'Initializing CMOR...'
1.102 + ierr = cmor_setup(inpath='./',netcdf_file_action='preserve', &
1.103 + set_verbosity=2, exit_control=2)
1.104 +
1.105 + print *, 'Identifying output data sets for CMOR...'
1.106 + ierr = cmor_dataset( &
1.107 + outpath = output_path, &
1.108 + experiment_id = experiment, &
1.109 + institution = 'ORNL (Oak Ridge National Laboratory, Oak Ridge, Tennessee, USA)', &
1.110 + source = trim(source), &
1.111 + realization = realization, &
1.112 + calendar = 'noleap', &
1.113 + history = 'Extracted from case '//trim(coord%case_id), &
1.114 + comment = 'Initial dataset: '//trim(coord%inidat)// &
1.115 + '; surface dataset: '//trim(coord%surdat)//'; pft dataset: '//&
1.116 + trim(coord%pftdat)//'; rtm dataset: '//trim(coord%rtmdat), &
1.117 + references = 'http://www.climatemodeling.org/c-lamp', &
1.118 + contact = 'Forrest M. Hoffman <forrest@climatemodeling.org>')
1.119 +
1.120 + allocate(iaxis(var_data%ndims), stat=ierr)
1.121 + if (ierr /= 0) then
1.122 + print *, 'Cannot allocate iaxis'
1.123 + stop
1.124 + end if
1.125 +
1.126 + print *, 'Defining coordinates for CMOR output data...'
1.127 + axis_num = 1
1.128 +
1.129 + iaxis(axis_num) = cmor_axis( &
1.130 + table = input_table, &
1.131 + table_entry = 'longitude', &
1.132 + units = 'degrees_east', &
1.133 + length = coord%xsize, &
1.134 + coord_vals = coord%x)
1.135 + axis_num = axis_num + 1
1.136 +
1.137 + iaxis(axis_num) = cmor_axis( &
1.138 + table = input_table, &
1.139 + table_entry = 'latitude', &
1.140 + units = 'degrees_north', &
1.141 + length = coord%ysize, &
1.142 + coord_vals = coord%y)
1.143 + axis_num = axis_num + 1
1.144 +
1.145 + if (var_data%soil_layer_flag) then
1.146 + iaxis(axis_num) = cmor_axis( &
1.147 + table = input_table, &
1.148 + table_entry = 'depth_soil', &
1.149 + units = 'm', &
1.150 + length = coord%zsoi_size, &
1.151 + coord_vals = coord%zsoi)
1.152 + axis_num = axis_num + 1
1.153 + end if
1.154 +
1.155 + if (var_data%hour_flag) then
1.156 + iaxis(axis_num) = cmor_axis( &
1.157 + table = input_table, &
1.158 + table_entry = 'hour', &
1.159 + units = 'hours', &
1.160 + length = coord%hr_size, &
1.161 + coord_vals = coord%hr)
1.162 + axis_num = axis_num + 1
1.163 + end if
1.164 +
1.165 + if (var_data%ndims > 2) then
1.166 + iaxis(axis_num) = cmor_axis( &
1.167 + table = input_table, &
1.168 + table_entry = 'time', &
1.169 + units = 'days since 1798-01-01 00:00:00')
1.170 + axis_num = axis_num + 1
1.171 + end if
1.172 +
1.173 + print *, 'Defining CMOR output data variables...'
1.174 + if (var_data%positive == '') then
1.175 + ivar = cmor_variable( &
1.176 + table = input_table, &
1.177 + table_entry = var_data%out_varname, &
1.178 + original_name = var_data%varname, &
1.179 + units = var_data%units, &
1.180 + missing_value = var_data%missing_value, &
1.181 + axis_ids = iaxis)
1.182 + else
1.183 + ivar = cmor_variable( &
1.184 + table = input_table, &
1.185 + table_entry = var_data%out_varname, &
1.186 + original_name = var_data%varname, &
1.187 + units = var_data%units, &
1.188 + positive = var_data%positive, &
1.189 + missing_value = var_data%missing_value, &
1.190 + axis_ids = iaxis)
1.191 + end if
1.192 +
1.193 + print *, 'Writing CMOR output...'
1.194 + select case (var_data%ndims)
1.195 + case (2)
1.196 + if (var_data%int_type) then
1.197 + ierr = cmor_write( &
1.198 + var_id = ivar, &
1.199 + data = var_data%int2d)
1.200 + else
1.201 + ierr = cmor_write( &
1.202 + var_id = ivar, &
1.203 + data = var_data%var2d)
1.204 + end if
1.205 + case (3)
1.206 + ierr = cmor_write( &
1.207 + var_id = ivar, &
1.208 + data = var_data%var3d, &
1.209 + time_vals = var_data%time, &
1.210 + time_bnds = var_data%time_bounds)
1.211 + case (4)
1.212 + ierr = cmor_write( &
1.213 + var_id = ivar, &
1.214 + data = var_data%var4d, &
1.215 + time_vals = var_data%time, &
1.216 + time_bnds = var_data%time_bounds)
1.217 + case default
1.218 + print *, 'Unable to handle data with ', var_data%ndims, 'dimensions'
1.219 + stop
1.220 + end select
1.221 +
1.222 + print *, 'Closing CMOR file(s)...'
1.223 + ierr = cmor_close()
1.224 +
1.225 + deallocate(iaxis)
1.226 +
1.227 + print *, 'Freeing data...'
1.228 + call clm_free_data()
1.229 +
1.230 + end do ! loop over variables
1.231 +
1.232 + end program clamp_rewrite