! ! This file contains the original WRF or WRFSI subroutines ! /Functions with minor changes to remove the dependence ! on WRF framework. ! ! These subroutines are releated to WRF external I/O or ! interpolation procedures. ! ! Author: Yunheng Wang (01/07/2005). ! SUBROUTINE wrf_debug(level, str) IMPLICIT NONE CHARACTER*(*), INTENT(IN) :: str INTEGER , INTENT(IN) :: level IF (level > 0) WRITE(0,*) str RETURN END SUBROUTINE wrf_debug SUBROUTINE wrf_message(str) IMPLICIT NONE CHARACTER*(*), INTENT(IN) :: str WRITE(6,*) 'WRF MESSAGE: ',str RETURN END SUBROUTINE wrf_message SUBROUTINE wrf_error_fatal( str ),2 IMPLICIT NONE CHARACTER*(*), INTENT(IN) :: str WRITE(0,*) '-------------- FATAL CALLED ---------------' WRITE(0,*) str WRITE(0,*) '-------------------------------------------' CALL arpsstop('ARPSSTOP called.',1) END SUBROUTINE wrf_error_fatal ! ! This subroutine uses an extended intrinsic procedure ! sizeof(A). Some compilers, such as PGF90 may not provide this ! intrinsic function. ! SUBROUTINE wrf_sizeof_integer( retval ) IMPLICIT NONE INTEGER retval #ifndef NOSIZEOF retval = sizeof(retval) ! works on IBM XL Fortran IFORT_SIZEOF ! Intel IFORT Fortran ! PGI Fortran compiler ! OSF1 Fortran compiler #else retval = 4 ! for PGF90 etc. PGF_SIZEOF #endif RETURN END SUBROUTINE wrf_sizeof_integer SUBROUTINE wrf_sizeof_real( retval ) IMPLICIT NONE INTEGER, INTENT(OUT) :: retval REAL :: tmp #ifndef NOSIZEOF retval = sizeof(tmp) ! IFORT_SIZEOF #else retval = 4 ! for PGF90 etc. PGF_SIZEOF #endif RETURN END SUBROUTINE wrf_sizeof_real ! !################################################################## ! FUNCTION projrot_latlon(iproj,trulat1,trulat2,trulon,ctrlat,ctrlon, & rlat,rlon,istatus) ! ! Adapted from WRFSI ! IMPLICIT NONE INTEGER, INTENT(IN) :: iproj REAL, INTENT(IN) :: trulat1,trulat2,trulon REAL, INTENT(IN) :: ctrlat,ctrlon REAL, INTENT(IN) :: rlat,rlon INTEGER, INTENT(OUT) :: istatus REAL :: projrot_latlon !------------------------------------------------------------------ ! ! Misc. local variables ! !------------------------------------------------------------------ REAL :: angdif REAL :: s,n REAL :: colat1,colat2 REAL :: rn REAL, PARAMETER :: d2rfactor = 3.1415926/180. !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IF(ABS(iproj) == 1) THEN ! polar stereographic IF(trulat1 == +90.)then projrot_latlon = trulon - rlon ELSE IF(trulat1 == -90.)then projrot_latlon = rlon - trulon ELSE ! abs(trulat1) .ne. 90. IF(ctrlat == trulat1 .AND. ctrlon == trulon) THEN ! grid centered on proj pole rn = COS( (90.-trulat1) * d2rfactor) projrot_latlon = rn * angdif(trulon,rlon) ELSE IF(.TRUE.) THEN write(6,*)' ERROR in projrot_latlon: ' write(6,*)' This type of local', & ' stereographic projection not yet supported.' write(6,*)' Grid should be centered on projection pole.' projrot_latlon = 0. ELSE ! .false. ! Find dx/lat and dy/lat, then determine projrot_laps END IF END IF ! trulat1 ELSE IF(ABS(iproj) == 2) THEN ! lambert conformal IF(trulat1 >= 0.0) THEN s = +1. ELSE s = -1. END IF colat1 = 90. - s * trulat1 colat2 = 90. - s * trulat2 IF(trulat1 == trulat2) THEN ! tangent lambert n = COS( d2rfactor * colat1 ) ELSE ! two standard latitudes n = ALOG(COS(d2rfactor * trulat1) / COS( d2rfactor*trulat2) )/ & ALOG(TAN(d2rfactor * (45.-s*trulat1/2.) ) / & TAN(d2rfactor * (45.-s*trulat2/2.) ) ) END IF projrot_latlon = n * s * angdif(trulon,rlon) ELSE IF(ABS(iproj) == 3) THEN ! mercator projrot_latlon = 0. ELSE WRITE(6,*) 'projrot_latlon: unrecognized projection ',iproj STOP END IF istatus = 1 RETURN END FUNCTION projrot_latlon ! !################################################################## ! FUNCTION angdif(x,y) ! ! Difference between two angles, result is between -180. and +180. ! IMPLICIT NONE REAL, INTENT(IN) :: x,y REAL :: angdif angdif = MOD(X-Y+540.,360.)-180. RETURN END FUNCTION angdif ! !################################################################## ! SUBROUTINE const_module_initialize (p00,t00,a) 2,1 !----------------------------------------------------------------- ! ! PURPOSE: ! ! Initialize p00,t00 & a from ARPS2WRF namelist input. ! !---------------------------------------------------------------- USE wrf_metadata IMPLICIT NONE REAL, INTENT(OUT) :: p00 REAL, INTENT(OUT) :: t00 REAL, INTENT(OUT) :: a p00 = base_pres t00 = base_temp a = base_lapse ! p00 = 100000. ! constant sea level pressure, Pa ! t00 = 290. ! constant sea level temperature, K ! a = 50. ! temperature difference from 1000mb to 300mb, K END SUBROUTINE