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 @ 3

Last change on this file since 3 was 3, checked in by opalod, 20 years ago

Initial revision

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