New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
cpl_rnf_1d.F90 in branches/UKMO/r6232_new_runoff_coupling/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: branches/UKMO/r6232_new_runoff_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/cpl_rnf_1d.F90 @ 11452

Last change on this file since 11452 was 11452, checked in by jcastill, 5 years ago

Changes as in the original branch, plus one bug fix in oce.F90, plus changes to run with the branch but in uncoupled mode - although this is not complete yet

File size: 9.2 KB
Line 
1MODULE cpl_rnf_1d
2   !!======================================================================
3   !!                       ***  MODULE  cpl_rnf_1d  ***
4   !! Ocean forcing:  River runoff passed from the atmosphere using
5   !!                 1D array. One value per river.
6   !!=====================================================================
7   !! History : ?.?  ! 2018-01 (D. Copsey) Initial setup
8   !!----------------------------------------------------------------------
9
10   !!----------------------------------------------------------------------
11   !!   cpl_rnf_1d_init : runoffs initialisation
12   !!----------------------------------------------------------------------
13
14#if defined key_oasis3 || defined key_oasis3mct
15   USE mod_oasis                    ! OASIS3-MCT module
16#endif
17   USE cpl_oasis3
18   USE timing          ! Timing
19   USE in_out_manager  ! I/O units
20   USE lib_mpp         ! MPP library
21   USE iom
22   USE wrk_nemo        ! Memory allocation
23   USE dom_oce         ! Domain sizes (for grid box area e1e2t)
24   USE sbc_oce         ! Surface boundary condition: ocean fields
25   USE lib_fortran,    ONLY: DDPDD
26   
27   IMPLICIT NONE
28   PRIVATE
29   
30   PUBLIC   cpl_rnf_1d_init     ! routine called in nemo_init
31   PUBLIC   cpl_rnf_1d_rcv      ! routine called in sbccpl.F90
32   
33   TYPE, PUBLIC ::   RIVERS_DATA     !: Storage for river outflow data
34      INTEGER, POINTER, DIMENSION(:,:)    ::   river_number       !: River outflow number
35      REAL(wp), POINTER, DIMENSION(:)     ::   river_area         ! 1D array listing areas of each river outflow (m2)
36      COMPLEX(wp), POINTER, DIMENSION(:)  ::   river_area_c       ! Comlex version of river_area for use in bit reproducible sums (m2)
37   END TYPE RIVERS_DATA
38   
39   TYPE(RIVERS_DATA), PUBLIC, TARGET :: rivers  !: River data
40   
41   LOGICAL                    :: ln_print_river_info  ! Diagnostic prints of river coupling information
42   
43CONTAINS
44
45   SUBROUTINE cpl_rnf_1d_init
46      !!----------------------------------------------------------------------
47      !!                    ***  SUBROUTINE cpl_rnf_1d_init  ***
48      !!                     
49      !! ** Purpose : - Read in file for river outflow numbers.
50      !!                Calculate 2D area of river outflow points.
51      !!                Called from nemo_init (nemogcm.F90).
52      !!
53      !!----------------------------------------------------------------------
54      !! namelist variables
55      !!-------------------
56      CHARACTER(len=80)                         ::   file_riv_number             !: Filename for river numbers
57      INTEGER                                   ::   ios                 ! Local integer output status for namelist read
58      INTEGER                                   ::   inum
59      INTEGER                                   ::   ii, jj, rr          !: Loop indices
60      INTEGER                                   ::   max_river
61      REAL(wp), POINTER, DIMENSION(:,:)         ::   river_number        ! 2D array containing the river outflow numbers
62     
63      NAMELIST/nam_cpl_rnf_1d/file_riv_number, nn_cpl_river, ln_print_river_info
64      !!----------------------------------------------------------------------
65
66      IF( nn_timing == 1 ) CALL timing_start('cpl_rnf_1d_init')
67     
68      IF(lwp) WRITE(numout,*)
69      IF(lwp) WRITE(numout,*) 'cpl_rnf_1d_init : initialization of river runoff coupling'
70      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
71     
72      REWIND(numnam_cfg)
73     
74      ! Read the namelist
75      READ  ( numnam_ref, nam_cpl_rnf_1d, IOSTAT = ios, ERR = 901)
76901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_cpl_rnf_1d in reference namelist', lwp )
77      READ  ( numnam_cfg, nam_cpl_rnf_1d, IOSTAT = ios, ERR = 902 )
78902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_cpl_rnf_1d in configuration namelist', lwp )
79      IF(lwm) WRITE ( numond, nam_cpl_rnf_1d )
80
81      !                                               ! Parameter control and print
82      IF(lwp) WRITE(numout,*) '  '
83      IF(lwp) WRITE(numout,*) '          Namelist nam_cpl_rnf_1d : Coupled runoff using 1D array'
84      IF(lwp) WRITE(numout,*) '             Input file that contains river numbers = ',file_riv_number
85      IF(lwp) WRITE(numout,*) '             Maximum number of rivers to couple = ',nn_cpl_river
86      IF(lwp) WRITE(numout,*) '             Print river information = ',ln_print_river_info
87      IF(lwp) WRITE(numout,*) ' '
88     
89      ! Assign space for river numbers
90      ALLOCATE( rivers%river_number( jpi, jpj ) )
91      CALL wrk_alloc( jpi, jpj, river_number )
92     
93      ! Read the river numbers from netcdf file
94      CALL iom_open (file_riv_number , inum )
95      CALL iom_get  ( inum, jpdom_data, 'river_number', river_number )
96      CALL iom_close( inum )
97     
98      ! Convert from a real array to an integer array
99      max_river=0
100      DO ii = 1, jpi
101        DO jj = 1, jpj
102          rivers%river_number(ii,jj) = INT(river_number(ii,jj))
103          IF ( rivers%river_number(ii,jj) > max_river ) THEN
104            max_river = rivers%river_number(ii,jj)
105          END IF
106        END DO
107      END DO
108     
109      ! Print out the largest river number
110      WRITE(numout,*) 'Maximum river number in input file = ',max_river
111     
112      ! Get the area of each river outflow
113      ALLOCATE( rivers%river_area( nn_cpl_river ) )
114      ALLOCATE( rivers%river_area_c( nn_cpl_river ) )
115      rivers%river_area_c(:) = CMPLX( 0.e0, 0.e0, wp )
116      DO ii = nldi, nlei     
117        DO jj = nldj, nlej
118          IF ( tmask_i(ii,jj) > 0.5 ) THEN  ! This makes sure we are not at a duplicated point (at north fold or east-west cyclic point)
119            IF ( rivers%river_number(ii,jj) > 0 .AND. rivers%river_number(ii,jj) <= nn_cpl_river ) THEN
120              ! Add the area of each grid box (e1e2t) into river_area_c using DDPDD which should maintain bit reproducibility (needs to be checked)
121              CALL DDPDD( CMPLX( e1e2t(ii,jj), 0.e0, wp ), rivers%river_area_c(rivers%river_number(ii,jj) ) )
122            END IF
123          ELSE
124            IF ( jj == nldj .AND. tmask(ii,jj,1) > 0.5 ) THEN
125              WRITE(numout,*) 'At duplicated point at ii = ',ii
126            END IF
127          END IF
128        END DO
129      END DO
130     
131      ! Use mpp_sum to add together river areas on other processors
132      CALL mpp_sum( rivers%river_area_c, nn_cpl_river )
133     
134      ! Convert from complex number to real
135      ! DO rr = 1, nn_cpl_river
136      !    rivers%river_area(rr) = rivers%river_area_c(rr)
137      ! END DO
138      rivers%river_area(:) = REAL(rivers%river_area_c(:),wp)
139     
140      IF ( ln_print_river_info ) THEN
141        WRITE(numout,*) 'Area of rivers 1 to 10 are ',rivers%river_area(1:10)
142      END IF
143     
144   END SUBROUTINE cpl_rnf_1d_init
145   
146   SUBROUTINE cpl_rnf_1d_rcv( kstep)
147   
148      !!----------------------------------------------------------------------
149      !!                    ***  SUBROUTINE cpl_rnf_1d_rcv  ***
150      !!                     
151      !! ** Purpose : - Get river outflow from 1D array (passed from the
152      !!                atmosphere) and transfer it to the 2D NEMO runoff
153      !!                field.
154      !!                Called from sbc_cpl_rcv (sbccpl.F90).
155      !!
156      !!----------------------------------------------------------------------
157     
158      INTEGER                   , INTENT(in   ) ::   kstep     ! ocean time-step in seconds
159     
160      INTEGER  ::   kinfo                  ! OASIS3 info argument   
161      REAL(wp) ::   runoff_1d(nn_cpl_river)    ! River runoff. One value per river.
162      INTEGER  ::   ii, jj                 ! Loop indices
163      LOGICAL  ::   llaction               ! Has the get worked?
164     
165      IF ( ln_print_river_info ) THEN
166         WRITE(numout,*)' Getting data from 1D river runoff coupling '
167      ENDIF
168   
169      ! Get the river runoff sent by the atmosphere
170      CALL oasis_get ( runoff_id, kstep, runoff_1d, kinfo )
171      llaction =  kinfo == OASIS_Recvd   .OR. kinfo == OASIS_FromRest .OR.   &
172                  &        kinfo == OASIS_RecvOut .OR. kinfo == OASIS_FromRestOut
173                 
174      ! Output coupling info
175      IF ( ln_print_river_info ) THEN
176         WRITE(numout,*)' narea = ', narea
177         WRITE(numout,*)' kstep = ', kstep
178         WRITE(numout,*)' River runoff = ', runoff_1d(1:10)
179         WRITE(numout,*)' kinfo = ', kinfo
180         WRITE(numout,*)' llaction = ', llaction
181         WRITE(numout,*)' OASIS_Recvd = ',OASIS_Recvd
182         WRITE(numout,*)' OASIS_FromRest = ',OASIS_FromRest
183         WRITE(numout,*)' OASIS_RecvOut = ',OASIS_RecvOut
184         WRITE(numout,*)' OASIS_FromRestOut = ',OASIS_FromRestOut
185         WRITE(numout,*)'-------'
186      ENDIF
187     
188      IF ( llaction ) THEN
189     
190        ! Convert the 1D total runoff per river to 2D runoff flux by
191        ! dividing by the area of each runoff zone.
192        DO ii = 1, jpi
193          DO jj = 1, jpj
194            IF ( rivers%river_number(ii,jj) > 0 .AND. rivers%river_number(ii,jj) <= nn_cpl_river ) THEN
195              rnf(ii,jj) = runoff_1d(rivers%river_number(ii,jj)) / rivers%river_area(rivers%river_number(ii,jj))
196            ELSE
197              rnf(ii,jj) = 0.0
198            END IF
199           
200          END DO
201        END DO
202         
203      END IF
204     
205      IF ( ln_print_river_info ) WRITE(numout,*)' River runoff flux of AMAZON (pe 351) is ', rnf(59,29)         
206   
207   END SUBROUTINE cpl_rnf_1d_rcv
208
209END MODULE cpl_rnf_1d
Note: See TracBrowser for help on using the repository browser.