c-lamp_rewrite.f90
changeset 0 c8ca04c3a9d6
     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