File: C:\NOAA\NEMS_11731\src\chem\gocart\src\GMAO_Shared\MAPL_cfio\examples\benchmark_sdf.F90

1     !
2     !   Since code for benchmarking CFIO compared to FORTRAN and C flat binaries;
3     !   see benchmark_bin.F90 and benchmark_fwrite.c.
4     !
5     
6     #include "benchmark.h"
7     
8         program test
9     
10         use ESMF_CFIOMOD
11     
12     !   define ESMF_CFIO,  ESMF_CFIOVarInfo, and ESMF_CFIOGrid objects
13     
14         integer, parameter :: im=IM_, jm=JM_, km=KM_, tm=TM_
15     
16         type(ESMF_CFIO) :: cfio
17         type(ESMF_CFIOVarInfo), pointer :: vars(:)
18         type(ESMF_CFIOGrid), pointer :: grid
19     
20         character(len=20) :: fileName
21         integer :: i, fmode, rc
22         integer :: date, curTime, timeInc, t
23         integer :: hhmmss(tm) = (/0, 30000,  60000,  90000, 120000, &
24                                    150000, 180000, 210000 /)
25         logical :: twoD
26     
27         integer :: im1, jm1, km1
28      
29         logical :: passed = .true.
30     
31     !   variables and coordinates
32     
33         real :: ps(im,jm), ts(im,jm), tmpu(im,jm,km) 
34         real :: u(im,jm,km), v(im,jm,km), q(im,jm,km) 
35         real :: lon(im), lat(jm), lev(km)
36         real :: dlat, dlon, sig, dsig
37     
38         fmode = 0
39     
40     !   Define Coordinate variables
41     
42         dlat = 180./(jm-1)
43         dlon = 360./im
44         dsig = 1. / (km-1)
45         do i =1, im
46           lon(i) = -180 + (i-1)*dlon
47         end do
48         do j =1, jm
49           lat(j) = -90 + (j-1)*dlat
50         end do
51         do k = 1, km
52            sig = (k-1) * dsig
53            lev(k) = 0.01 + sig * (1000.-0.01)
54         end do
55     
56     ! Create grid and set grid attributes
57     
58         allocate(grid)
59         grid = ESMF_CFIOGridCreate(gName='test3d')
60         call ESMF_CFIOGridSet(grid,im=im,jm=jm,km=km,lon=lon,lat=lat,lev=lev,levUnit='hPa')
61         call ESMF_CFIOGridSet(grid, standardName='atmosphere_pressure_coordinate')
62         call ESMF_CFIOGridSet(grid, coordinate = 'pressure')
63     
64     !   read back im, jm, km
65         call ESMF_CFIOGridGet(grid, im=im1, jm=jm1, km=km1)
66     
67     ! Create variable object and set variable attributes
68         allocate(vars(6))
69     
70         vars(1) = ESMF_CFIOVarInfoCreate(vName='ps')
71         call ESMF_CFIOVarInfoSet(vars(1), vName='ps', vTitle='surface pressure', grid=grid)
72         call ESMF_CFIOVarInfoSet(vars(1), amiss=1.E15, scaleFactor=1., addOffSet=0.)
73         call ESMF_CFIOVarInfoSet(vars(1), standardName='ps', twoDimVar=.true.)
74         call ESMF_CFIOVarInfoSet(vars(1),  vUnits='K')
75                                                                                        
76         vars(2) = ESMF_CFIOVarInfoCreate(vName='ts')
77         call ESMF_CFIOVarInfoSet(vars(2),vName='ts',vTitle='skin temperature', grid=grid)
78         call ESMF_CFIOVarInfoSet(vars(2), standardName='tskin', twoDimVar=.true.)
79         call ESMF_CFIOVarInfoSet(vars(2),  vUnits='K')
80                                                                                        
81         vars(3) = ESMF_CFIOVarInfoCreate(vName='tmpu')
82         call ESMF_CFIOVarInfoSet(vars(3), vName='tmpu', vTitle='temperature', grid=grid)
83         call ESMF_CFIOVarInfoSet(vars(3), amiss=1.E15, scaleFactor=1., addOffSet=0.)
84         call ESMF_CFIOVarInfoSet(vars(3), standardName='tmpu')
85         call ESMF_CFIOVarInfoSet(vars(3),  vUnits='K')
86     
87         vars(4) = ESMF_CFIOVarInfoCreate(vName='u')
88         call ESMF_CFIOVarInfoSet(vars(4), vName='u', vTitle='zonal wind', grid=grid)
89         call ESMF_CFIOVarInfoSet(vars(4), amiss=1.E15, scaleFactor=1., addOffSet=0.)
90         call ESMF_CFIOVarInfoSet(vars(4), standardName='uwnd')
91         call ESMF_CFIOVarInfoSet(vars(4),  vUnits='m/s')
92     
93         vars(5) = ESMF_CFIOVarInfoCreate(vName='v')
94         call ESMF_CFIOVarInfoSet(vars(5), vName='v', vTitle='V wind', grid=grid)
95         call ESMF_CFIOVarInfoSet(vars(5), amiss=1.E15, scaleFactor=1., addOffSet=0.)
96         call ESMF_CFIOVarInfoSet(vars(5), standardName='vwnd')
97         call ESMF_CFIOVarInfoSet(vars(5),  vUnits='m/s')
98     
99         vars(6) = ESMF_CFIOVarInfoCreate(vName='q')
100         call ESMF_CFIOVarInfoSet(vars(6), vName='q', vTitle='humidity', grid=grid)
101         call ESMF_CFIOVarInfoSet(vars(6), amiss=1.E15, scaleFactor=1., addOffSet=0.)
102         call ESMF_CFIOVarInfoSet(vars(6), standardName='sphu')
103         call ESMF_CFIOVarInfoSet(vars(6),  vUnits='g/km')
104     
105     ! Create CFIO object and set global attributes
106     
107         cfio =  ESMF_CFIOCreate(cfioObjName='ana')
108         call ESMF_CFIOSet(cfio, fName='benchmark_out.hdf', varObjs=vars, &
109                        grid=grid, date=20011201, BegTime=0, timeInc=30000)
110         call ESMF_CFIOSet(cfio, title="c403_cer_01: FVGCM Diagnostics",  &
111                        source="Global Modeling and Assimilation Office", &
112                        contact="data@gmao.gsfc.nasa.gov")
113         call ESMF_CFIOSet(cfio, history='File written by CFIO v1.0.0', &
114                convention='ESMF', institution="Global Modeling and Assimilation Office,&
115            &     NASA Goddard Space Flight Center, Greenbelt, MD 20771") 
116         call ESMF_CFIOSet(cfio, references='see ESMF', comment='First CFIO test version',prec=0) 
117     
118     ! All metadata are set. Get some metadata to see what in the CFIO Obj.
119     
120         call ESMF_CFIOGet ( cfio, nVars=nVars, date=date, begTime=curTime, &
121                             timeInc=timeInc, fName=fileName)
122     
123     ! Create output file
124         call ESMF_CFIOFileCreate(cfio)
125     
126     ! put some test data into the variables
127     
128          ps = 1000.
129          ts = 273.
130          tmpu = 300.
131          u = 10.
132          v = 5.
133          q = 20.
134     
135     ! Write data to the output file
136     
137         do t = 1, tm
138     
139         call ESMF_CFIOVarWrite(cfio, 'ps', ps, date, hhmmss(t), rc=rc)
140         if ( rc .ne. 0 ) passed = .false.
141         call ESMF_CFIOVarWrite(cfio, 'ts', ts, date, hhmmss(t), rc=rc)
142         if ( rc .ne. 0 ) passed = .false.
143         call ESMF_CFIOVarWrite(cfio, 'tmpu', tmpu, date, hhmmss(t), rc=rc)
144         if ( rc .ne. 0 ) passed = .false.
145         call ESMF_CFIOVarWrite(cfio, 'u', u, date, hhmmss(t), rc=rc)
146         if ( rc .ne. 0 ) passed = .false.
147         call ESMF_CFIOVarWrite(cfio, 'v', v, date, hhmmss(t), rc=rc)
148         if ( rc .ne. 0 ) passed = .false.
149         call ESMF_CFIOVarWrite(cfio, 'q', q, date, hhmmss(t), rc=rc)
150         if ( rc .ne. 0 ) passed = .false.
151     
152       end do
153     
154     ! Close the file
155         call ESMF_CFIOFileClose(cfio)
156     
157         if ( passed ) then
158            print *, "benchmark_sdf: Passed"
159         else
160            print *, "benchmark_sdf: NOT Passed"
161         end if
162     
163         stop
164     
165        end 
166