SURFEX v8.1
General documentation of Surfex
strhandler_mod.F90
Go to the documentation of this file.
1 !OPTIONS NOOPT
3 
4 USE parkind1 ,ONLY : jpim, jprm, jprd
5 
6 IMPLICIT NONE
7 
8 PRIVATE
9 
10 PUBLIC :: tolower, toupper, expand_string
11 PUBLIC :: sadjustl, sadjustr
12 PUBLIC :: stransfer
13 
14 INTERFACE stransfer
15 MODULE PROCEDURE &
18 END INTERFACE
19 
20 CONTAINS
21 
22 FUNCTION stransfer_r8_to_str(SOURCE, MOLD) RESULT(C)
23 REAL(KIND=JPRD) , INTENT(IN) :: SOURCE
24 CHARACTER(LEN=*), INTENT(IN) :: MOLD
25 CHARACTER(LEN=8) :: C
26 CALL ecmwf_transfer(c,min(8,len(mold)),source,8)
27 END FUNCTION stransfer_r8_to_str
28 
29 
30 FUNCTION stransfer_str_to_r8(SOURCE, MOLD) RESULT(Z)
31 CHARACTER(LEN=*), INTENT(IN) :: SOURCE
32 REAL(KIND=JPRD) , INTENT(IN) :: MOLD
33 REAL(KIND=JPRD) :: Z
34 CALL ecmwf_transfer(z,8,source,len(source))
35 END FUNCTION stransfer_str_to_r8
36 
37 
38 FUNCTION stransfer_r4_to_str(SOURCE, MOLD) RESULT(C)
39 REAL(KIND=JPRM) , INTENT(IN) :: SOURCE
40 CHARACTER(LEN=*), INTENT(IN) :: MOLD
41 CHARACTER(LEN=4) :: C
42 CALL ecmwf_transfer(c,min(4,len(mold)),source,4)
43 END FUNCTION stransfer_r4_to_str
44 
45 
46 FUNCTION stransfer_str_to_r4(SOURCE, MOLD) RESULT(Z)
47 CHARACTER(LEN=*), INTENT(IN) :: SOURCE
48 REAL(KIND=JPRM) , INTENT(IN) :: MOLD
49 REAL(KIND=JPRM) :: Z
50 CALL ecmwf_transfer(z,4,source,len(source))
51 END FUNCTION stransfer_str_to_r4
52 
53 
54 FUNCTION sadjustl(S) RESULT(C)
55 CHARACTER(LEN=*), INTENT(IN) :: S
56 CHARACTER(LEN=MAX(1,LEN(S))) C
57 c = ' '
58 IF (len(s) > 0) THEN
59  IF (s /= ' ') c = adjustl(s)
60 ENDIF
61 END FUNCTION sadjustl
62 
63 
64 FUNCTION sadjustr(S) RESULT(C)
65 CHARACTER(LEN=*), INTENT(IN) :: S
66 CHARACTER(LEN=MAX(1,LEN(S))) C
67 c = ' '
68 IF (len(s) > 0) THEN
69  IF (s /= ' ') c = adjustr(s)
70 ENDIF
71 END FUNCTION sadjustr
72 
73 
74 SUBROUTINE tolower(CDS)
75 CHARACTER(LEN=*), INTENT(INOUT) :: CDS
76 INTEGER(KIND=JPIM), PARAMETER :: ICH_A = ichar('a')
77 INTEGER(KIND=JPIM), PARAMETER :: ICHA = ichar('A')
78 INTEGER(KIND=JPIM), PARAMETER :: ICHZ = ichar('Z')
79 INTEGER(KIND=JPIM) :: I, ICH, NEW_ICH
80 CHARACTER(LEN=1) CH
81 DO i=1,len(cds)
82  ch = cds(i:i)
83  ich = ichar(ch)
84  IF ( ich >= icha .AND. ich <= ichz ) THEN
85  new_ich = ich + (ich_a - icha)
86  ch = char(new_ich)
87  cds(i:i) = ch
88  ENDIF
89 ENDDO
90 END SUBROUTINE tolower
91 
92 
93 SUBROUTINE toupper(CDS)
94 CHARACTER(LEN=*), INTENT(INOUT) :: CDS
95 INTEGER(KIND=JPIM), PARAMETER :: ICH_A = ichar('A')
96 INTEGER(KIND=JPIM), PARAMETER :: ICHA = ichar('a')
97 INTEGER(KIND=JPIM), PARAMETER :: ICHZ = ichar('z')
98 INTEGER(KIND=JPIM) :: I, ICH, NEW_ICH
99 CHARACTER(LEN=1) CH
100 DO i=1,len(cds)
101  ch = cds(i:i)
102  ich = ichar(ch)
103  IF ( ich >= icha .AND. ich <= ichz ) THEN
104  new_ich = ich + (ich_a - icha)
105  ch = char(new_ich)
106  cds(i:i) = ch
107  ENDIF
108 ENDDO
109 END SUBROUTINE toupper
110 
111 
112 SUBROUTINE expand_string(&
113  &MYPROC, &! %p
114  &nproc, &! %n
115  &timestep, &! %t
116  &max_timestep,&
117  &s) ! %s
119 INTEGER(KIND=JPIM), INTENT(IN) :: MYPROC, NPROC
120 INTEGER(KIND=JPIM), INTENT(IN) :: TIMESTEP, MAX_TIMESTEP
121 CHARACTER(LEN=*), INTENT(INOUT) :: S(:)
122 CHARACTER(LEN=2*LEN(S)) T
123 CHARACTER(LEN=2*LEN(S)) TT
124 INTEGER(KIND=JPIM) :: I, J, JJ, LOC_P, LEN_T, N
125 INTEGER(KIND=JPIM) :: NDIGS(4), NUM(4)
126 CHARACTER(LEN=6) FMT(4)
127 
128 n = SIZE(s)
129 
130 IF (n < 1) RETURN
131 
132 !* Setup output formats
133 num(1) = myproc
134 num(2) = max(nproc,myproc)
135 num(3) = n
136 num(4) = max(max_timestep,timestep)
137 
138 !* Count number of digits in each integer
139 DO j=1,4
140  ndigs(j) = 1
141  IF (num(j) /= 0) THEN
142  ndigs(j) = 1 + log10(dble(abs(num(j))))
143  IF (num(j) < 0) ndigs(j) = ndigs(j) + 1 ! Room for minus sign
144  ENDIF
145  ndigs(j) = min(ndigs(j),9) ! Max 9 digits supported; i.e. '999999999'
146  WRITE(fmt(j),'("(i",i1,")")') ndigs(j)
147 ENDDO
148 
149 
150 !* Expand fields '%s', '%p', '%n' and '%t' with their values
151 
152 
153 !* A special treatment with the sequence numbering
154 IF (n>1) THEN
155  loc_p = index(s(1),'%s')
156  IF (loc_p > 0) THEN
157  s(2:) = s(1)
158  ENDIF
159 ENDIF
160 
161 DO i=1,n
162  t = adjustl(s(i))//' '
163  loc_p = index(t,'%')
164 
165  IF (loc_p > 0) THEN
166  len_t = len_trim(t)
167  j = loc_p
168  tt(:j-1) = t(:j-1)
169  tt(j:) = ' '
170  jj = j-1
171 
172  DO WHILE (j <= len_t)
173  IF (t(j:j) == '%') THEN
174  j = j + 1
175  IF (j <= len_t) THEN
176  SELECT CASE ( t(j:j) )
177  CASE ( 'p' ) ! myproc
178  WRITE(tt(jj+1:jj+ndigs(1)),fmt(1)) myproc
179  jj = jj + ndigs(1)
180  CASE ( 'n' ) ! nproc
181  WRITE(tt(jj+1:jj+ndigs(2)),fmt(2)) nproc
182  jj = jj + ndigs(2)
183  CASE ( 's' ) ! sequence number i=[1..n]
184  WRITE(tt(jj+1:jj+ndigs(3)),fmt(3)) i
185  jj = jj + ndigs(3)
186  CASE ( 't' ) ! timestep
187  WRITE(tt(jj+1:jj+ndigs(4)),fmt(4)) timestep
188  jj = jj + ndigs(4)
189  CASE DEFAULT
190  tt(jj+1:jj+2) = '%'//t(j:j)
191  jj = jj + 2
192  END SELECT
193  ELSE
194  tt(jj+1:jj+1) = '%'
195  jj = jj + 1
196  ENDIF
197  ELSE
198  tt(jj+1:jj+1) = t(j:j)
199  jj = jj + 1
200  ENDIF
201  j = j + 1
202  ENDDO
203 
204  t = adjustl(tt)
205 
206 !* Get also rid of any blanks in the middle of the string
207 
208  len_t = len_trim(t)
209  j = 1
210  DO WHILE (j < len_t)
211  IF (t(j:j) == ' ') THEN
212  t(j:) = t(j+1:)
213  len_t = len_trim(t)
214  ELSE
215  j = j + 1
216  ENDIF
217  ENDDO
218 
219  ENDIF
220 
221  s(i) = t
222 ENDDO
223 
224 END SUBROUTINE expand_string
225 
226 END MODULE strhandler_mod
character(len=8) function stransfer_r8_to_str(SOURCE, MOLD)
integer, parameter jpim
Definition: parkind1.F90:13
integer, parameter jprd
Definition: parkind1.F90:39
character(len=max(1, len(s))) function, public sadjustl(S)
real(kind=jprm) function stransfer_str_to_r4(SOURCE, MOLD)
character(len=max(1, len(s))) function, public sadjustr(S)
real(kind=jprd) function stransfer_str_to_r8(SOURCE, MOLD)
integer, parameter jprm
Definition: parkind1.F90:30
subroutine, public tolower(CDS)
subroutine, public toupper(CDS)
character(len=4) function stransfer_r4_to_str(SOURCE, MOLD)
subroutine, public expand_string(MYPROC, nproc, timestep, max_timestep, s)
ERROR in index
Definition: ecsort_shared.h:90