grib_api: clone.f90

- Main Page
- Modules
- Files
- Related Pages
- Examples

# clone.f90

How to clone a message.

    00001 ! Copyright 2005-2016 ECMWF
    00002 ! This software is licensed under the terms of the Apache Licence Version 2.0
    00003 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
    00004 !
    00005 ! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
    00006 ! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
    00007 !
    00008 !
    00009 !  Description: how to create a new GRIB message by cloning
    00010 !               an existing message.
    00011 !
    00012 !
    00013 !  Author: Anne Fouilloux
    00014 !
    00015 !
    00016 program clone
    00017   use grib_api
    00018   implicit none
    00019   integer                                       :: err,i,iret
    00020   integer                                       :: nx, ny
    00021   integer                                       :: infile,outfile
    00022   integer                                       :: igrib_in
    00023   integer                                       :: igrib_out
    00024   character(len=2)                              :: step
    00025   double precision, dimension(:,:), allocatable :: field2D
    00026
    00027
    00028   call grib_open_file(infile,'../../data/constant_field.grib1','r')
    00029   call grib_open_file(outfile,'out.grib1','w')
    00030
    00031   !     a new grib message is loaded from file
    00032   !     igrib is the grib id to be used in subsequent calls
    00033   call grib_new_from_file(infile,igrib_in)
    00034
    00035   call grib_get(igrib_in,"numberOfPointsAlongAParallel", nx)
    00036
    00037   call grib_get(igrib_in,"numberOfPointsAlongAMeridian",ny)
    00038
    00039   allocate(field2D(nx,ny),stat=err)
    00040
    00041   if (err .ne. 0) then
    00042      print*, 'Failed to allocate ', nx*ny, ' values'
    00043      STOP
    00044   end if
    00045   ! clone the constant field to create 4 new GRIB messages
    00046   do i=0,18,6
    00047     call grib_clone(igrib_in, igrib_out)
    00048     write(step,'(i2)') i
    00049 ! Careful: stepRange is a string (could be 0-6, 12-24, etc.)
    00050 ! use adjustl to remove blank from the left.
    00051     call grib_set(igrib_out,'stepRange',adjustl(step))
    00052
    00053     call generate_field(field2D)
    00054
    00055 ! use pack to create 1D values
    00056     call grib_set(igrib_out,'values',pack(field2D, mask=.true.))
    00057
    00058   !     write cloned messages to a file
    00059     call grib_write(igrib_out,outfile)
    00060     call grib_release(igrib_out)
    00061   end do
    00062
    00063   call grib_release(igrib_in)
    00064
    00065   call grib_close_file(infile)
    00066
    00067   call grib_close_file(outfile)
    00068   deallocate(field2D)
    00069
    00070 contains
    00071 !======================================
    00072 subroutine generate_field(gfield2D)
    00073  double precision, dimension(:,:) :: gfield2D
    00074
    00075  call random_number(gfield2D)
    00076 end subroutine generate_field
    00077 !======================================
    00078
    00079 end program clone