SURFEX v8.1
General documentation of Surfex
mode_char2real.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
6 !
7 USE modi_abor1_sfx
8 !
9 USE yomhook ,ONLY : lhook, dr_hook
10 USE parkind1 ,ONLY : jprb
11 !
12 INTERFACE ASSIGNMENT (=)
13  MODULE PROCEDURE char_to_real
14 END INTERFACE
15 !
16 CONTAINS
17 !
18 SUBROUTINE char_to_real(KOUT,HSTR)
20 IMPLICIT NONE
21  CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HSTR
22 REAL,DIMENSION(SIZE(HSTR)), INTENT(OUT) :: KOUT
23 INTEGER :: ISIZE, JI
24  CHARACTER(LEN=8),DIMENSION(:),ALLOCATABLE :: YTEMP
25  CHARACTER(LEN=4),DIMENSION(:),ALLOCATABLE :: YTEMP2
26 REAL(KIND=JPRB) :: ZHOOK_HANDLE
27 
28 IF (lhook) CALL dr_hook('MODE_CHAR2REAL:CHAR_TO_REAL',0,zhook_handle)
29 SELECT CASE(len(hstr(1)))
30 CASE (8)
31  isize = SIZE(hstr)
32  IF (little_endian_arch) then! must swap 8 bytes
33  ALLOCATE(ytemp(isize))
34  DO ji=1,isize
35  ytemp(ji)(1:1) = hstr(ji)(8:8)
36  ytemp(ji)(2:2) = hstr(ji)(7:7)
37  ytemp(ji)(3:3) = hstr(ji)(6:6)
38  ytemp(ji)(4:4) = hstr(ji)(5:5)
39  ytemp(ji)(5:5) = hstr(ji)(4:4)
40  ytemp(ji)(6:6) = hstr(ji)(3:3)
41  ytemp(ji)(7:7) = hstr(ji)(2:2)
42  ytemp(ji)(8:8) = hstr(ji)(1:1)
43  END DO
44  kout = transfer(ytemp,1.0_8,isize)
45  DEALLOCATE(ytemp)
46  ELSE
47  kout = transfer(hstr,1.0_8,isize)
48  END IF
49 CASE (4)
50  ! EMULATE a 32 bits REAL
51  isize = SIZE(hstr)
52  IF (little_endian_arch) THEN
53  ALLOCATE(ytemp2(isize))
54  DO ji=1,isize
55  ytemp2(ji)(1:1) = hstr(ji)(4:4)
56  ytemp2(ji)(2:2) = hstr(ji)(3:3)
57  ytemp2(ji)(3:3) = hstr(ji)(2:2)
58  ytemp2(ji)(4:4) = hstr(ji)(1:1)
59  END DO
60  kout = transfer(ytemp2,1.0_4,isize)
61  DEALLOCATE(ytemp2)
62  ELSE
63  kout = transfer(hstr,1.0_4,isize)
64  END IF
65 CASE (2)
66  ! EMULATE a 16 bits signed INTEGER
67  IF (little_endian_arch) then! must swap 2 bytes
68  kout = ichar(hstr(:)(2:2))+256*ichar(hstr(:)(1:1))
69  ELSE
70  kout = ichar(hstr(:)(1:1))+256*ichar(hstr(:)(2:2))
71  END IF
72  WHERE (kout > 32767)
73  kout = kout - 65536.
74  END WHERE
75 
76 CASE(1)
77  ! EMULATE an 8 bits signed INTEGER
78  kout(:) = ichar(hstr(:))
79  WHERE (kout > 127)
80  kout = kout - 256.
81  END WHERE
82 
83 CASE default
84  CALL abor1_sfx('MODE_CHAR2REAL: CONVERSION ERROR IN READ_DIRECT SUBROUTINE')
85 END SELECT
86 IF (lhook) CALL dr_hook('MODE_CHAR2REAL:CHAR_TO_REAL',1,zhook_handle)
87 END SUBROUTINE char_to_real
88 END MODULE mode_char2real
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
subroutine char_to_real(KOUT, HSTR)
logical lhook
Definition: yomhook.F90:15
logical, dimension(nnwl), parameter little_endian_arch
Definition: modd_arch.F90:33