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.
flowri.F90 in trunk/NEMO/OPA_SRC/FLO – NEMO

source: trunk/NEMO/OPA_SRC/FLO/flowri.F90 @ 719

Last change on this file since 719 was 719, checked in by ctlod, 17 years ago

get back to the nemo_v2_3 version for trunk

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.5 KB
Line 
1MODULE flowri
2   !!======================================================================
3   !!                       ***  MODULE  flowri  ***
4   !!
5   !!======================================================================
6#if   defined key_floats   ||   defined key_esopa
7   !!----------------------------------------------------------------------
8   !!   'key_floats'                                     float trajectories
9   !!----------------------------------------------------------------------
10   !!    flowri     : write trajectories of floats in file
11   !!----------------------------------------------------------------------
12   !! * Modules used
13   USE flo_oce         ! ocean drifting floats
14   USE oce             ! ocean dynamics and tracers
15   USE dom_oce         ! ocean space and time domain
16   USE lib_mpp         ! distribued memory computing library
17   USE daymod
18   USE in_out_manager  ! I/O manager
19
20   IMPLICIT NONE
21
22   !! * Accessibility
23   PRIVATE
24   PUBLIC flo_wri     ! routine called by floats.F90
25
26   !! * Module variables
27      INTEGER :: jfl              ! number of floats
28
29   !! * Substitutions
30#  include "domzgr_substitute.h90"
31   !!----------------------------------------------------------------------
32   !!   OPA 9.0 , LOCEAN-IPSL (2005)
33   !! $Header$
34   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
35   !!----------------------------------------------------------------------
36
37CONTAINS
38
39   SUBROUTINE flo_wri( kt )
40      !!---------------------------------------------------------------------
41      !!                  ***  ROUTINE flo_wri  ***
42      !!             
43      !! ** Purpose :   Write position of floats in "trajec_float" file
44      !!      and the temperature and salinity at this position
45      !!     
46      !! ** Method  :   The frequency is nwritefl
47      !!     
48      !!  History :
49      !!    8.0  !  99-09  (Y. Drillet)  Original code
50      !!         !  00-06  (J.-M. Molines)  Profiling floats for CLS
51      !!    8.5  !  02-10  (A. Bozec)  F90: Free form and module
52      !!----------------------------------------------------------------------
53      !! * Arguments
54      INTEGER  :: kt                               ! time step
55
56      !! * Local declarations
57      CHARACTER (len=21) ::  clname
58      INTEGER ::   inum            ! temporary logical unit for restart file
59      INTEGER  ::   &
60         iafl,ibfl,icfl,ia1fl,ib1fl,ic1fl,jfl,irecflo,   &
61         iafloc,ibfloc,ia1floc,ib1floc,   &
62         iafln, ibfln
63      INTEGER  ::    ic, jc , jpn
64      INTEGER, DIMENSION ( jpnij )  :: iproc
65
66      REAL(wp) :: zafl,zbfl,zcfl,zdtj
67      REAL(wp) :: zxxu, zxxu_01,zxxu_10, zxxu_11
68      REAL(wp), DIMENSION (jpk,jpnfl) :: ztemp, zsal
69      !!---------------------------------------------------------------------
70     
71      IF( kt == nit000 .OR. MOD( kt,nwritefl)== 0 ) THEN 
72
73         ! header of output floats file
74     
75         IF(lwp) THEN
76            WRITE(numout,*)
77            WRITE(numout,*) 'flo_wri : write in trajec_float file '
78            WRITE(numout,*) '~~~~~~~    '
79         ENDIF
80
81         ! open the file numflo
82         clname='trajec_float'
83         CALL ctlopn( numflo, clname, 'UNKNOWN', 'UNFORMATTED', 'SEQUENTIAL',   &
84            &           1, numout, .FALSE., 1 )
85         !      REWIND numflo
86
87         IF( kt == nit000 ) THEN
88            irecflo = NINT( (nitend-nit000) / FLOAT(nwritefl) )
89            IF(lwp) WRITE(numflo)cexper,no,irecflo,jpnfl,nwritefl
90         ENDIF
91         zdtj = rdt / 86400.      !!bug   use of 86400 instead of the phycst parameter
92
93         ! translation of index position in geographical position
94
95         IF( lk_mpp ) THEN
96            DO jfl = 1, jpnfl
97               iafl  = INT ( tpifl(jfl) )
98               ibfl  = INT ( tpjfl(jfl) )
99               icfl  = INT ( tpkfl(jfl) )
100               iafln = NINT( tpifl(jfl) )
101               ibfln = NINT( tpjfl(jfl) )
102               ia1fl = iafl + 1
103               ib1fl = ibfl + 1
104               ic1fl = icfl + 1
105               zafl  = tpifl(jfl) - FLOAT( iafl )
106               zbfl  = tpjfl(jfl) - FLOAT( ibfl )
107               zcfl  = tpkfl(jfl) - FLOAT( icfl )
108               IF(   iafl >= mig(nldi)-jpizoom+1 .AND. iafl <= mig(nlei)-jpizoom+1 .AND.   &
109                  &  ibfl >= mjg(nldj)-jpjzoom+1 .AND. ibfl <= mjg(nlej)-jpjzoom+1       ) THEN
110
111                  ! local index
112
113                  iafloc  = iafl -(mig(1)-jpizoom+1) + 1
114                  ibfloc  = ibfl -(mjg(1)-jpjzoom+1) + 1
115                  ia1floc = iafloc + 1
116                  ib1floc = ibfloc + 1
117
118                  flyy(jfl) = (1.-zafl)*(1.-zbfl)*gphit(iafloc ,ibfloc ) + (1.-zafl) * zbfl * gphit(iafloc ,ib1floc)   &
119                     &      +     zafl *(1.-zbfl)*gphit(ia1floc,ibfloc ) +     zafl  * zbfl * gphit(ia1floc,ib1floc)
120                  flxx(jfl) = (1.-zafl)*(1.-zbfl)*glamt(iafloc ,ibfloc ) + (1.-zafl) * zbfl * glamt(iafloc ,ib1floc)   &
121                     &      +     zafl *(1.-zbfl)*glamt(ia1floc,ibfloc ) +     zafl  * zbfl * glamt(ia1floc,ib1floc)
122                  flzz(jfl) = (1.-zcfl)*fsdepw(iafloc,ibfloc,icfl ) + zcfl * fsdepw(iafloc,ibfloc,ic1fl)
123
124                  ! Change  by Alexandra Bozec et Jean-Philippe Boulanger
125                  ! We save  the instantaneous profile of T and S of the column     
126                  ! ztemp(jfl)=tn(iafloc,ibfloc,icfl)
127                  ! zsal(jfl)=sn(iafloc,ibfloc,icfl)
128                  ztemp(1:jpk,jfl) = tn(iafloc,ibfloc,1:jpk)
129                  zsal (1:jpk,jfl) = sn(iafloc,ibfloc,1:jpk)           
130               ELSE
131                  flxx(jfl) = 0.
132                  flyy(jfl) = 0.
133                  flzz(jfl) = 0.
134                  ztemp(1:jpk,jfl) = 0.
135                  zsal (1:jpk,jfl) = 0.
136               ENDIF
137            END DO
138
139            CALL mpp_sum( flxx, jpnfl )   ! sums over the global domain
140            CALL mpp_sum( flyy, jpnfl )
141            CALL mpp_sum( flzz, jpnfl )
142            ! these 2 lines have accendentaly been removed from ATL6-V8 run hence
143            ! giving 0 salinity and temperature on the float trajectory
144!bug RB
145!compilation failed in mpp
146!            CALL mpp_sum( ztemp, jpk*jpnfl )
147!            CALL mpp_sum( zsal , jpk*jpnfl )
148
149         ELSE
150            DO jfl = 1, jpnfl
151               iafl  = INT (tpifl(jfl))
152               ibfl  = INT (tpjfl(jfl))
153               icfl  = INT (tpkfl(jfl))
154               iafln = NINT(tpifl(jfl))
155               ibfln = NINT(tpjfl(jfl))
156               ia1fl = iafl+1
157               ib1fl = ibfl+1
158               ic1fl = icfl+1
159               zafl  = tpifl(jfl) - FLOAT(iafl)
160               zbfl  = tpjfl(jfl) - FLOAT(ibfl)
161               zcfl  = tpkfl(jfl) - FLOAT(icfl)
162               iafloc  = iafl
163               ibfloc  = ibfl
164               ia1floc = iafloc + 1
165               ib1floc = ibfloc + 1
166               !
167               flyy(jfl) = (1.-zafl)*(1.-zbfl)*gphit(iafloc ,ibfloc ) + (1.-zafl) * zbfl * gphit(iafloc ,ib1floc)   &
168                         +     zafl *(1.-zbfl)*gphit(ia1floc,ibfloc ) +     zafl  * zbfl * gphit(ia1floc,ib1floc)
169               flxx(jfl) = (1.-zafl)*(1.-zbfl)*glamt(iafloc ,ibfloc ) + (1.-zafl) * zbfl * glamt(iafloc ,ib1floc)   &
170                         +     zafl *(1.-zbfl)*glamt(ia1floc,ibfloc ) +     zafl  * zbfl * glamt(ia1floc,ib1floc)
171               flzz(jfl) = (1.-zcfl)*fsdepw(iafloc,ibfloc,icfl ) + zcfl * fsdepw(iafloc,ibfloc,ic1fl)
172               !ALEX
173               ! Astuce pour ne pas avoir des flotteurs qui se baladent sur IDL
174               zxxu_11 = glamt(iafloc ,ibfloc )
175               zxxu_10 = glamt(iafloc ,ib1floc)
176               zxxu_01 = glamt(ia1floc,ibfloc )
177               zxxu    = glamt(ia1floc,ib1floc)
178
179               IF( iafloc == 52 )  zxxu_10 = -181
180               IF( iafloc == 52 )  zxxu_11 = -181
181               flxx(jfl)=(1.-zafl)*(1.-zbfl)* zxxu_11 + (1.-zafl)*    zbfl * zxxu_10   &
182                        +    zafl *(1.-zbfl)* zxxu_01 +     zafl *    zbfl * zxxu
183               !ALEX         
184               ! Change  by Alexandra Bozec et Jean-Philippe Boulanger
185               ! We save  the instantaneous profile of T and S of the column     
186               !     ztemp(jfl)=tn(iafloc,ibfloc,icfl)
187               !     zsal(jfl)=sn(iafloc,ibfloc,icfl)
188               ztemp(1:jpk,jfl) = tn(iafloc,ibfloc,1:jpk)
189               zsal (1:jpk,jfl) = sn(iafloc,ibfloc,1:jpk)
190            END DO
191         ENDIF
192
193         !
194         WRITE(numflo) flxx,flyy,flzz,nisobfl,ngrpfl,ztemp,zsal, FLOAT(ndastp)
195      !!
196      !! case when profiles are dumped. In order to save memory, dumps are
197      !! done level by level.
198      !      IF (mod(kt,nflclean) == 0.) THEN
199      !!     IF ( nwflo == nwprofil ) THEN
200      !        DO jk = 1,jpk
201      !         DO jfl=1,jpnfl
202      !         iafl= INT(tpifl(jfl))
203      !         ibfl=INT(tpjfl(jfl))
204      !         iafln=NINT(tpifl(jfl))
205      !         ibfln=NINT(tpjfl(jfl))
206      !# if defined key_mpp_mpi   ||   defined key_mpp_shmem
207      !        IF ( (iafl >= (mig(nldi)-jpizoom+1)) .AND.
208      !     $       (iafl <= (mig(nlei)-jpizoom+1)) .AND.
209      !     $       (ibfl >= (mjg(nldj)-jpjzoom+1)) .AND.
210      !     $       (ibfl <= (mjg(nlej)-jpjzoom+1)) ) THEN
211      !!
212      !! local index
213      !!
214      !         iafloc=iafln-(mig(1)-jpizoom+1)+1
215      !         ibfloc=ibfln-(mjg(1)-jpjzoom+1)+1
216      !!         IF (jk == 1 ) THEN
217      !!      PRINT *,'<<<>>> ',jfl,narea, iafloc ,ibfloc, iafln, ibfln,adatrj
218      !!         ENDIF
219      !# else
220      !         iafloc=iafln
221      !         ibfloc=ibfln
222      !# endif
223      !         ztemp(jfl)=tn(iafloc,ibfloc,jk)
224      !         zsal(jfl)=sn(iaflo!,ibfloc,jk)
225      !# if defined key_mpp_mpi   ||   defined key_mpp_shmem
226      !        ELSE
227      !         ztemp(jfl) = 0.
228      !         zsal(jfl) = 0.
229      !        ENDIF
230      !# endif
231      !! ... next float
232      !        END DO
233      !      IF( lk_mpp )   CALL mpp_sum( ztemp, jpnfl )
234      !      IF( lk_mpp )   CALL mpp_sum( zsal , jpnfl )
235      !
236      !      IF (lwp) THEN
237      !         WRITE(numflo) ztemp, zsal
238      !      ENDIF
239      !! ... next level jk
240      !      END DO
241      !! ... reset nwflo to 0 for ALL processors, if profile has been written
242      !!       nwflo = 0
243      !      ENDIF
244      !!
245      !      CALL flush (numflo)
246      !! ... time of dumping floats
247      !!      END IF
248      ENDIF
249     
250      IF( (MOD(kt,nstockfl) == 0) .OR. ( kt == nitend ) ) THEN 
251         ! Writing the restart file
252         IF(lwp) THEN
253            WRITE(numout,*)
254            WRITE(numout,*) 'flo_wri : write in  restart_float file '
255            WRITE(numout,*) '~~~~~~~    '
256         ENDIF
257
258         ! file is opened and closed every time it is used.
259
260         clname = 'restart.float.'
261         ic = 1
262         DO jc = 1, 16
263            IF( cexper(jc:jc) /= ' ' ) ic = jc
264         END DO
265         clname = clname(1:14)//cexper(1:ic)
266         ic = 1
267         DO jc = 1, 48
268            IF( clname(jc:jc) /= ' ' ) ic = jc
269         END DO
270
271         CALL ctlopn( inum, clname, 'UNKNOWN', 'FORMATTED', 'SEQUENTIAL',   &
272            &           1, numout, .FALSE., 0 )
273         REWIND inum
274         !
275         DO jpn = 1, jpnij
276            iproc(jpn) = 0
277         END DO
278         !
279         IF(lwp) THEN
280            REWIND(inum)
281            WRITE (inum) tpifl,tpjfl,tpkfl,nisobfl,ngrpfl
282            CLOSE (inum) 
283         ENDIF
284         !
285         ! Compute the number of trajectories for each processor
286         !
287         IF( lk_mpp ) THEN
288            DO jfl = 1, jpnfl
289               IF( (INT(tpifl(jfl)) >= (mig(nldi)-jpizoom+1)) .AND.   &
290                  &(INT(tpifl(jfl)) <= (mig(nlei)-jpizoom+1)) .AND.   &
291                  &(INT(tpjfl(jfl)) >= (mjg(nldj)-jpjzoom+1)) .AND.   &
292                  &(INT(tpjfl(jfl)) <= (mjg(nlej)-jpjzoom+1)) ) THEN
293                  iproc(narea) = iproc(narea)+1
294               ENDIF
295            END DO
296            CALL mpp_sum( iproc, jpnij )
297            !
298            IF(lwp) THEN
299               WRITE(numout,*) 'DATE',adatrj
300               DO jpn = 1, jpnij
301                  IF( iproc(jpn) /= 0 ) THEN
302                     WRITE(numout,*)'PROCESSOR',jpn-1,'compute',iproc(jpn), 'trajectories.'
303                  ENDIF
304               END DO
305            ENDIF
306         ENDIF
307      ENDIF
308
309   END SUBROUTINE flo_wri
310
311#  else
312   !!----------------------------------------------------------------------
313   !!   Default option                                         Empty module
314   !!----------------------------------------------------------------------
315CONTAINS
316   SUBROUTINE flo_wri                 ! Empty routine
317   END SUBROUTINE flo_wri
318#endif
319   
320   !!======================================================================
321END MODULE flowri
Note: See TracBrowser for help on using the repository browser.