forked from altMITgcm/MITgcm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
set_runoffmap.F
141 lines (124 loc) · 4.46 KB
/
set_runoffmap.F
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
134
135
136
137
138
139
140
141
C $Header: /u/gcmpack/MITgcm/pkg/atm_ocn_coupler/set_runoffmap.F,v 1.4 2013/12/02 22:03:08 jmc Exp $
C $Name: $
#include "CPP_OPTIONS.h"
CBOP 0
C !ROUTINE: SET_RUNOFFMAP
C !INTERFACE:
SUBROUTINE SET_RUNOFFMAP( msgUnit )
C !DESCRIPTION:
C *==========================================================*
C | SUBROUTINE SET_RUNOFFMAP
C | o define runoff mapping from atmos. grid (land) to
C | ocean grid
C *==========================================================*
C !USES:
IMPLICIT NONE
C == Global variables ==
#include "ATMSIZE.h"
#include "OCNSIZE.h"
#include "CPL_PARAMS.h"
#include "CPL_MAP2GRIDS.h"
C !INPUT/OUTPUT PARAMETERS:
C msgUnit :: log-file I/O unit
INTEGER msgUnit
C !LOCAL VARIABLES:
INTEGER n, ijo, ija
INTEGER lengthName, lengthRec, iRec
Real*8 r8seg(3)
Real*8 tmpfld(3,ROsize), rAc(Nx_ocn*Ny_ocn)
CEOP
WRITE(msgUnit,'(2A)') 'SET_RUNOFFMAP: ','entering'
C- Initialize to zero :
DO n=1,ROsize
ijROocn(n)=0
ijROatm(n)=0
arROmap(n)=0.
ENDDO
nROmap = runOffMapSize
c lengthName=ILNBLNK( runOffMapFile ) ! eesup/src/utils.F not compiled here
lengthName=0
DO n=1,LEN( runOffMapFile )
IF ( runOffMapFile(n:n).NE.' ' ) lengthName=n
ENDDO
WRITE(msgUnit,'(3A,I6)')
& ' runOffMapFile =>>', runOffMapFile(1:lengthName),
& '<<= , runOffMapSize=', runOffMapSize
IF ( lengthName.EQ.0 ) nROmap=0
IF ( nROmap.EQ.0 ) THEN
WRITE(msgUnit,'(2A,I9,A)') 'SET_RUNOFFMAP: ',
& 'nothing to set (nROmap=', nROmap, ' )'
RETURN
ENDIF
IF ( nROmap.GT.ROsize ) THEN
WRITE(msgUnit,'(2A)') '*** ERROR *** SET_RUNOFFMAP: ',
& 'runOffMapSize exceeds ROsize'
STOP 'ABNORMAL END: S/R SET_RUNOFFMAP'
ENDIF
C- Read area catchment from file ;
WRITE(msgUnit,'(2A)') 'SET_RUNOFFMAP: ','reading runOffMapFile'
c lengthRec=3*nROmap*WORDLENGTH*2
c OPEN(88, FILE=runOffMapFile(1:lengthName), STATUS='OLD',
c & ACCESS='direct', RECL=lengthRec )
c READ(88,rec=1) tmpfld
lengthRec=3*WORDLENGTH*2
OPEN(88, FILE=runOffMapFile(1:lengthName), STATUS='OLD',
& ACCESS='direct', RECL=lengthRec )
DO n=1,nROmap
iRec = n
READ(88,rec=iRec) r8seg
tmpfld(1,n) = r8seg(1)
tmpfld(2,n) = r8seg(2)
tmpfld(3,n) = r8seg(3)
ENDDO
CLOSE(88)
#ifdef _BYTESWAPIO
CALL MDS_BYTESWAPR8( 3*nROmap, tmpfld )
#endif
c n=nROmap
c WRITE(msgUnit,'(A,3I5,F11.6)') 'ROmap:',n,nint(tmpfld(1,n)),
c & NINT(tmpfld(2,n)),tmpfld(3,n)*1.d-9
C- Read (ocean) grid cell area from file ;
WRITE(msgUnit,'(2A)') 'SET_RUNOFFMAP: ','reading OCN grid area'
lengthRec=Nx_ocn*Ny_ocn*WORDLENGTH*2
OPEN(88, FILE='RA.bin', STATUS='OLD',
& ACCESS='direct', RECL=lengthRec )
iRec = 1
READ(88,rec=iRec) rAc
CLOSE(88)
#ifdef _BYTESWAPIO
CALL MDS_BYTESWAPR8( Nx_ocn*Ny_ocn, rAc )
#endif
c WRITE(msgUnit,*) 'rAc=', rAc(1), rAc(17), rAc(17+16*Nx_ocn)
C----------------------------------------------------------
C- Define mapping :
DO n=1,nROmap
ija = NINT(tmpfld(1,n))
ijo = NINT(tmpfld(2,n))
IF ( ija.LT.1 .OR. ija.GT.Nx_atm*Ny_atm ) THEN
WRITE(msgUnit,'(2A)') '*** ERROR *** SET_RUNOFFMAP: ',
& 'ijROatm out of range !'
STOP 'ABNORMAL END: S/R SET_RUNOFFMAP'
ENDIF
ijROatm(n) = ija
IF ( ijo.LT.1 .OR. ijo.GT.Nx_ocn*Ny_ocn ) THEN
WRITE(msgUnit,'(2A)') '*** ERROR *** SET_RUNOFFMAP: ',
& 'ijROocn out of range !'
STOP 'ABNORMAL END: S/R SET_RUNOFFMAP'
ELSEIF ( rAc(ijo).GT.0. ) THEN
arROmap(n) = tmpfld(3,n)/rAc(ijo);
ELSE
arROmap(n) = 0.
ENDIF
ijROocn(n) = ijo
ENDDO
C- print to check :
n = 1
WRITE(msgUnit,'(A,3I5,F9.6)') ' check ROmap:',
& n,ijROatm(n),ijROocn(n),arROmap(n)
n = nROmap
WRITE(msgUnit,'(A,3I5,F9.6)') ' check ROmap:',
& n,ijROatm(n),ijROocn(n),arROmap(n)
WRITE(msgUnit,'(2A,I9,A)') 'SET_RUNOFFMAP: ',
& 'done (nROmap=', nROmap, ' )'
RETURN
END