Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
character(len=*), | intent(in) | :: | lstring | |||
character(len=*), | intent(inout) | :: | lname | |||
integer, | intent(out) | :: | tag | |||
integer, | intent(out) | :: | symbol_loc(2) | |||
integer, | intent(out) | :: | localrc |
subroutine process_query(lstring, lname, tag, symbol_loc, localrc) !--------------------------------------------------------------------------- ! routine checks the input test string for a method specifier. Acceptable ! methods include: ! REDIST (-->), BILINEAR REMAP (=B=>), CONSERVATIVE REMAP (=C=>), ! SECOND ORDER CONSERVATIVE REMAP (=S=>), NEAREST NEIGHBOR REMAP (=N=>), ! EXCHANGE GRID CONSERVATIVE REMAPPING (=E=>), and a USER SPECIFIED REMAP ! METHOD (=U=>). ! !--------------------------------------------------------------------------- ! arguments character(len=*), intent(in ) :: lstring character(len=*), intent(inout) :: lname integer, intent( out) :: tag integer, intent( out) :: symbol_loc(2) integer, intent( out) :: localrc ! local variables character(THARN_MAXSTR) :: pattern integer :: iredist, iregrid, direction, ib ! initialize variables localrc = ESMF_RC_NOT_IMPL !--------------------------------------------------------------------------- ! Determine the Process type (REDISTRIBUTION or REMAPPING) ! Search for the two signifiers and determine which, if any applies. !--------------------------------------------------------------------------- iredist = index(lstring,'-->') iregrid = index(lstring,'=>') if( (iredist /= 0).and.(iregrid == 0) ) then ! redistribution lname = 'REDISTRIBUTION' tag = Harness_Redist symbol_loc(1) = iredist -1 symbol_loc(2) = iredist +3 elseif( (iredist == 0).and.(iregrid /= 0) ) then ! regrid, now determine what type direction = -1 ! find beginning of process symbol ib = findblank( lstring, iregrid, direction ) pattern = lstring(ib:iregrid+1) select case ( trim(adjustL(pattern)) ) case('=B=>') ! remap method Bilinear lname = 'Bilinear REGRID' tag = Harness_BilinearRegrid symbol_loc(1) = ib symbol_loc(2) = iregrid +2 case('=P=>') ! remap method Bilinear lname = 'patch REGRID' tag = Harness_PatchRegrid symbol_loc(1) = ib symbol_loc(2) = iregrid +2 case('=C=>') ! remap method first order conservative lname = 'Conservative REGRID' tag = Harness_ConservRegrid symbol_loc(1) = ib symbol_loc(2) = iregrid +2 case('=S=>') ! remap method second order conservative lname = '2nd Order Conservative REGRID' tag = Harness_2ndConservRegrid symbol_loc(1) = ib symbol_loc(2) = iregrid +2 case('=E=>') ! remap method exchange grid lname = 'Exchange Grid REGRID' tag = Harness_ExchangeRegrid symbol_loc(1) = ib symbol_loc(2) = iregrid +2 case('=N=>') ! remap method nearest neighbor lname = 'Nearest Neighbor REGRID' tag = Harness_NearNeighRegrid symbol_loc(1) = ib symbol_loc(2) = iregrid +2 case('=U=>') ! remap method undefined/user provided lname = 'User Provided REGRID' tag = Harness_UserProvRegrid symbol_loc(1) = ib symbol_loc(2) = iregrid +2 case default ! syntax error - no recognized method specified call ESMF_LogSetError( ESMF_FAILURE, & msg="process symbol not recognized", & rcToReturn=localrc) lname = 'ERROR' tag = Harness_Error symbol_loc(1) = 0 symbol_loc(2) = 0 return end select ! remap type elseif( (iredist == 0).and.(iregrid == 0) ) then ! syntax error - no action call ESMF_LogSetError( ESMF_FAILURE, & msg="no process symbol found", & rcToReturn=localrc) lname = 'ERROR' tag = Harness_Error return elseif( (iredist /= 0).and.(iregrid /= 0) ) then ! syntax error - multiple actions call ESMF_LogSetError( ESMF_FAILURE, & msg="more than one process symbol found", & rcToReturn=localrc) lname = 'ERROR' tag = Harness_Error return endif ! process test !--------------------------------------------------------------------------- ! if I've gotten this far without an error, then the routine has succeeded. !--------------------------------------------------------------------------- localrc = ESMF_SUCCESS !--------------------------------------------------------------------------- end subroutine process_query