SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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)
19 USE modd_arch, ONLY : little_endian_arch
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:6
subroutine char_to_real(KOUT, HSTR)