-
Notifications
You must be signed in to change notification settings - Fork 33
/
reader_2D_3D.f90
133 lines (113 loc) · 3.08 KB
/
reader_2D_3D.f90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
SUBROUTINE read_3d_input_files(it, varname, field)
IMPLICIT NONE
INTEGER, INTENT(IN) :: it
CHARACTER(len=*), INTENT(IN) :: varname
REAL, INTENT(OUT), DIMENSION(:,:,:) :: field
INTEGER :: i, j, k
REAL :: factor, offset,min,max
CHARACTER(len=LEN(varname)) :: tmp
min= -1.e20
max=1.e20
tmp = TRIM(ADJUSTL(varname))
SELECT CASE (tmp)
CASE ('CLOUD')
factor = 0.02
offset = -20.
CASE ('U')
factor = .075
offset = 45.
max=21
min=17
CASE ('T')
factor = 1.3
offset = -27.5
min=191.
max=240.
CASE ('tro3')
factor = 1.
offset = 0.
END SELECT
DO k=1,SIZE(field, 3)
DO j=1,SIZE(field, 2)
DO i=1,SIZE(field, 1)
field(i,j,k) = ((k-1)*64 + (j-1)*16 + (i-1)*4 + it)*factor - offset
if (field(i,j,k).gt.max) field(i,j,k)=max
if (field(i,j,k).lt.min) field(i,j,k)=min
END DO
END DO
END DO
END SUBROUTINE read_3d_input_files
SUBROUTINE read_2d_input_files(it, varname, field)
IMPLICIT NONE
INTEGER, INTENT(IN) :: it
CHARACTER(len=*), INTENT(IN) :: varname
REAL, INTENT(OUT), DIMENSION(:,:) :: field
INTEGER :: i, j
REAL :: factor, offset,min,max
CHARACTER(len=LEN(varname)) :: tmp
min= -1.e20
max=1.e20
tmp = TRIM(ADJUSTL(varname))
SELECT CASE (tmp)
CASE ('LATENT')
factor = 4.2
offset = 0.
min=-65
max=65
CASE ('TSURF')
factor = 2.0
offset = -230.
max=285
min=270
CASE ('SOIL_WET')
factor = 4.
offset = 0.
max = 128.
CASE ('PSURF')
factor = 100.
offset = -9.4e4
CASE ('PRECIP')
factor = 1.2e-6
offset = 0.
max = 1.e-3
min=0.
CASE ('SFTLF')
factor = 1.
offset = -12.
max = 100.
min=0.
END SELECT
DO j=1,SIZE(field, 2)
DO i=1,SIZE(field, 1)
field(i,size(field,2)+1-j) = ((j-1)*16 + (i-1)*4 + it)*factor - offset
if (field(i,size(field,2)+1-j).gt.max) field(i,size(field,2)+1-j)=max
if (field(i,size(field,2)+1-j).lt.min) field(i,size(field,2)+1-j)=min
END DO
END DO
END SUBROUTINE read_2d_input_files
SUBROUTINE read_1d_input_files(it, varname, field)
IMPLICIT NONE
INTEGER, INTENT(IN) :: it
CHARACTER(len=*), INTENT(IN) :: varname
REAL, INTENT(OUT), DIMENSION(:,:) :: field
INTEGER :: i, j
REAL :: factor, offset,min,max
CHARACTER(len=LEN(varname)) :: tmp
min=-1.e20
max=1.e20
tmp = TRIM(ADJUSTL(varname))
SELECT CASE (tmp)
CASE ('OFLUX')
factor = .5e14
offset = 2.e13
max = 1.492e14
min = 1.46e14
END SELECT
DO j=1,SIZE(field, 2)
DO i=1,SIZE(field, 1)
field(i,j) = ((j-1)*16 + (i-1)*4 + it)*factor - offset
if (field(i,j).gt.max) field(i,j)=max
if (field(i,j).lt.min) field(i,j)=min
END DO
END DO
END SUBROUTINE read_1d_input_files