program ESMF_RegridWeightGenApp
! !USES:
use ESMF
use ESMF_IOScripMod
use ESMF_IOGridspecMod
use ESMF_IOFileTypeCheckMod
use ESMF_RegridWeightGenMod
use ESMF_RegridWeightGenCheckMod
implicit none
#ifndef ESMF_MPIUNI
include "mpif.h"
#endif
integer, parameter :: MAXNAMELEN = 64
integer :: rc
type(ESMF_VM) :: vm
integer :: PetNo, PetCnt
character(ESMF_MAXPATHLEN) :: srcfile, dstfile, wgtfile
character(ESMF_MAXPATHLEN) :: cwd
character(ESMF_MAXPATHLEN) :: tilePath
character(len=40) :: method, flag, lineTypeStr
character(len=MAXNAMELEN) :: srcmeshname, dstmeshname
character(len=MAXNAMELEN) :: extrapMethodStr
character(len=MAXNAMELEN) :: extrapNumSrcPntsStr
integer :: extrap_num_src_pnts
character(len=MAXNAMELEN) :: extrapDistExponentStr
real :: extrap_dist_exponent
integer :: extrapNumLevels
character(len=MAXNAMELEN) :: extrapNumLevelsStr
type(ESMF_LineType_Flag) :: lineType
type(ESMF_PoleMethod_Flag) :: pole
integer :: poleptrs
type(ESMF_FileFormat_Flag) :: srcFileType, dstFileType, srcFileTypeInferred, dstFileTypeInferred
character(len=MAXNAMELEN) :: fileTypeStr, fileTypeInferredStr
type(ESMF_RegridMethod_Flag) :: methodflag
type(ESMF_ExtrapMethod_Flag) :: extrapMethodFlag
character(len=ESMF_MAXPATHLEN) :: commandbuf1(5)
character(len=MAXNAMELEN) :: commandbuf3(9)
integer :: commandbuf2(26)
integer :: ind, pos
logical :: largeFileFlag
logical :: netcdf4FileFlag
logical :: weightOnlyFlag
logical :: ignoreUnmapped, userAreaFlag, ignoreDegenerate
type(ESMF_UnmappedAction_Flag) :: unmappedaction
logical :: srcMissingValue, dstMissingValue
logical :: srcIsRegional, dstIsRegional, typeFlagSet
logical :: useSrcCoordVar, useDstCoordVar
character(len=MAXNAMELEN) :: srcvarname, dstvarname
character(len=MAXNAMELEN) :: srcCoordNames(2), dstCoordNames(2)
character(len=256) :: argStr
logical :: terminateProg
!real(ESMF_KIND_R8) :: starttime, endtime
logical :: checkFlag, moabFlag
logical :: checkFlagFlag
type(ESMF_LogKind_Flag) :: msgbuf(1)
type(ESMF_LogKind_Flag) :: logflag
character(len=ESMF_MAXPATHLEN) :: argvalue
integer :: count, i, length
type(ESMF_NormType_Flag) :: normType
logical :: useSrcCorner, useDstCorner
logical :: useTilePathFlag
integer :: meshdim
logical :: writerhfile, writewgtfile
character(len=ESMF_MAXPATHLEN) :: rhfile
terminateProg = .false.
! Initial checks of whether we can run this program
#ifndef ESMF_NETCDF
write(*,*) "ESMF_NETCDF not defined when lib was compiled; this is required for ESMF_RegridWeightGen"
stop 1
#endif
! Check if --no_log is given, if so, call ESMF_Initialize() with ESMF_LOGKIND_NONE flag
#ifndef ESMF_MPIUNI
call MPI_Init(rc)
if (rc /= MPI_SUCCESS) then
write(*,*) "ERROR: ESMF_RegridWeightGen initialization error."
stop 1
endif
call MPI_Comm_rank(MPI_COMM_WORLD, PetNo, rc)
if (rc /= MPI_SUCCESS) then
write(*,*) "ERROR: ESMF_RegridWeightGen initialization error."
call MPI_Finalize(rc)
stop 1
endif
#else
PetNo = 0
#endif
if (PetNo == 0) then
logflag = ESMF_LOGKIND_MULTI
call ESMF_UtilGetArgIndex ('--no_log', argindex=ind)
if (ind > 0) then
logflag = ESMF_LOGKIND_NONE
end if
msgbuf(1) = logflag
endif
#ifndef ESMF_MPIUNI
! broadcast to all other PETs
call MPI_Bcast(msgbuf, 1, MPI_INTEGER, 0, MPI_COMM_WORLD,rc)
if (PetNo /= 0) logflag = msgbuf(1)
#endif
!------------------------------------------------------------------------
! Initialize ESMF
!
call ESMF_Initialize (defaultCalKind=ESMF_CALKIND_GREGORIAN, &
defaultlogfilename="RegridWeightGen.Log", &
logkindflag=logflag, rc=rc)
if (rc /= ESMF_SUCCESS) call ErrorMsgAndAbort(-1)
!------------------------------------------------------------------------
! get global vm information
!
call ESMF_VMGetGlobal(vm, rc=rc)
if (rc /= ESMF_SUCCESS) call ErrorMsgAndAbort(-1)
! set up local pet info
call ESMF_VMGet(vm, localPet=PetNo, petCount=PetCnt, rc=rc)
if (rc /= ESMF_SUCCESS) call ErrorMsgAndAbort(PetNo)
!------------------------------------------------------------------------
! Parse keyword based arguments at Pet 0
! then broadcast the results to the rest of the Pets
!
if (PetNo == 0) then
call ESMF_UtilGetArgIndex('-h', argindex=ind)
if (ind == -1) call ESMF_UtilGetArgIndex('--help', argindex=ind)
if (ind /= -1) then
call PrintUsage()
terminateProg=.true.
endif
call ESMF_UtilGetArgIndex('--version', argindex=ind)
if (ind /= -1) then
call ESMF_UtilVersionPrint (versionFlag=.true.)
terminateProg=.true.
endif
call ESMF_UtilGetArgIndex('-V', argindex=ind)
if (ind /= -1) then
call ESMF_UtilVersionPrint (vFlag=.true.)
terminateProg=.true.
endif
if (terminateProg) goto 1110
call ESMF_UtilGetArgIndex('-s', argindex=ind)
if (ind == -1) call ESMF_UtilGetArgIndex('--source', argindex=ind, rc=rc)
if (ind == -1) then
write(*,*)
print *, "ERROR: The required argument [-s|--source] is missing."
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
else
call ESMF_UtilGetArg(ind+1, argvalue=srcfile)
endif
call ESMF_UtilGetArgIndex('-d', argindex=ind, rc=rc)
if (ind == -1) call ESMF_UtilGetArgIndex('--destination', argindex=ind, rc=rc)
if (ind == -1) then
write(*,*)
print *, "ERROR: The required argument [-d|-destination] is missing."
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
else
call ESMF_UtilGetArg(ind+1, argvalue=dstfile)
endif
writewgtfile = .false.
call ESMF_UtilGetArgIndex('-w', argindex=ind, rc=rc)
if (ind == -1) call ESMF_UtilGetArgIndex('--weight', argindex=ind, rc=rc)
if (ind == -1) then
wgtfile = " "
else
writewgtfile = .true.
call ESMF_UtilGetArg(ind+1, argvalue=wgtfile)
endif
writerhfile = .false.
call ESMF_UtilGetArgIndex('--routehandle', argindex=ind, rc=rc)
if (ind == -1) then
rhfile = " "
else
writerhfile = .true.
call ESMF_UtilGetArg(ind+1, argvalue=rhfile)
endif
#if 0
if (.not. writewgtfile .and. .not. writerhfile) then
write(*,*)
print *, "ERROR: Either a weight file (-w|--weight) or a routehandle file (--routehandle) must be specified."
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
#else
if (.not. writewgtfile) then
write(*,*)
print *, "ERROR: A weight file (-w|--weight) must be specified."
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
#endif
call ESMF_UtilGetArgIndex('-m', argindex=ind, rc=rc)
if (ind == -1) call ESMF_UtilGetArgIndex('--method', argindex=ind, rc=rc)
if (ind == -1) then
! print *, 'Use default interpolation method: bilinear'
method = 'bilinear'
else
call ESMF_UtilGetArg(ind+1, argvalue=method)
if ((trim(method) .ne. 'bilinear') .and. &
(trim(method) .ne. 'conserve') .and. &
(trim(method) .ne. 'conserve2nd') .and. &
(trim(method) .ne. 'patch') .and. &
(trim(method) .ne. 'nearestdtos') .and. &
(trim(method) .ne. 'neareststod')) then
write(*,*)
print *, 'ERROR: The interpolation method "', trim(method), '" is not supported'
print *, ' The supported methods are "bilinear", "patch", "conserve"'
print *, ' "conserve2nd", "nearestdtos", and "neareststod"'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
! Get Line Type
call ESMF_UtilGetArgIndex('-l', argindex=ind, rc=rc)
if (ind == -1) call ESMF_UtilGetArgIndex('--line_type', argindex=ind, rc=rc)
if (ind == -1) then
! Use default lineType based on method
if ((trim(method) .eq. 'conserve') .or. &
(trim(method) .eq. 'conserve2nd'))then
lineTypeStr = 'greatcircle'
else
lineTypeStr = 'cartesian'
endif
else
call ESMF_UtilGetArg(ind+1, argvalue=lineTypeStr)
if ((trim(lineTypeStr) .ne. 'cartesian') .and. &
(trim(lineTypeStr) .ne. 'greatcircle')) then
write(*,*)
print *, 'ERROR: The line type "', trim(lineTypeStr), '" is not supported'
print *, ' The supported line types are "cartesian", and "greatcircle"'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
! Get extrap method
call ESMF_UtilGetArgIndex('--extrap_method', argindex=ind, rc=rc)
if (ind == -1) then
extrapMethodStr = 'none'
else
call ESMF_UtilGetArg(ind+1, argvalue=extrapMethodStr)
if ((trim(extrapMethodStr) .ne. 'none') .and. &
(trim(extrapMethodStr) .ne. 'nearestidavg') .and. &
(trim(extrapMethodStr) .ne. 'nearestd') .and. &
(trim(extrapMethodStr) .ne. 'creep') .and. &
(trim(extrapMethodStr) .ne. 'creepnrstd') .and. &
(trim(extrapMethodStr) .ne. 'neareststod')) then
write(*,*)
print *, 'ERROR: The extrap. method "', trim(extrapMethodStr), '" is not supported'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
! Get extrap num src points
call ESMF_UtilGetArgIndex('--extrap_num_src_pnts', argindex=ind, rc=rc)
if (ind == -1) then
extrap_num_src_pnts=8
else
call ESMF_UtilGetArg(ind+1, argvalue=extrapNumSrcPntsStr)
read(extrapNumSrcPntsStr,'(i4)') extrap_num_src_pnts
endif
! Get extrap dist exponent
call ESMF_UtilGetArgIndex('--extrap_dist_exponent', argindex=ind, rc=rc)
if (ind == -1) then
extrapDistExponentStr='2.0'
else
call ESMF_UtilGetArg(ind+1, argvalue=extrapDistExponentStr)
endif
! If creep is the extrap method, get the number of levels
extrapNumLevels=-1 ! Init just in case
if ((trim(extrapMethodStr) .eq. 'creep') .or. &
(trim(extrapMethodStr) .eq. 'creepnrstd')) then
! Get number of levels index
call ESMF_UtilGetArgIndex('--extrap_num_levels', argindex=ind, rc=rc)
! Act based on index
if (ind == -1) then
write(*,*)
print *, "ERROR: When extrapmethod creep is specified, then the user must also specify the number of creep levels."
print *, " This can be done using the argument: --extrap_num_levels"
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
else
call ESMF_UtilGetArg(ind+1, argvalue=extrapNumLevelsStr)
read(extrapNumLevelsStr,'(i4)') extrapNumLevels
endif
endif
poleptrs = -1
call ESMF_UtilGetArgIndex('-p', argindex=ind, rc=rc)
if (ind == -1) call ESMF_UtilGetArgIndex('--pole', argindex=ind, rc=rc)
if (ind == -1) then
if ((trim(method) .eq. 'conserve') .or. &
(trim(method) .eq. 'conserve2nd') .or. &
(trim(method) .eq. 'nearestdtos') .or. &
(trim(method) .eq. 'neareststod')) then
! print *, 'Use default pole: None'
pole = ESMF_POLEMETHOD_NONE
poleptrs = 0
else
!print *, 'Use default pole: All'
pole = ESMF_POLEMETHOD_ALLAVG
endif
else
call ESMF_UtilGetArg(ind+1, argvalue=flag)
if (trim(flag) .eq. 'none') then
pole = ESMF_POLEMETHOD_NONE
poleptrs = 0
else if (trim(flag) .eq. 'all') then
pole = ESMF_POLEMETHOD_ALLAVG
else if (trim(flag) .eq. 'teeth') then
pole = ESMF_POLEMETHOD_TEETH
poleptrs = -2
else
read(flag,'(i4)') poleptrs
pole = ESMF_POLEMETHOD_NPNTAVG
endif
if ((method .eq. 'conserve') .and. &
(pole .ne. ESMF_POLEMETHOD_NONE)) then
write(*,*)
print *, 'ERROR: Conserve method only works with no pole.'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
if ((method .eq. 'conserve2nd') .and. &
(pole .ne. ESMF_POLEMETHOD_NONE)) then
write(*,*)
print *, 'ERROR: Conserve2nd method only works with no pole.'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
typeFlagSet = .false.
srcFileType = ESMF_FILEFORMAT_UNKNOWN
dstFileType = ESMF_FILEFORMAT_UNKNOWN
srcIsRegional = .false.
dstIsRegional = .false.
call ESMF_UtilGetArgIndex('-t', argindex=ind, rc=rc)
if (ind /= -1) then
typeFlagSet = .true.
call ESMF_UtilGetArg(ind+1, argvalue=flag)
call ParseFileTypeArg('-t', flag, srcFileType)
dstFileType = srcFileType
end if
call ESMF_UtilGetArgIndex('--src_type', argindex=ind, rc=rc)
if (ind /= -1) then
if (typeFlagSet) then
write(*,*)
print *, 'ERROR: Cannot specify both -t and --src_type'
call ESMF_Finalize(endflag=ESMF_END_ABORT)
end if
call ESMF_UtilGetArg(ind+1, argvalue=flag)
call ParseFileTypeArg('--src_type', flag, srcFileType)
endif
call ESMF_UtilGetArgIndex('--dst_type', argindex=ind, rc=rc)
if (ind /= -1) then
if (typeFlagSet) then
write(*,*)
print *, 'ERROR: Cannot specify both -t and --dst_type'
call ESMF_Finalize(endflag=ESMF_END_ABORT)
end if
call ESMF_UtilGetArg(ind+1, argvalue=flag)
call ParseFileTypeArg('--dst_type', flag, dstFileType)
end if
! Check the srcfile type and dstfile type
!
! Note that we call ESMF_FileTypeCheck even if the file types were explicitly
! specified. This is partly to get the mesh names and partly to be able to print a
! warning if the inferred file type differs from the specified file type.
call ESMF_FileTypeCheck(srcfile, srcFileTypeInferred, varname=srcMeshName, rc=rc)
if (srcFileType == ESMF_FILEFORMAT_UNKNOWN) then
! src file type wasn't explicitly specified, so get it from the inferred type
if (rc/=ESMF_SUCCESS .or. srcFileTypeInferred==ESMF_FILEFORMAT_UNKNOWN) then
write(*,*)
print *, 'ERROR: Unable to detect the source grid file type.'
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
srcFileType = srcFileTypeInferred
else
! src file type was explicitly specified; print a warning if the inferred file
! type differs from the explicitly specified type
if (srcFileTypeInferred /= ESMF_FILEFORMAT_UNKNOWN .and. &
srcFileTypeInferred /= srcFileType) then
fileTypeInferredStr = srcFileTypeInferred
fileTypeStr = srcFileType
write(*,*)
print *, 'WARNING: inferred src file type (', trim(fileTypeInferredStr), ') ', &
'differs from specified src file type (', trim(fileTypeStr), '); ', &
'using specified src file type (', trim(fileTypeStr), ').'
end if
end if
call ESMF_FileTypeCheck(dstfile, dstFileTypeInferred, varname=dstMeshName, rc=rc)
if (dstFileType == ESMF_FILEFORMAT_UNKNOWN) then
! dst file type wasn't explicitly specified, so get it from the inferred type
if (rc/=ESMF_SUCCESS .or. dstFileTypeInferred==ESMF_FILEFORMAT_UNKNOWN) then
write(*,*)
print *, 'ERROR: Unable to detect the destination grid file type.'
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
dstFileType = dstFileTypeInferred
else
! dst file type was explicitly specified; print a warning if the inferred file
! type differs from the explicitly specified type
if (dstFileTypeInferred /= ESMF_FILEFORMAT_UNKNOWN .and. &
dstFileTypeInferred /= dstFileType) then
fileTypeInferredStr = dstFileTypeInferred
fileTypeStr = dstFileType
write(*,*)
print *, 'WARNING: inferred dst file type (', trim(fileTypeInferredStr), ') ', &
'differs from specified dst file type (', trim(fileTypeStr), '); ', &
'using specified dst file type (', trim(fileTypeStr), ').'
end if
end if
! If the src grid type is GRIDSPEC or UGRID, check if --src_missingvalue argument is given
call ESMF_UtilGetArgIndex('--src_missingvalue', argindex=ind, rc=rc)
if (ind == -1) then
srcMissingValue = .false.
else
srcMissingValue = .true.
call ESMF_UtilGetArg(ind+1, argvalue=srcVarName)
endif
! missing area only supported for GRIDSPEC and UGRID file. When the grid
! file is UGRID, it only support the missing value when doing conservative regrid
if (srcMissingValue) then
if (srcFileType /= ESMF_FILEFORMAT_GRIDSPEC .and. &
srcFileType /= ESMF_FILEFORMAT_UGRID) then
write(*,*)
print *, 'ERROR: --src_missingvalue is supported only when the source grid is in'
print *, ' UGRID or GRIDSPEC format.'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
! If the dst grid type is GRIDSPEC or UGRID, check if --dst_missingvalue argument is given
call ESMF_UtilGetArgIndex('--dst_missingvalue', argindex=ind, rc=rc)
if (ind == -1) then
dstMissingValue = .false.
else
dstMissingValue = .true.
call ESMF_UtilGetArg(ind+1, argvalue=dstVarName)
endif
! missing area only supported for GRIDSPEC and UGRID file. When the grid
! file is UGRID, it only support the missing value when doing conservative regrid
if (dstMissingValue) then
if (dstFileType /= ESMF_FILEFORMAT_GRIDSPEC .and. &
dstFileType /= ESMF_FILEFORMAT_UGRID) then
write(*,*)
print *, 'ERROR: --dst_missingvalue is supported only when the source grid is in'
print *, ' UGRID or GRIDSPEC format.'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
ignoreUnmapped=.false.
call ESMF_UtilGetArgIndex('-i', argindex=ind, rc=rc)
if (ind == -1) call ESMF_UtilGetArgIndex('--ignore_unmapped', argindex=ind, rc=rc)
if (ind /= -1) then
ignoreUnmapped=.true.
endif
ignoreDegenerate=.false.
call ESMF_UtilGetArgIndex('--ignore_degenerate', argindex=ind, rc=rc)
if (ind /= -1) then
ignoreDegenerate=.true.
endif
call ESMF_UtilGetArgIndex('-r', argindex=ind, rc=rc)
if (ind /= -1) then
srcIsRegional = .true.
dstIsRegional = .true.
pole = ESMF_POLEMETHOD_NONE
poleptrs = 0
! print *, 'Set pole to None for regional grids.'
endif
call ESMF_UtilGetArgIndex('--src_regional', argindex=ind, rc=rc)
if (ind /= -1) then
srcIsRegional = .true.
pole = ESMF_POLEMETHOD_NONE
poleptrs = 0
! print *, 'Set pole to None for regional source grid.'
endif
call ESMF_UtilGetArgIndex('--dst_regional', argindex=ind, rc=rc)
if (ind /= -1) then
dstIsRegional = .true.
endif
! --64bit_offset for large weight file
call ESMF_UtilGetArgIndex('--64bit_offset', argindex=ind, rc=rc)
if (ind /= -1) then
largeFileFlag = .true.
else
largeFileFlag = .false.
endif
! --netcdf4 for weight file format
call ESMF_UtilGetArgIndex('--netcdf4', argindex=ind, rc=rc)
if (ind /= -1) then
netcdf4FileFlag = .true.
else
netcdf4FileFlag = .false.
endif
if (largeFileFlag .and. netcdf4FileFlag) then
write(*,*)
print *, 'ERROR: Both --netcdf4 and --64bit_offset are specified.'
print *, ' Only one flag can be given.'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
! --weight_only for weight file format
call ESMF_UtilGetArgIndex('--weight_only', argindex=ind, rc=rc)
if (ind /= -1) then
weightOnlyFlag = .true.
else
weightOnlyFlag = .false.
endif
! --user_area - to use user-defined area for the cells
call ESMF_UtilGetArgIndex('--user_areas', argindex=ind, rc=rc)
if (ind /= -1) then
userAreaFlag = .true.
else
userAreaFlag = .false.
endif
! user area only needed for conservative regridding
if (userAreaFlag .and. .not. ((method .eq. 'conserve') .or. &
(method .eq. 'conserve2nd'))) then
write(*,*)
print *, 'WARNING: --user_areas is only needed in conservative remapping'
print *, ' The flag is ignored'
userAreaFlag = .false.
endif
if (userAreaFlag .and. (srcFileType /= ESMF_FILEFORMAT_SCRIP .and. &
srcFileType /= ESMF_FILEFORMAT_ESMFMESH) .and. &
(dstFileType /= ESMF_FILEFORMAT_SCRIP .and. &
dstFileType /= ESMF_FILEFORMAT_ESMFMESH)) then
write(*,*)
print *, 'ERROR: --user_areas is supported only when the source or destination'
print *, ' grid are in SCRIP of ESMF format.'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
! Norm type
normType = ESMF_NORMTYPE_DSTAREA ! Default to DSTAREA
call ESMF_UtilGetArgIndex('--norm_type', argindex=ind, rc=rc)
if (ind /= -1) then
call ESMF_UtilGetArg(ind+1, argvalue=flag)
if (trim(flag) .eq. 'dstarea') then
normType = ESMF_NORMTYPE_DSTAREA
else if (trim(flag) .eq. 'fracarea') then
normType = ESMF_NORMTYPE_FRACAREA
else
write(*,*)
print *, 'ERROR: Unknown --norm_type: must be either dstarea or fracarea'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
! --src_coordinates, --dst_coordinates for GRIDSPEC file if there are multiple
! coordinate variables
useSrcCoordVar = .false.
useDstCoordVar = .false.
if (srcFileType == ESMF_FILEFORMAT_GRIDSPEC) then
call ESMF_UtilGetArgIndex('--src_coordinates', argindex=ind, rc=rc)
if (ind /= -1) then
call ESMF_UtilGetArg(ind+1, argvalue=argStr)
pos = INDEX(argStr, ',')
if (pos == 0) then
write(*,*)
print *, "ERROR: wrong value for --src_coordinates: should be lon and lat "
print *, " variable names separated by comma"
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
srcCoordNames(1)=argStr(1:pos-1)
srcCoordNames(2)=argStr(pos+1:)
pos = INDEX(argStr(pos+1:), ",")
if (pos /= 0) then
write(*,*)
print *, "ERROR: wrong value for --src_coordinates: should be lon and lat "
print *, " variable names separated by comma"
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
useSrcCoordVar = .true.
endif
endif
if (dstFileType == ESMF_FILEFORMAT_GRIDSPEC) then
call ESMF_UtilGetArgIndex('--dst_coordinates', argindex=ind, rc=rc)
if (ind /= -1) then
call ESMF_UtilGetArg(ind+1, argvalue=argStr)
pos = INDEX(argStr, ",")
if (pos == 0) then
write(*,*)
print *, "ERROR: wrong value for --dst_coordinates: should be lon and lat "
print *, " variable names separated by comma"
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
dstCoordNames(1)=argStr(1:pos-1)
dstCoordNames(2)=argStr(pos+1:)
pos = INDEX(argStr(pos+1:), ",")
if (pos /= 0) then
write(*,*)
print *, "ERROR: wrong value for --dst_coordinates: should be lon and lat "
print *, " variable names separated by comma"
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
useDstCoordVar = .true.
endif
endif
useSrcCorner = .false.
useDstCorner = .false.
call ESMF_UtilGetArgIndex('--src_loc', argindex=ind, rc=rc)
! the --src_loc is required if the file format is UGRID or ESMFMESH and
! the regrid method is not conservative (no default value to force user to specify
! the location)
if (ind /= -1) then
call ESMF_UtilGetArg(ind+1, argvalue=argStr)
if (trim(argStr) .eq. 'corner') then
useSrcCorner = .true.
elseif (trim(argStr) .eq. 'center') then
useSrcCorner = .false.
else
write(*,*)
print *, 'ERROR: Unknown --src_loc: must be either center or corner'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
else ! the argument does not exist
if ((srcFileType == ESMF_FILEFORMAT_UGRID .or. srcFileType == ESMF_FILEFORMAT_ESMFMESH) &
.and. (method /= 'conserve') .and. (method /= 'conserve2nd')) then
write(*,*)
print *, 'ERROR: --src_loc is required for this source file type and regridding'
print *, ' method.'
print *, ' Please specifiy either "center" or "corner"'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
! deoes not support corner coordinates for SCRIP and GRIDSPEC files
if ((srcFileType == ESMF_FILEFORMAT_SCRIP .or. srcFileType == ESMF_FILEFORMAT_GRIDSPEC) &
.and. useSrcCorner ) then
write(*,*)
print *, 'ERROR: cannot use corner coordinates to do regridding for SCRIP or'
print *, ' GRIDSPEC files.'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
call ESMF_UtilGetArgIndex('--dst_loc', argindex=ind, rc=rc)
! the --dst_loc is required if the file format is UGRID or ESMFMESH and
! the regrid method is not conservative (no default value to force user to specify
! the location)
if (ind /= -1) then
call ESMF_UtilGetArg(ind+1, argvalue=argStr)
if (trim(argStr) .eq. 'corner') then
useDstCorner = .true.
elseif (trim(argStr) .eq. 'center') then
useDstCorner = .false.
else
write(*,*)
print *, 'ERROR: Unknown --dst_loc: must be either center or corner'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
else ! the argument does not exist
if ((dstFileType == ESMF_FILEFORMAT_UGRID .or. dstFileType == ESMF_FILEFORMAT_ESMFMESH) &
.and. (method /= 'conserve') .and. (method /= 'conserve2nd')) then
write(*,*)
print *, 'ERROR: --dst_loc is required for this source file type and regridding'
print *, ' method.'
print *, ' Please specifiy either "center" or "corner"'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
! does not support corner coordinates for SCRIP and GRIDSPEC files
if ((dstFileType == ESMF_FILEFORMAT_SCRIP .or. dstFileType == ESMF_FILEFORMAT_GRIDSPEC) &
.and. useDstCorner) then
write(*,*)
print *, 'ERROR: cannot use corner coordinates to do regridding for SCRIP or'
print *, ' GRIDSPEC files.'
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
! does not support corner coordinates for conservative regridding for any file types
if ((method == 'conserve' .or. method == 'conserve2nd') .and. &
(useSrcCorner .or. useDstCorner)) then
write(*,*)
print *, 'ERROR: using corner coordinates for conservative regridding is not supported.'
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
! --tilefile_path to specify alternative tile file path
call ESMF_UtilGetArgIndex('--tilefile_path', argindex=ind, rc=rc)
if (ind /= -1) then
call ESMF_UtilGetArg(ind+1, argvalue=tilePath)
length=len_trim(tilePath)
if (tilePath(length:length) /= '/') tilePath(length+1:length+1)='/'
useTilePathFlag = .true.
else
tilePath=' '
useTilePathFlag = .false.
endif
! -- if src or dst grid is a 1D UGRID file, there are many restrictions:
! 1. if it is dst grid, no conservative regridding, if it is src grid,
! only nearest neighbor regridding allowed. 2. only allow regridding on
! the corner, 3. only allow weight_only file.
if (srcFileType == ESMF_FILEFORMAT_UGRID) then
call ESMF_UGridInq(srcfile, nodeCoordDim = meshdim, rc=rc)
if (meshdim == 1) then
if (method /= 'neareststod' .and. method /= 'nearestdtos') then
write(*,*)
print *, 'ERROR: only nearest neighbor regridding is supported for'
print *, '1D source grid in UGRID format.'
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
if (.not. useSrcCorner) then
write(*,*)
print *, 'ERROR: Only allow regridding on the corner for 1D source grid.'
print *, 'Use --src_loc corner to specify it'
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
endif
if (dstFileType == ESMF_FILEFORMAT_UGRID) then
call ESMF_UGridInq(dstfile, nodeCoordDim = meshdim, rc=rc)
if (meshdim == 1) then
if (method == 'conserve' .or. method == 'conserve2nd') then
write(*,*)
print *, 'ERROR: conservative regridding is not supported for 1D destination grid.'
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
if (.not. useDstCorner) then
write(*,*)
print *, 'ERROR: Only allow regridding on the corner for 1D destination grid.'
print *, 'Use --dst_loc corner to specify it'
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
endif
! Pass checkFlag into ESMF_FieldRegridStore()
checkFlagFlag = .false.
call ESMF_UtilGetArgIndex('--checkFlag', argindex=ind, rc=rc)
if (ind /= -1) checkFlagFlag = .true.
checkFlag = .false.
call ESMF_UtilGetArgIndex('--check', argindex=ind, rc=rc)
if (ind /= -1) checkFlag = .true.
moabFlag = .false.
call ESMF_UtilGetArgIndex('--moab', argindex=ind, rc=rc)
if (ind /= -1) moabFlag = .true.
1110 continue
commandbuf2(:)=0
if (terminateProg) then
commandbuf2(1)=-9999
else
commandbuf2(1)=srcFileType%fileformat
commandbuf2(2)=dstFileType%fileformat
if (method .eq. 'patch') commandbuf2(3)=1
if (method .eq. 'conserve') commandbuf2(3)=2
if (method .eq. 'neareststod') commandbuf2(3)=3
if (method .eq. 'nearestdtos') commandbuf2(3)=4
if (method .eq. 'conserve2nd') commandbuf2(3)=5
commandbuf2(4)=poleptrs
if (ignoreUnmapped) commandbuf2(5) = 1
if (userAreaFlag) commandbuf2(6) = 1
if (srcMissingValue) commandbuf2(7) = 1
if (dstMissingValue) commandbuf2(8) = 1
if (srcIsRegional) commandbuf2(9) = 1
if (dstIsRegional) commandbuf2(10) = 1
if (useSrcCoordVar) commandbuf2(11) = 1
if (useDstCoordVar) commandbuf2(12) = 1
if (largeFileFlag) commandbuf2(13) = 1
if (netcdf4FileFlag) commandbuf2(14) = 1
if (checkFlag) commandbuf2(15) = 1
commandbuf2(16) = normType%normtype
if (ignoreDegenerate) commandbuf2(17) = 1
if (useSrcCorner) commandbuf2(18) = 1
if (useDstCorner) commandbuf2(19) = 1
if (trim(lineTypeStr) .eq. 'cartesian') commandbuf2(20) = 1
if (trim(lineTypeStr) .eq. 'greatcircle') commandbuf2(20) = 2
if (weightOnlyFlag) commandbuf2(21) = 1
if (extrapMethodStr .eq. 'none') commandbuf2(22)=1
if (extrapMethodStr .eq. 'neareststod') commandbuf2(22)=2
if (extrapMethodStr .eq. 'nearestidavg') commandbuf2(22)=3
if (extrapMethodStr .eq. 'nearestd') commandbuf2(22)=4
if (extrapMethodStr .eq. 'creep') commandbuf2(22)=5
if (extrapMethodStr .eq. 'creepnrstd') commandbuf2(22)=6
commandbuf2(23)=extrap_num_src_pnts
commandbuf2(24)=extrapNumLevels
if (moabFlag) commandbuf2(25)=1
if (checkFlagFlag) commandbuf2(26) = 1
endif
call ESMF_VMBroadcast(vm, commandbuf2, size (commandbuf2), 0, rc=rc)
if (rc /= ESMF_SUCCESS) call ErrorMsgAndAbort(PetNo)
if (terminateProg) then
goto 1111
endif
! Group the command line arguments and broadcast to other PETs
commandbuf1(1)=srcfile
commandbuf1(2)=dstfile
commandbuf1(3)=wgtfile
commandbuf1(4)=rhfile
commandbuf1(5)=tilePath
commandbuf3(1)=srcMeshName
commandbuf3(2)=dstMeshName
commandbuf3(3)=srcVarName
commandbuf3(4)=dstVarName
commandbuf3(5)=srcCoordNames(1)
commandbuf3(6)=srcCoordNames(2)
commandbuf3(7)=dstCoordNames(1)
commandbuf3(8)=dstCoordNames(2)
commandbuf3(9)=extrapDistExponentStr
! Broadcast the command line arguments to all the PETs
call ESMF_VMBroadcast(vm, commandbuf1, len(commandbuf1)*size(commandbuf1), 0, rc=rc)
call ESMF_VMBroadcast(vm, commandbuf3, len(commandbuf3)*size(commandbuf3), 0, rc=rc)
if (rc /= ESMF_SUCCESS) call ErrorMsgAndAbort(PetNo)
else
call ESMF_VMBroadcast(vm, commandbuf2, size(commandbuf2), 0, rc=rc)
if (rc /= ESMF_SUCCESS) call ErrorMsgAndAbort(PetNo)
if (commandbuf2(1) == -9999) then
goto 1111
endif
srcFileType%fileformat = commandbuf2(1)
dstFileType%fileformat = commandbuf2(2)
if (commandbuf2(3)==0) then
method = 'bilinear'
else if (commandbuf2(3)==1) then
method = 'patch'
else if (commandbuf2(3)==2) then
method = 'conserve'
else if (commandbuf2(3)==3) then
method = 'neareststod'
else if (commandbuf2(3)==4) then
method = 'nearestdtos'
else if (commandbuf2(3)==5) then
method = 'conserve2nd'
else
method = 'bilinear'
endif
poleptrs = commandbuf2(4)
if (poleptrs == -1) then
pole=ESMF_POLEMETHOD_ALLAVG
else if (poleptrs == -2) then
pole=ESMF_POLEMETHOD_TEETH
else if (poleptrs == 0) then
pole=ESMF_POLEMETHOD_NONE
else
pole=ESMF_POLEMETHOD_NPNTAVG
endif
if (commandbuf2(5) == 1) then
ignoreUnmapped=.true.
else
ignoreUnmapped=.false.
endif
if (commandbuf2(6) == 1) then
userAreaFlag=.true.
else
userAreaFlag=.false.
endif
if (commandbuf2(7) == 1) then
srcMissingValue=.true.
else
srcMissingValue=.false.
endif
if (commandbuf2(8) == 1) then
dstMissingValue=.true.
else
dstMissingValue=.false.
endif
if (commandbuf2(9)==1) then
srcIsRegional = .true.
else
srcIsRegional = .false.
endif
if (commandbuf2(10)==1) then
dstIsRegional = .true.
else
dstIsRegional = .false.
endif
if (commandbuf2(11)==1) then
useSrcCoordVar = .true.
else
useSrcCoordVar = .false.
endif
if (commandbuf2(12)==1) then
useDstCoordVar = .true.
else
useDstCoordVar = .false.
endif
if (commandbuf2(13)==1) then
largeFileFlag = .true.
else
largeFileFlag = .false.
endif
if (commandbuf2(14)==1) then
netcdf4FileFlag = .true.
else
netcdf4FileFlag = .false.
endif
if (commandbuf2(15)==1) then
checkFlag = .true.
else
checkFlag = .false.
endif
normType%normtype=commandbuf2(16)
if (commandbuf2(17) == 1) then
ignoreDegenerate=.true.
else
ignoreDegenerate=.false.
endif
if (commandbuf2(18)==1) then
useSrcCorner=.true.
else
useSrcCorner=.false.
endif
if (commandbuf2(19)==1) then
useDstCorner=.true.
else
useDstCorner=.false.
endif
if (commandbuf2(21)==1) then
weightOnlyFlag=.true.
else
weightOnlyFlag=.false.
endif
if (commandbuf2(22)==0) then
extrapMethodStr = 'none'
else if (commandbuf2(22)==1) then
extrapMethodStr = 'none'
else if (commandbuf2(22)==2) then
extrapMethodStr = 'neareststod'
else if (commandbuf2(22)==3) then
extrapMethodStr = 'nearestidavg'
else if (commandbuf2(22)==4) then
extrapMethodStr = 'nearestd'
else if (commandbuf2(22)==5) then
extrapMethodStr = 'creep'
else if (commandbuf2(22)==6) then
extrapMethodStr = 'creepnrstd'
else
method = 'none'
endif
extrap_num_src_pnts=commandbuf2(23)
extrapNumLevels=commandbuf2(24)
! Set moab flag
moabFlag=.false.
if (commandbuf2(25)==1) moabFlag=.true.
! Set checkFlag flag
checkFlagFlag = .false.
if (commandbuf2(26)==1) checkFlagFlag = .true.
call ESMF_VMBroadcast(vm, commandbuf1, len(commandbuf1)*size(commandbuf1), 0, rc=rc)
if (rc /= ESMF_SUCCESS) call ErrorMsgAndAbort(PetNo)
call ESMF_VMBroadcast(vm, commandbuf3, len(commandbuf3)*size(commandbuf3), 0, rc=rc)
if (rc /= ESMF_SUCCESS) call ErrorMsgAndAbort(PetNo)
srcfile = commandbuf1(1)
dstfile = commandbuf1(2)
wgtfile = commandbuf1(3)
if (wgtfile .eq. ' ') then
writewgtfile = .false.
else
writewgtfile = .true.
endif
rhfile = commandbuf1(4)
if (rhfile .eq. ' ') then
writerhfile = .false.
else
writerhfile = .true.
endif
tilePath = commandbuf1(5)
if (tilePath .eq. ' ') then
useTilePathFlag = .false.
else
useTilePathFlag = .true.
endif
srcMeshName = commandbuf3(1)
dstMeshName = commandbuf3(2)
srcVarName = commandbuf3(3)
dstVarName = commandbuf3(4)
srcCoordNames(1) = commandbuf3(5)
srcCoordNames(2) = commandbuf3(6)
dstCoordNames(1) = commandbuf3(7)
dstCoordNames(2) = commandbuf3(8)
extrapDistExponentStr=commandbuf3(9)
endif
if (trim(method) .eq. 'bilinear') then
methodflag = ESMF_REGRIDMETHOD_BILINEAR
else if (trim(method) .eq. 'conserve') then
methodflag = ESMF_REGRIDMETHOD_CONSERVE
else if (trim(method) .eq. 'conserve2nd') then
methodflag = ESMF_REGRIDMETHOD_CONSERVE_2ND
else if (trim(method) .eq. 'patch') then
methodflag = ESMF_REGRIDMETHOD_PATCH
else if (trim(method) .eq. 'neareststod') then
methodflag = ESMF_REGRIDMETHOD_NEAREST_STOD
else if (trim(method) .eq. 'nearestdtos') then
methodflag = ESMF_REGRIDMETHOD_NEAREST_DTOS
endif
if (ignoreunmapped) then
unmappedaction = ESMF_UNMAPPEDACTION_IGNORE
else
unmappedaction = ESMF_UNMAPPEDACTION_ERROR
endif
! Set lineType
if (commandbuf2(20)==1) then
lineType=ESMF_LINETYPE_CART
else if (commandbuf2(20)==2) then
lineType=ESMF_LINETYPE_GREAT_CIRCLE
endif
! Set extrap method
if (trim(extrapMethodStr) .eq. 'none') then
extrapMethodFlag=ESMF_EXTRAPMETHOD_NONE
else if (trim(extrapMethodStr) .eq. 'neareststod') then
extrapMethodFlag=ESMF_EXTRAPMETHOD_NEAREST_STOD
else if (trim(extrapMethodStr) .eq. 'nearestidavg') then
extrapMethodFlag=ESMF_EXTRAPMETHOD_NEAREST_IDAVG
else if (trim(extrapMethodStr) .eq. 'nearestd') then
extrapMethodFlag=ESMF_EXTRAPMETHOD_NEAREST_D
else if (trim(extrapMethodStr) .eq. 'creep') then
extrapMethodFlag=ESMF_EXTRAPMETHOD_CREEP
else if (trim(extrapMethodStr) .eq. 'creepnrstd') then
extrapMethodFlag=ESMF_EXTRAPMETHOD_CREEP_NRST_D
else
extrapMethodFlag=ESMF_EXTRAPMETHOD_NONE
endif
! Set extrap distance exponent
read(extrapDistExponentStr,*) extrap_dist_exponent
#if 0
write(*,*) "extrapmethod=",extrapMethodflag%extrapmethod
write(*,*) "extrap_num_src_pnts=",extrap_num_src_pnts
write(*,*) "extrap_dist_exponent=",extrap_dist_exponent
write(*,*) "extrapNumLevels=",extrapNumLevels
#endif
! Turn on MOAB flag based on moabFlag which has been broadcast across PETs
if (moabFlag) call ESMF_MeshSetMOAB(.true., rc=rc)
if (rc /= ESMF_SUCCESS) call ErrorMsgAndAbort(PetNo)
if (writewgtfile) then
if (writerhfile) then
if (useTilePathFlag) then
call ESMF_RegridWeightGen(srcfile, dstfile, &
weightFile=wgtfile, rhFile=rhfile, &
regridmethod=methodflag, &
polemethod = pole, regridPoleNPnts = poleptrs, unmappedaction = unmappedaction, &
srcFileType = srcFileType, dstFileType = dstFileType, &
ignoreDegenerate = ignoreDegenerate, &
lineType=lineType, &
normType=normType, &
extrapMethod=extrapMethodFlag, &
extrapNumSrcPnts=extrap_num_src_pnts, &
extrapDistExponent=extrap_dist_exponent, &
extrapNumLevels=extrapNumLevels, &
srcRegionalFlag = srcIsRegional, dstRegionalFlag = dstIsRegional, &
srcMeshname = srcMeshname, dstMeshname = dstMeshname, &
srcMissingvalueFlag = srcMissingValue, srcMissingvalueVar = srcVarName, &
dstMissingvalueFlag = dstMissingValue, dstMissingvalueVar = dstVarName, &
useSrcCoordFlag = useSrcCoordVar, useDstCoordFlag = useDstCoordVar, &
srcCoordinateVars = srcCoordNames, dstCoordinateVars = dstCoordNames, &
useUserAreaFlag = userAreaFlag, largefileFlag = largeFileFlag, &
netcdf4FileFlag = netcdf4FileFlag, &
weightOnlyFlag = weightOnlyFlag, &
useSrcCornerFlag = useSrcCorner, &
useDstCornerFlag = useDstCorner, &
tileFilePath = trim(tilePath), &
verboseFlag = .true., &
checkFlag = checkFlagFlag, &
rc = rc)
else
call ESMF_RegridWeightGen(srcfile, dstfile, &
weightFile=wgtfile, rhFile=rhfile, &
regridmethod=methodflag, &
polemethod = pole, regridPoleNPnts = poleptrs, unmappedaction = unmappedaction, &
srcFileType = srcFileType, dstFileType = dstFileType, &
ignoreDegenerate = ignoreDegenerate, &
lineType=lineType, &
normType=normType, &
extrapMethod=extrapMethodFlag, &
extrapNumSrcPnts=extrap_num_src_pnts, &
extrapDistExponent=extrap_dist_exponent, &
extrapNumLevels=extrapNumLevels, &
srcRegionalFlag = srcIsRegional, dstRegionalFlag = dstIsRegional, &
srcMeshname = srcMeshname, dstMeshname = dstMeshname, &
srcMissingvalueFlag = srcMissingValue, srcMissingvalueVar = srcVarName, &
dstMissingvalueFlag = dstMissingValue, dstMissingvalueVar = dstVarName, &
useSrcCoordFlag = useSrcCoordVar, useDstCoordFlag = useDstCoordVar, &
srcCoordinateVars = srcCoordNames, dstCoordinateVars = dstCoordNames, &
useUserAreaFlag = userAreaFlag, largefileFlag = largeFileFlag, &
netcdf4FileFlag = netcdf4FileFlag, &
weightOnlyFlag = weightOnlyFlag, &
useSrcCornerFlag = useSrcCorner, &
useDstCornerFlag = useDstCorner, &
verboseFlag = .true., &
checkFlag = checkFlagFlag, &
rc = rc)
endif
else
if (useTilePathFlag) then
call ESMF_RegridWeightGen(srcfile, dstfile, weightFile=wgtfile, &
regridmethod=methodflag, &
polemethod = pole, regridPoleNPnts = poleptrs, unmappedaction = unmappedaction, &
srcFileType = srcFileType, dstFileType = dstFileType, &
ignoreDegenerate = ignoreDegenerate, &
lineType=lineType, &
normType=normType, &
extrapMethod=extrapMethodFlag, &
extrapNumSrcPnts=extrap_num_src_pnts, &
extrapDistExponent=extrap_dist_exponent, &
extrapNumLevels=extrapNumLevels, &
srcRegionalFlag = srcIsRegional, dstRegionalFlag = dstIsRegional, &
srcMeshname = srcMeshname, dstMeshname = dstMeshname, &
srcMissingvalueFlag = srcMissingValue, srcMissingvalueVar = srcVarName, &
dstMissingvalueFlag = dstMissingValue, dstMissingvalueVar = dstVarName, &
useSrcCoordFlag = useSrcCoordVar, useDstCoordFlag = useDstCoordVar, &
srcCoordinateVars = srcCoordNames, dstCoordinateVars = dstCoordNames, &
useUserAreaFlag = userAreaFlag, largefileFlag = largeFileFlag, &
netcdf4FileFlag = netcdf4FileFlag, &
weightOnlyFlag = weightOnlyFlag, &
useSrcCornerFlag = useSrcCorner, &
useDstCornerFlag = useDstCorner, &
tileFilePath = trim(tilePath), &
verboseFlag = .true., &
checkFlag = checkFlagFlag, &
rc = rc)
else
call ESMF_RegridWeightGen(srcfile, dstfile, weightFile=wgtfile, &
regridmethod=methodflag, &
polemethod = pole, regridPoleNPnts = poleptrs, unmappedaction = unmappedaction, &
srcFileType = srcFileType, dstFileType = dstFileType, &
ignoreDegenerate = ignoreDegenerate, &
lineType=lineType, &
normType=normType, &
extrapMethod=extrapMethodFlag, &
extrapNumSrcPnts=extrap_num_src_pnts, &
extrapDistExponent=extrap_dist_exponent, &
extrapNumLevels=extrapNumLevels, &
srcRegionalFlag = srcIsRegional, dstRegionalFlag = dstIsRegional, &
srcMeshname = srcMeshname, dstMeshname = dstMeshname, &
srcMissingvalueFlag = srcMissingValue, srcMissingvalueVar = srcVarName, &
dstMissingvalueFlag = dstMissingValue, dstMissingvalueVar = dstVarName, &
useSrcCoordFlag = useSrcCoordVar, useDstCoordFlag = useDstCoordVar, &
srcCoordinateVars = srcCoordNames, dstCoordinateVars = dstCoordNames, &
useUserAreaFlag = userAreaFlag, largefileFlag = largeFileFlag, &
netcdf4FileFlag = netcdf4FileFlag, &
weightOnlyFlag = weightOnlyFlag, &
useSrcCornerFlag = useSrcCorner, &
useDstCornerFlag = useDstCorner, &
verboseFlag = .true., &
checkFlag = checkFlagFlag, &
rc = rc)
endif
endif
else
if (writerhfile) then
if (useTilePathFlag) then
call ESMF_RegridWeightGen(srcfile, dstfile, &
rhFile=rhfile, &
regridmethod=methodflag, &
polemethod = pole, regridPoleNPnts = poleptrs, unmappedaction = unmappedaction, &
srcFileType = srcFileType, dstFileType = dstFileType, &
ignoreDegenerate = ignoreDegenerate, &
lineType=lineType, &
normType=normType, &
extrapMethod=extrapMethodFlag, &
extrapNumSrcPnts=extrap_num_src_pnts, &
extrapDistExponent=extrap_dist_exponent, &
extrapNumLevels=extrapNumLevels, &
srcRegionalFlag = srcIsRegional, dstRegionalFlag = dstIsRegional, &
srcMeshname = srcMeshname, dstMeshname = dstMeshname, &
srcMissingvalueFlag = srcMissingValue, srcMissingvalueVar = srcVarName, &
dstMissingvalueFlag = dstMissingValue, dstMissingvalueVar = dstVarName, &
useSrcCoordFlag = useSrcCoordVar, useDstCoordFlag = useDstCoordVar, &
srcCoordinateVars = srcCoordNames, dstCoordinateVars = dstCoordNames, &
useUserAreaFlag = userAreaFlag, largefileFlag = largeFileFlag, &
netcdf4FileFlag = netcdf4FileFlag, &
weightOnlyFlag = weightOnlyFlag, &
useSrcCornerFlag = useSrcCorner, &
useDstCornerFlag = useDstCorner, &
tileFilePath = trim(tilePath), &
verboseFlag = .true., &
checkFlag = checkFlagFlag, &
rc = rc)
else
call ESMF_RegridWeightGen(srcfile, dstfile, &
rhFile=rhfile, &
regridmethod=methodflag, &
polemethod = pole, regridPoleNPnts = poleptrs, unmappedaction = unmappedaction, &
srcFileType = srcFileType, dstFileType = dstFileType, &
ignoreDegenerate = ignoreDegenerate, &
lineType=lineType, &
normType=normType, &
extrapMethod=extrapMethodFlag, &
extrapNumSrcPnts=extrap_num_src_pnts, &
extrapDistExponent=extrap_dist_exponent, &
extrapNumLevels=extrapNumLevels, &
srcRegionalFlag = srcIsRegional, dstRegionalFlag = dstIsRegional, &
srcMeshname = srcMeshname, dstMeshname = dstMeshname, &
srcMissingvalueFlag = srcMissingValue, srcMissingvalueVar = srcVarName, &
dstMissingvalueFlag = dstMissingValue, dstMissingvalueVar = dstVarName, &
useSrcCoordFlag = useSrcCoordVar, useDstCoordFlag = useDstCoordVar, &
srcCoordinateVars = srcCoordNames, dstCoordinateVars = dstCoordNames, &
useUserAreaFlag = userAreaFlag, largefileFlag = largeFileFlag, &
netcdf4FileFlag = netcdf4FileFlag, &
weightOnlyFlag = weightOnlyFlag, &
useSrcCornerFlag = useSrcCorner, &
useDstCornerFlag = useDstCorner, &
verboseFlag = .true., &
checkFlag = checkFlagFlag, &
rc = rc)
endif
else
write(*,*)
print *, "ERROR: Either a weight file (-w) or a routehandle file (-rh) must be specified."
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
endif
if (rc /= ESMF_SUCCESS) call ErrorMsgAndAbort(PetNo)
! Output success
if (PetNo==0) then
write(*,*) "Completed weight generation successfully."
!write(*,*) "Completed weight generation in ", (endtime-starttime)*1000, "msecs"
write(*,*)
endif
! write(*,*) "Start of check routine"
! write(*,*)
! error checking
if (checkFlag) then
call ESMF_RegridWeightGenCheck(wgtfile, rc=rc)
if (rc /= ESMF_SUCCESS) call ErrorMsgAndAbort(PetNo)
endif
1111 continue
call ESMF_Finalize()
contains
subroutine ErrorMsgAndAbort(localPet)
integer :: localPet
if (localPet >= 0) then
write(*,*) "ERROR: Problem on processor ",localPet,". Please see the PET*.RegridWeightGen.Log files for a traceback."
else
write(*,*) "ERROR: Please see the PET*.RegridWeightGen.Log files for a traceback."
endif
call ESMF_Finalize(endflag=ESMF_END_ABORT)
end subroutine ErrorMsgAndAbort
subroutine PrintUsage()
print *, "Usage: ESMF_RegridWeightGen --source|-s src_grid_filename"
print *, " --destination|-d dst_grid_filename"
print *, " --weight|-w out_weight_file "
#if 0
print *, " [--routehandle out_routehandle_file]"
#endif
print *, " [--method|-m bilinear|patch|neareststod|nearestdtos|conserve|conserve2nd]"
print *, " [--pole|-p all|none|teeth|<N>]"
print *, " [--line_type|-l cartesian|greatcircle]"
print *, " [--norm_type dstarea|fracarea]"
print *, " [--extrap_method none|neareststod|nearestidavg|nearestd|creep|creepnrstd]"
print *, " [--extrap_num_src_pnts <N>]"
print *, " [--extrap_dist_exponent <P>]"
print *, " [--extrap_num_levels <L>]"
print *, " [--ignore_unmapped|-i]"
print *, " [--ignore_degenerate]"
print *, " [--src_type SCRIP|ESMFMESH|UGRID|CFGRID|GRIDSPEC|MOSAIC|TILE]"
print *, " [--dst_type SCRIP|ESMFMESH|UGRID|CFGRID|GRIDSPEC|MOSAIC|TILE]"
print *, " [-t SCRIP|ESMFMESH|UGRID|CFGRID|GRIDSPEC|MOSAIC|TILE]"
print *, " [-r]"
print *, " [--src_regional]"
print *, " [--dst_regional]"
print *, " [--64bit_offset]"
print *, " [--netcdf4]"
print *, " [--weight_only]"
print *, " [--src_missingvalue src_var_name]"
print *, " [--dst_missingvalue dst_var_name]"
print *, " [--src_coordinates lon_var_name,lat_var_name]"
print *, " [--dst_coordinates lon_var_name,lat_var_name]"
print *, " [--user_areas]"
print *, " [--src_loc center|corner]"
print *, " [--dst_loc center|corner]"
print *, " [--tilefile_path tile_file_path]"
print *, " [--no_log]"
print *, " [--check]"
print *, " [--checkFlag]"
print *, " [--help]"
print *, " [--version]"
print *, " [-V]"
print *, "where"
print *, "--source or -s - a required argument specifying the source grid file"
print *, " name"
print *, "--destination or -d - a required argument specifying the destination grid"
print *, " file name"
print *, "--weight or -w - a required argument specifying the output regridding weight"
print *, " file name"
#if 0
print *, "--routehandle - an optional argument specifying the output routehandle file name"
#endif
print *, "--method or -m - an optional argument specifying which interpolation method is"
print *, " used. The default method is bilinear."
print *, "--pole or -p - an optional argument indicating what to do with the pole."
print *, " The default value is all."
print *, "--line_type or -l - an optional argument indicating the type of path"
print *, " lines (e.g. cell edges) follow on a spherical"
print *, " surface. The default value depends on the regrid"
print *, " method. For non-conservative methods the default is"
print *, " cartesian. For conservative methods the default is greatcircle."
print *, "--norm_type - an optional argument indicating the type of normalization to"
print *, " do when generating conserative weights. The default value is dstarea."
print *, "--extrap_method - an optional argument specifying which extrapolation method is"
print *, " used. The default method is none."
print *, "--extrap_num_src_pnts - an optional argument specifying how many source points should"
print *, " be used when the extrapolation method is nearestidavg. The default is 8."
print *, "--extrap_dist_exponent - an optional argument specifying the exponent that the distance should"
print *, " be raised to when the extrapolation method is nearestidavg. The default is 2.0."
print *, "--extrap_num_levels - an optional argument specifying how many levels should"
print *, " be filled for level based extrapolation methods (e.g. creep)."
print *, "--ignore_unmapped or -i - ignore unmapped destination points. If not specified,"
print *, " the default is to stop with an error."
print *, "--ignore_degenerate - ignore degenerate cells in the input grids. If not specified,"
print *, " the default is to stop with an error."
print *, "--src_type - an optional argument specifying the source grid file type."
print *, " The value can be one of SCRIP, ESMFMESH, UGRID, CFGRID, GRIDSPEC, MOSAIC or TILE."
print *, " If neither --src_type nor -t is given, the source grid file type will be"
print *, " determined automatically. (Usually it is unnecessary to provide --src_type,"
print *, " but it can be specified when the automatic file type determination fails.)"
print *, "--dst_type - an optional argument specifying the destination grid file type."
print *, " The value can be one of SCRIP, ESMFMESH, UGRID, CFGRID, GRIDSPEC, MOSAIC or TILE."
print *, " If neither --dst_type nor -t is given, the destination grid file type will be"
print *, " determined automatically. (Usually it is unnecessary to provide --dst_type,"
print *, " but it can be specified when the automatic file type determination fails.)"
print *, "-t - an optional argument specifying the file types for both the source"
print *, " and the destination grid files."
print *, " The value can be one of SCRIP, ESMFMESH, UGRID, CFGRID, GRIDSPEC, MOSAIC or TILE."
print *, " If -t is given, then neither --src_type nor --dst_type can be given."
print *, "-r - an optional argument specifying the source and destination grids"
print *, " are regional grids. Without this argument, the grids are assumed"
print *, " to be global"
print *, "--src_regional - an optional argument specifying the source grid is regional."
print *, " Without this argument, the src grids is assumed to be global."
print *, "--dst_regional - an optional argument specifying the destination grid is regional"
print *, " Without this argument, the dst grids is assumed to be global."
print *, "--64bit_offset - an optional argument specifying the output weight file is in"
print *, " NetCDF 64-bit offset format. This option only works with NetCDF library"
print *, " version 3.6 and above"
print *, "--netcdf4 - an optional argument specifying the output weight file is in"
print *, " the NetCDF4 format. This option only works with NetCDF library"
print *, " version 4.1 and above"
print *, "--weight_only - an Optional argument specifying the output weight file only contains"
print *, " the weights and the source and destination grid's indices."
print *, "--src_missingvalue - an optional argument used when the src file type is GRIDSPEC"
print *, " or UGRID. It defines the variable name whose 'missing_value' or"
print *, " '_FillValue' attribute will be used to construct the mask for the source"
print *, " grid. Without this argument,a GRIDSPEC file or a UGRID file is not masked."
print *, "--dst_missingvalue - an optional argument used when the destination file type is"
print *, " GRIDSPEC or UGRID. It defines the variable name whose 'missing_value' or"
print *, " '_FillValue' attribute will be used to construct the mask for the destination"
print *, " grid. Without this argument,a GRIDSPEC file or a UGRID file is not masked."
print *, "--src_coordinates - an optional argument used when the source grid type is GRIDSPEC."
print *, " It defines the longitude and latitude variable names separated by comma,"
print *, " in case there are multiple coordinate variables defined in the file"
print *, "--dst_coordinates - an optional argument used when the destination grid type is GRIDSPEC."
print *, " It defines the longitude and latitude variable names separated by comma,"
print *, " in case there are multiple coordinate variables defined in the file"
print *, "--user_areas - an optional argument specifying that the conservation is adjusted to"
print *, " hold for the user areas provided in the grid files. If not specified,"
print *, " then the conservation will hold for the ESMF calculated (great circle)"
print *, " areas. Whichever areas the conservation holds for are output to the"
print *, " weight file."
print *, "--src_loc - an optional argument specifying which location is used to do the regridding"
print *, " The location can be either 'center' or 'corner'. Currently, this argument"
print *, " is only required when the source grid file is an unstructured grid defined"
print *, " in UGRID or ESMF format and the regridding method is non-conservative. For "
print *, " all other cases, the default location is 'center'."
print *, "--dst_loc - an optional argument specifying which location is used to do the regridding"
print *, " The location can be either 'center' or 'corner'. Currently, this argument"
print *, " is 'center'. Currently, this argument will only be used when the"
print *, " is only required when the destination grid file is an unstructured grid defined"
print *, " in UGRID or ESMF format and the regridding method is non-conservative. For "
print *, " all other cases, the default location is 'center'."
print *, "--tilefile_path - the alternative file path for the tile files when the grid file type is"
print *, " MOSAIC."
print *, "--no_log - Turn off the ESMF logs."
print *, "--check - Check that the generated weights produce reasonable regridded fields. This"
print *, " is done by calling ESMF_FieldRegrid() on an analytic source field using the weights"
print *, " generated by this application. The mean relative error between the destination"
print *, " and analytic field is computed, as well as the relative error between the mass"
print *, " of the source and destination fields in the conservative case."
print *, "--checkFlag - Turn on more expensive extra error checking during weight generation."
print *, "--help or -h - Print this help message and exit."
print *, "--version - Print ESMF version and license information and exit."
print *, "-V - Print ESMF version number and exit."
print *, ""
print *, "For questions, comments, or feature requests please send email to:"
print *, "esmf_support@cgd.ucar.edu"
print *, ""
print *, "Visit http://www.earthsystemmodeling.org/ to find out more about the"
print *, "Earth System Modeling Framework."
print *, ""
end subroutine PrintUsage
subroutine ParseFileTypeArg(argName, fileTypeArg, fileType)
! Parse a given file type argument, returning the appropriate file type constant
character(len=*), intent(in) :: argName ! name of the argument, just used for error messages
character(len=*), intent(in) :: fileTypeArg ! value of the file type argument
type(ESMF_FileFormat_Flag), intent(out) :: fileType ! determined file type constant
select case (fileTypeArg)
case ('SCRIP')
fileType = ESMF_FILEFORMAT_SCRIP
case ('ESMFMESH')
fileType = ESMF_FILEFORMAT_ESMFMESH
case ('UGRID')
fileType = ESMF_FILEFORMAT_UGRID
case ('CFGRID')
fileType = ESMF_FILEFORMAT_CFGRID
case ('GRIDSPEC')
fileType = ESMF_FILEFORMAT_GRIDSPEC
case ('MOSAIC')
fileType = ESMF_FILEFORMAT_MOSAIC
case ('TILE')
fileType = ESMF_FILEFORMAT_TILE
case default
write(*,*)
print *, "ERROR: Unknown ", trim(argName), ": must be one of:"
print *, "SCRIP, ESMFMESH, UGRID, CFGRID, GRIDSPEC, MOSAIC or TILE."
print *, "Use the --help argument to see an explanation of usage."
call ESMF_Finalize(endflag=ESMF_END_ABORT)
end select
end subroutine ParseFileTypeArg
end program ESMF_RegridWeightGenApp