MODULE arps_netio_metadata 5 !----------------------------------------------------------------------- ! ! Define meta types ! !----------------------------------------------------------------------- TYPE :: VARMETA ! Structure to hold CF variable attributes CHARACTER(80) :: standard_name CHARACTER(80) :: long_name CHARACTER(40) :: units CHARACTER(1) :: stagger END TYPE VARMETA TYPE :: ARPSVARS ! All of ARPS variables are defined here TYPE(VARMETA) :: Time TYPE(VARMETA) :: x_stag, y_stag, z_stag, zp, zpsoil ! grdout = 1 TYPE(VARMETA) :: ubar, vbar, wbar, ptbar, pbar, qvbar ! grdbas = 1 TYPE(VARMETA) :: soiltyp, stypfrct,vegtyp,lai,roufns,veg ! landout= 1 TYPE(VARMETA) :: u, v, w, pt, p ! totout = 1, varout = 1 TYPE(VARMETA) :: uprt, vprt, wprt, ptprt, pprt ! totout = 0, varout = 1 TYPE(VARMETA) :: qvprt,qv, qc, qr ! mstout = 1 TYPE(VARMETA) :: qi, qs, qh ! iceout = 1 TYPE(VARMETA) :: prcrate1, prcrate2, prcrate3, prcrate4 ! prcout = 1 TYPE(VARMETA) :: raing, rainc TYPE(VARMETA) :: tke ! tkeout = 1 TYPE(VARMETA) :: kmh, kmv ! trbout = 1 TYPE(VARMETA) :: tsoil, qsoil, wetcanp, snowdpth ! sfcout = 1 TYPE(VARMETA) :: radfrc, radsw, rnflx, radswnet, radlwin ! radflg = 1 TYPE(VARMETA) :: usflx, vsflx, ptsflx, qvsflx ! flxflg = 1 END TYPE ARPSVARS TYPE TRNVARS TYPE(VARMETA) :: hterrain END TYPE TRNVARS TYPE SFCVARS TYPE(VARMETA) :: soiltyp TYPE(VARMETA) :: stypfrct TYPE(VARMETA) :: vegtyp TYPE(VARMETA) :: lai TYPE(VARMETA) :: roufns TYPE(VARMETA) :: veg TYPE(VARMETA) :: ndvi END TYPE SFCVARS TYPE SOILVARS TYPE(VARMETA) :: zpsoil TYPE(VARMETA) :: tsoil TYPE(VARMETA) :: qsoil TYPE(VARMETA) :: wetcanp TYPE(VARMETA) :: snowdpth TYPE(VARMETA) :: soiltyp END TYPE SOILVARS TYPE BDYVARS TYPE(VARMETA) :: ctime TYPE(VARMETA) :: u, v, w, pt, p TYPE(VARMETA) :: qv, qc, qr, qi, qs, qh END TYPE BDYVARS !----------------------------------------------------------------------- ! ! Define meta variables ! !----------------------------------------------------------------------- TYPE (ARPSVARS) :: arpsmeta TYPE (TRNVARS) :: trnmeta TYPE (SFCVARS) :: sfcmeta TYPE (SOILVARS) :: soilmeta TYPE (BDYVARS) :: bdymeta CONTAINS SUBROUTINE init_varmeta 1 !####################################################################### ! ! Assign values to all defined variables ! ! Note: It should NOT be called outside of this module. ! !####################################################################### ! IMPLICIT NONE !---------------------------------------------------------------------- ! ! ARPS history variables ! !---------------------------------------------------------------------- arpsmeta%x_stag = VARMETA('projection_x_coordinate', & 'X coordinate','m','X') arpsmeta%y_stag = VARMETA('projection_y_coordinate', & 'Y coordinate','m','Y') arpsmeta%z_stag = VARMETA('height', & 'Z coordinate','m','Z') arpsmeta%zp = VARMETA('geopotential_height', & 'Physical height coordinate (MSL)','m','Z') arpsmeta%zpsoil = VARMETA('geopotential_height', & 'Physical height coordinate (soil), meters above msl','m',' ') arpsmeta%ubar = VARMETA('base_x_wind', & 'Base state u-velocity','m s-1','X') !! arpsmeta%vbar = VARMETA('base_y_wind', & 'Base state v-velocity','m s-1','Y') !! arpsmeta%wbar = VARMETA('base_upward_air_velocity', & 'Base state w-velocity','m s-1','Z') !! arpsmeta%ptbar = VARMETA('base_air_potential_temperature', & 'Base state potential temperature','K', ' ') !! arpsmeta%pbar = VARMETA('base_air_pressure', & 'Base state pressure','Pa', ' ') !! arpsmeta%qvbar = VARMETA('base_specific_humidity', & 'Base state water vapor specific humidity','1',' ') !! arpsmeta%soiltyp = VARMETA('soil_category', & 'Soil type', 'index',' ') !! arpsmeta%stypfrct = VARMETA('soil_fraction', & 'Soil type fractional coverage','1',' ') !! arpsmeta%vegtyp = VARMETA('vegetation_category', & 'Vegetation type','index',' ') !! arpsmeta%lai = VARMETA('leaf_area_index', & 'Leaf Area Index', '1',' ') arpsmeta%roufns = VARMETA('surface_roughness_length', & 'Surface roughness','m',' ') arpsmeta%veg = VARMETA('vegetation_area_fraction', & 'Vegetation fraction','1',' ') arpsmeta%Time = VARMETA('time','Data valid time','s',' ') arpsmeta%uprt = VARMETA('perturbation_x_wind', & 'Perturbation u-velocity','m s-1','X') !! arpsmeta%vprt = VARMETA('perturbation_y_wind', & 'Perturbation u-velocity','m s-1','Y') !! arpsmeta%wprt = VARMETA('perturbation_upward_air_velocity', & 'Perturbation w-velocity','m s-1','Z') !! arpsmeta%ptprt = VARMETA('perturbation_air_potential_temperature', & 'Perturbation potential temperature','K',' ') !! arpsmeta%pprt = VARMETA('perturbation_air_pressure', & 'Perturbation pressure','Pa',' ') !! arpsmeta%qvprt = VARMETA('perturbation_specific_humidity', & 'Perturbation water vapor specific humidity','1',' ') !! arpsmeta%u = VARMETA('x_wind', & 'U-velocity','m s-1','X') arpsmeta%v = VARMETA('y_wind', & 'V-velocity','m s-1','Y') arpsmeta%w = VARMETA('upward_air_velocity', & 'W-velocity','m s-1','Z') arpsmeta%pt = VARMETA('air_potential_temperature', & 'Potential temperature','K',' ') arpsmeta%p = VARMETA('air_pressure', & 'Pressure','Pa',' ') arpsmeta%qv = VARMETA('specific_humidity', & 'Water vapor specific humidity','1',' ') arpsmeta%qc = VARMETA('mass_fraction_of_cloud_liquid_water_in_air', & 'Cloud water mixing ratio','1',' ') arpsmeta%qr = VARMETA('mass_fraction_of_rain_water_in_air', & 'Rain water mixing ratio','1',' ') !! arpsmeta%qi = VARMETA('mass_fraction_of_cloud_ice_in_air', & 'Cloud ice mixing ratio','1',' ') arpsmeta%qs = VARMETA('mass_fraction_of_cloud_snow_water_in_air', & 'Snow mixing ratio','1',' ') !! arpsmeta%qh = VARMETA('mass_fraction_of_cloud_graupel_water_in_air',& 'Hail mixing ratio','1',' ') !! arpsmeta%prcrate1 = VARMETA('lwe_large_scale_precipitation_rate', & 'Grid scale precipitation rate','m s-1',' ') arpsmeta%prcrate2 = VARMETA('lwe_convective_precipitation_rate', & 'Cumulus precipitation rate','m s-1',' ') arpsmeta%prcrate3 = VARMETA('lwe_microphysics_precipitation_rate', & 'Microphysics precipitation rate','m s-1',' ') !! arpsmeta%prcrate4 = VARMETA('lwe_precipitation_rate', & 'Total precipitation rate','m s-1',' ') arpsmeta%raing = VARMETA('thickness_of_large_scale_rainfall_amount',& 'Grid supersaturation rain','mm',' ') ! arpsmeta%rainc = VARMETA('thickness_of_convective_rainfall_amount', & 'Cumulus convective rain','mm',' ') ! arpsmeta%tke = VARMETA('turbulent_kinetic_energy', & 'Turbulent Kinetic Energy','m2 s-2',' ') !! arpsmeta%kmh = VARMETA('turbulent_mixing_coefficient_for_horizontal_momentum', & 'Hori. turb. mixing coef. for momentum','m2 s-1',' ') !! arpsmeta%kmv = VARMETA('turbulent_mixing_coefficient_for_vertical_momentum', & 'Vert. turb. mixing coef. for momentum','m2 s-1',' ') !! arpsmeta%tsoil = VARMETA('soil_temperature', & 'Soil temperature','K',' ') arpsmeta%qsoil = VARMETA('soil_moisture_content', & 'Soil moisture','kg m-2',' ') arpsmeta%wetcanp = VARMETA('canopy_water_amount', & 'Canopy water amount','kg m-2',' ') arpsmeta%snowdpth= VARMETA('surface_snow_thickness', & 'Snow depth','m',' ') arpsmeta%radfrc = VARMETA('radiation_forcing', & 'Radiation forcing','K/s',' ') !! arpsmeta%radsw = VARMETA('surface_downwelling_shortwave_flux_in_air', & 'Solar radiation reaching the surface','W m-2',' ') arpsmeta%rnflx = VARMETA('surface_net_downward_longwave_flux', & 'Net radiation flux absorbed by surface','W m-2',' ') ! arpsmeta%radswnet = VARMETA('surface_net_downward_shortwave_flux', & 'Net solar radiation','W m-2',' ') ! arpsmeta%radlwin = VARMETA('surface_downwelling_longwave_flux_in_air',& 'Incoming longwave radiation','W m-2',' ') ! arpsmeta%usflx = VARMETA('surface_u_momentum_flux', & 'Surface flux of u-momentum','kg m-1 s-2',' ') !! arpsmeta%vsflx = VARMETA('surface_v_momentum_flux', & 'Surface flux of v-momentum','kg m-1 s-2',' ') !! arpsmeta%ptsflx = VARMETA('surface_downward_sensible_heat_flux', & 'Surface heat flux','K kg m-1 s-2',' ') ! arpsmeta%qvsflx = VARMETA('surface_downward_water_flux', & 'Surface moisture flux','kg m-2 s-1',' ') ! !---------------------------------------------------------------------- ! ! ARPS terrain variables ! !---------------------------------------------------------------------- trnmeta%hterrain = VARMETA('geopotential_height', & 'Terrain height','m',' ') ! !---------------------------------------------------------------------- ! ! ARPS surface variables ! !---------------------------------------------------------------------- sfcmeta%soiltyp = arpsmeta%soiltyp sfcmeta%stypfrct = arpsmeta%stypfrct sfcmeta%vegtyp = arpsmeta%vegtyp sfcmeta%lai = arpsmeta%lai sfcmeta%roufns = arpsmeta%roufns sfcmeta%veg = arpsmeta%veg sfcmeta%ndvi = VARMETA('ndvi', & 'Normalized differential vegetation index','1',' ') !! !---------------------------------------------------------------------- ! ! ARPS soil variables ! !---------------------------------------------------------------------- soilmeta%zpsoil = arpsmeta%zpsoil soilmeta%tsoil = arpsmeta%tsoil soilmeta%qsoil = arpsmeta%qsoil soilmeta%wetcanp = arpsmeta%wetcanp soilmeta%snowdpth = arpsmeta%snowdpth soilmeta%soiltyp = arpsmeta%soiltyp !---------------------------------------------------------------------- ! ! ARPS lateral boundary variables ! !---------------------------------------------------------------------- bdymeta%ctime = VARMETA('ctime', & 'Data valid time','YYYYMMDD.HHMMSS',' ') !! bdymeta%u = arpsmeta%u bdymeta%v = arpsmeta%v bdymeta%w = arpsmeta%w bdymeta%pt = arpsmeta%pt bdymeta%p = arpsmeta%p bdymeta%qv = arpsmeta%qv bdymeta%qc = arpsmeta%qc bdymeta%qr = arpsmeta%qr bdymeta%qi = arpsmeta%qi bdymeta%qs = arpsmeta%qs bdymeta%qh = arpsmeta%qh RETURN END SUBROUTINE init_varmeta ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE netwrt_general_att ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE netwrt_general_att(ncid,packed,title,nx,ny,dx,dy,mapproj, & 5,7 sclfct,trulat1,trulat2,trulon, & ctrlat,ctrlon,istatus) !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write general global attributes to ARPS data file ! ! Note: It will be called outside of this module. So keep the interface ! unchanged as long as possilbe. ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER, INTENT(IN) :: ncid CHARACTER(LEN=*), INTENT(IN) :: title INTEGER, INTENT(IN) :: packed INTEGER, INTENT(IN) :: nx, ny ! global domain size REAL, INTENT(IN) :: dx, dy INTEGER, INTENT(IN) :: mapproj REAL, INTENT(IN) :: sclfct REAL, INTENT(IN) :: trulat1, trulat2, trulon REAL, INTENT(IN) :: ctrlat, ctrlon INTEGER, INTENT(OUT) :: istatus !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- CHARACTER(LEN=80) :: tmpstr, history CHARACTER(LEN=10) :: datestr, timestr, zonestr CHARACTER(LEN=17), PARAMETER :: fmtstr = '005.10 NetCDF 3.0' INTEGER :: lenstr INTEGER :: iproj_orig REAL :: scale_orig REAL :: latnot_orig(2),trlon_orig REAL :: x0_orig,y0_orig REAL :: trulats(2) REAL :: xctr, yctr, x0,y0 REAL :: xno, yno, offeast, offnorth INCLUDE 'netcdf.inc' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Begining of executable code .... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ CALL init_varmeta !----------------------------------------------------------------------- ! ! Define global attributes ! !----------------------------------------------------------------------- istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'Conventions',9,'ARPS/ADAS') ! For Lead IDV visualization lenstr = LEN_TRIM(title) istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'Title',lenstr,title) CALL DATE_AND_TIME(datestr,timestr,zonestr) WRITE(tmpstr,'(13a)') datestr(1:4),'-',datestr(5:6),'-', & datestr(7:8),'_',timestr(1:2),':', & timestr(3:4),':',timestr(5:10),' ', & zonestr(1:3) WRITE(history,'(2a)') 'Created from ARPS NetCDF API at ', TRIM(tmpstr) lenstr = LEN_TRIM(history) istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'History',lenstr,history) lenstr = LEN_TRIM(fmtstr) istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'FMTVER',lenstr,fmtstr) istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'PACKED',NF_INT,1,packed) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'DX',NF_FLOAT,1,dx) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'DY',NF_FLOAT,1,dy) ! ! Map projection ! SELECT CASE (mapproj) CASE (0) WRITE(tmpstr,'(a)') 'no_mapping' CASE (1,-1) WRITE(tmpstr,'(a)') 'polar_stereographic' CASE (2,-2) WRITE(tmpstr,'(a)') 'lambert_conformal_conic' CASE (3,-3) WRITE(tmpstr,'(a)') 'mercator' CASE (4) WRITE(tmpstr,'(a)') 'lat_lon_projection' CASE (5) WRITE(tmpstr,'(a)') 'flat_earth_projection' CASE DEFAULT WRITE(tmpstr,'(a)') 'unknown_map_projection' END SELECT lenstr = LEN_TRIM(tmpstr) istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'grid_mapping_name',lenstr,tmpstr) istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'MAPPROJ', NF_INT, 1,mapproj) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'SCLFCT', NF_FLOAT,1,sclfct) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT1', NF_FLOAT,1,trulat1) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT2', NF_FLOAT,1,trulat2) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'TRUELON', NF_FLOAT,1,trulon) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'CTRLAT', NF_FLOAT,1,ctrlat) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'CTRLON', NF_FLOAT,1,ctrlon) !------------------------------------------------------------------- ! ! Used only by IDV ! !------------------------------------------------------------------- ! ! save original map projection ! CALL getmapr(iproj_orig,scale_orig,latnot_orig, & trlon_orig,x0_orig,y0_orig) ! ! set ARPS map projection ! trulats(1) = trulat1 trulats(2) = trulat2 CALL setmapr(mapproj,sclfct,trulats,trulon) CALL lltoxy(1,1,ctrlat,ctrlon,xctr,yctr) x0 = xctr - 0.5*(nx-3)*dx y0 = yctr - 0.5*(ny-3)*dy CALL lltoxy(1,1,trulat1,trulon,xno,yno) offeast = xno - x0 ! false easting offnorth = yno - y0 ! false northing ! ! Restore orginal map projection ! CALL setmapr(iproj_orig,scale_orig,latnot_orig,trlon_orig) CALL setorig(1,x0_orig,y0_orig) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'latitude_of_projection_origin', & NF_FLOAT,1,trulat1) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'longitude_of_central_meridian', & NF_FLOAT,1,trulon) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'standard_parallel', & NF_FLOAT,2,trulats) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'false_easting', & NF_FLOAT,1,offeast) istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'false_northing', & NF_FLOAT,1,offnorth) RETURN END SUBROUTINE netwrt_general_att ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE net_define_var_meta ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE net_define_var_meta(ncid,varid,vartype,vmeta) 83 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write ARPS variable meta data (NetCDF variable attributes) ! ! Note: It will be called outside of this module. So keep the interface ! unchanged as long as possilbe. ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER, INTENT(IN) :: ncid INTEGER, INTENT(IN) :: varid CHARACTER(LEN=*), INTENT(IN) :: vartype TYPE(VARMETA), INTENT(IN) :: vmeta !----------------------------------------------------------------------- ! ! Include file ! !----------------------------------------------------------------------- INCLUDE 'netcdf.inc' !----------------------------------------------------------------------- ! ! Local variables ! !----------------------------------------------------------------------- INTEGER :: lenstr, istatus !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code ... ... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ lenstr = LEN_TRIM(vmeta%standard_name) istatus = NF_PUT_ATT_TEXT(ncid,varid,'standard_name',lenstr,vmeta%standard_name) lenstr = LEN_TRIM(vmeta%long_name) istatus = NF_PUT_ATT_TEXT(ncid,varid,'long_name',lenstr,vmeta%long_name) lenstr = LEN_TRIM(vmeta%units) istatus = NF_PUT_ATT_TEXT(ncid,varid,'units',lenstr,vmeta%units) istatus = NF_PUT_ATT_TEXT(ncid,varid,'stagger',1,vmeta%stagger) IF ( TRIM(vartype) == 'INT' ) THEN istatus = NF_PUT_ATT_INT (ncid,varid,'_FillValue',NF_INT,1,0) END IF ! IF ( TRIM(vartype) == 'INT' ) THEN ! istatus = NF_PUT_ATT_INT (ncid,varid,'scale_factor',NF_INT,1,1) ! istatus = NF_PUT_ATT_INT (ncid,varid,'add_offset',NF_INT,1,0) ! ELSE ! istatus = NF_PUT_ATT_REAL (ncid,varid,'scale_factor',NF_INT,1,1.0) ! istatus = NF_PUT_ATT_REAL (ncid,varid,'add_offset',NF_INT,1,0.0) ! END IF RETURN END SUBROUTINE net_define_var_meta END MODULE arps_netio_metadata