source: CPL/oasis3/trunk/src/mod/oasis3/src/fiasco.f @ 1677

Last change on this file since 1677 was 1677, checked in by aclsce, 12 years ago

Imported oasis3 (tag ipslcm5a) from cvs server to svn server (igcmg project).

File size: 17.2 KB
Line 
1      SUBROUTINE fiasco (poutp, ptlon, ptlat, ptsurf,
2     $                   ktmsk, ktlon, ktlat, cdtper, ktper,
3     $                   pinpt, pslon, pslat, pssurf,
4     $                   ksmsk, kslon, kslat, cdsper, ksper,
5     $                   plonz, platz, psgrb, psgra, psfrb, psfra,
6     $                   kfield, cdint, cdtyp, cddim)
7C****
8C               *****************************
9C               * OASIS ROUTINE  -  LEVEL 3 *
10C               * -------------     ------- *
11C               *****************************
12C
13C**** *fiasco* - Interpolation driver
14C
15C     Purpose:
16C     -------
17C     Interpolation from source grid to target grid
18C     Use Fast Scalar Interpolator (FSCINT) package from Yves Chartier
19C     or ANAIS software from Olivier Thual et al.
20C
21C**   Interface:
22C     ---------
23C       *CALL*  *fiasco* (poutp, ptlon, ptlat, ptsurf,
24C                         ktmsk, ktlon, ktlat, cdtper, ktper,
25C                         pinpt, pslon, pslat, pssurf,
26C                         ksmsk, kslon, kslat, cdsper, ksper,
27C                         plonz, platz, psgrb, psgra, psfrb, psfra,
28C                         kfield, cdint, cdtyp, cddim)*
29C
30C     Input:
31C     -----
32C                ptlon  : longitudes of target grid (real 2D)
33C                ptlat  : latitudes of target grid (real 2D)
34C                ptsurf : target grid square surfaces (real 2D)
35C                ktmsk  : mask of target grid (integer 2D)
36C                ktlon  : number of longitudes for target grid
37C                ktlat  : number of latitudes for target grid
38C                cdtper : target grid periodicity
39C                ktper  : number of overlapped points for target grid
40C                pinpt  : input field on source grid (real 2D)
41C                pslon  : longitudes of source grid (real 2D)
42C                pslat  : latitudes of source grid (real 2D)
43C                pssurf : source grid square surfaces (real 2D)
44C                ksmsk  : mask of source grid (integer 2D)
45C                kslon  : number of longitudes for source grid
46C                kslat  : number of latitudes for source grid
47C                cdsper : source grid periodicity
48C                ksper  : number of overlapped points for source grid
49C                kfield : current field number
50C                cdint  : type of interpolation to be performed
51C                cdtyp  : type of source grid
52C                cddim  : type of field (scalar or vector)
53C
54C     Output:
55C     ------
56C                poutp : output field on target grid (real 2D)
57C
58C     Workspace:
59C     ---------
60C     These are work arrays passed as arguments :
61C     plonz, platz, psgrb, psgra, psfrb, psfra 
62C
63C     Externals:
64C     ---------
65C     rgoptc, rgoptr, namset, nagset, cxgaig, igscint, namsst,
66C     nagsst, naflux.
67C
68C     Reference:
69C     ---------
70C     See OASIS manual (1995)
71C
72C     History:
73C     -------
74C       Version   Programmer     Date      Description
75C       -------   ----------     ----      ----------- 
76C       1.0       L. Terray      94/01/01  created
77C       1.1       L. Terray      94/08/01  modified: interpolation differ
78C                                          for scalar or vector in fscint
79C       2.0       L. Terray      95/12/15  modified: new structure
80C       2.2       L. Terray      97/11/28  added: grid type A,B,L in fscint
81C       2.3       L. Terray      99/03/01  corrected: calls to na(g-m)sst with
82C                                          inclusion of pointer ipdeb
83C       2.3       S. Valcke      99/04/30  added: printing levels
84C       2.3       L. Terray      99/08/11  modified: fscint extrapolation
85C                                          for periodic Z grids
86C       2.3       L. Terray      99/09/15  changed periodicity variables
87C
88C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
89C
90C* ---------------- Include files and USE of modules---------------------------
91C
92      USE mod_kinds_oasis
93      USE mod_anais
94      USE mod_parameter
95      USE mod_timestep
96      USE mod_unit
97      USE mod_printing
98CAC
99      USE mod_intbi
100      USE mod_intlin
101CAC
102C
103C* ---------------------------- Argument declarations -------------------
104C
105      REAL (kind=ip_realwp_p) poutp(ktlon,ktlat), 
106     $    ptlon(ktlon,ktlat), ptlat(ktlon,ktlat)
107      REAL (kind=ip_realwp_p) pinpt(kslon,kslat), 
108     $    pslon(kslon,kslat), pslat(kslon,kslat)
109      REAL (kind=ip_realwp_p) pssurf(kslon,kslat), 
110     $    ptsurf(ktlon,ktlat)
111      REAL (kind=ip_realwp_p) plonz(ktlon), platz(ktlat), 
112     $    psgrb(kslon,kslat),
113     $     psgra(ktlon,ktlat), psfrb(kslon,kslat), psfra(ktlon,ktlat)
114      INTEGER (kind=ip_intwp_p) ktmsk(ktlon,ktlat), ksmsk(kslon,kslat)
115      CHARACTER*8 cdsper, cdtper
116C
117C* ---------------------------- Local declarations ----------------------
118C
119      CHARACTER*1 cdtyp, clref, cltyp
120      CHARACTER*6 cddim, cldim
121      CHARACTER*8 cdint, clord, clflg, clind
122      LOGICAL llinit, llsym
123C
124C* ---------------------------- Poema verses ----------------------------
125C
126C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
127C
128C*    1. Initialization
129C        --------------
130C
131      IF (nlogprt .GE. 2) THEN
132          WRITE (UNIT = nulou,FMT = *) ' '
133          WRITE (UNIT = nulou,FMT = *) ' '
134          WRITE (UNIT = nulou,FMT = *) 
135     $    '           ROUTINE fiasco  -  Level 3'
136          WRITE (UNIT = nulou,FMT = *) 
137     $    '           **************     *******'
138          WRITE (UNIT = nulou,FMT = *) ' '
139          WRITE (UNIT = nulou,FMT = *) 
140     $    ' Interpolation package driving routine'
141          WRITE (UNIT = nulou,FMT = *) ' '
142          WRITE (UNIT = nulou,FMT = *) ' '
143      ENDIF
144C
145C* Assign local value to grid and field type variables to deal 
146C  with FSCINT set-up
147C
148      cltyp = cdtyp
149      cldim = cddim
150C
151C * Set up interpolation method
152C
153      IF (TRIM(cdint) == 'BICUBIPS' .OR. TRIM(cdint) == 'BILINIPS') THEN
154          IF ( cltyp == 'Z' .AND. TRIM(cdsper) == 'P' ) THEN
155              plonz = pslon ( :, kslat/2)
156              platz = pslat ( 1, :)
157              clflg='IPSL'
158          ELSE
159              WRITE (UNIT = nulou,FMT = *) ' '
160              WRITE (UNIT = nulou,FMT = *) 
161     $            'BICUBIPS and BILINIPS works ONLY',
162     $            ' with Z grid and P periodicity'
163              WRITE (UNIT = nulou,FMT = *) ' '
164              CALL HALTE ('STOP in fiasco')
165          ENDIF
166          IF ( cldim == 'VECTOR' ) THEN
167              IF (TRIM(cdint) == 'BICUBIPS') THEN
168                  WRITE(UNIT = nulou, FMT= *)
169     $                'Using intbi, vector mode'
170                  CALL intbi ( pinpt, plonz, platz, kslon, kslat
171     $                ,    poutp, ptlon, ptlat, ktlon*ktlat
172     $                ,    .TRUE.)
173              ENDIF
174              IF (TRIM(cdint) == 'BILINIPS') THEN
175                  WRITE(UNIT = nulou, FMT= *)
176     $                'Using intlin, vector mode'
177                  CALL intlin ( pinpt, plonz, platz, kslon, kslat
178     $                ,    poutp, ptlon, ptlat, ktlon*ktlat
179     $                ,    .TRUE.)
180              ENDIF
181          ELSE
182              IF (TRIM(cdint) == 'BICUBIPS') THEN
183                 WRITE(UNIT = nulou, FMT= *)
184     $                'Using intbi, scalar mode'
185                  CALL intbi ( pinpt, plonz, platz, kslon, kslat
186     $                ,    poutp, ptlon, ptlat, ktlon*ktlat
187     $                ,    .FALSE.)
188              ENDIF
189              IF (TRIM(cdint) == 'BILINIPS') THEN
190                  WRITE(UNIT = nulou, FMT= *)
191     $                'Using intlin, scalar mode'
192                  CALL intlin ( pinpt, plonz, platz, kslon, kslat
193     $                ,    poutp, ptlon, ptlat, ktlon*ktlat
194     $                ,    .FALSE.)
195              ENDIF
196          ENDIF
197          RETURN
198C
199        ELSE IF (TRIM(cdint) .EQ. 'BILINEAR') THEN
200          clflg = 'FSCINT'
201          CALL rgoptc('INTERP', 'LINEAIR', .TRUE.)
202        ELSEIF (TRIM(cdint) .EQ. 'BICUBIC') THEN
203          clflg = 'FSCINT'
204          CALL rgoptc('INTERP', 'CUBIQUE', .TRUE.)
205        ELSEIF (TRIM(cdint) .eq. 'NNEIBOR') THEN
206          clflg = 'FSCINT'
207          CALL rgoptc('INTERP', 'VOISIN', .TRUE.)
208        ELSEIF (TRIM(cdint) .EQ. 'SURFMESH') THEN
209          clflg = 'ANAISM'
210          llinit = linit(kfield)
211        ELSEIF (TRIM(cdint) .EQ. 'GAUSSIAN') THEN
212          clflg = 'ANAISG'
213          llinit = linit(kfield)
214        ELSE
215          WRITE (UNIT = nulou,FMT = *) '         ***WARNING***'
216          WRITE (UNIT = nulou,FMT = *) 
217     $           ' ===>>>> : unknown kind of interpolator'
218          WRITE (UNIT = nulou,FMT = *) 
219     $           ' =======                   ============'
220          WRITE (UNIT = nulou,FMT = *) 
221     $           '                     --->>>  CDINT = ',cdint
222          WRITE (UNIT = nulou,FMT = *) ' '
223          WRITE (UNIT = nulou,FMT = *) 
224     $        ' We STOP!!! check variable syntax '
225          WRITE (UNIT = nulou,FMT = *) ' '
226          CALL HALTE ('STOP in fiasco')
227      ENDIF
228      IF (clflg .eq. 'FSCINT') THEN
229          CALL rgoptc('INTERP', clord, .FALSE.)
230        ELSEIF (clflg .EQ. 'ANAISM') THEN
231          clord = 'SURFMESH'
232        ELSEIF (clflg .EQ. 'ANAISG') THEN
233          clord = 'GAUSSIAN'
234        ELSE
235          clord ='UNKNOWN'
236      ENDIF
237      IF (nlogprt .GE. 2) THEN
238          CALL prcout
239     $    ('Current interpolator is clord = ', clord, 1)
240      ENDIF
241C
242C* set up value to be given in case of extrapolation in fscint
243C
244      IF (clflg .eq. 'FSCINT') THEN
245          IF (cltyp .EQ. 'Z') THEN
246C
247C* No extrapolation for Z grids (global grid)
248C
249              CALL rgoptc ('EXTRAP', 'OUI', .TRUE.)
250          ELSE
251              CALL rgoptc ('EXTRAP', 'VOISIN', .TRUE.)
252          ENDIF
253          CALL rgoptc ('EXTRAP', clind , .false.)
254          IF (nlogprt .GE. 2) THEN
255              CALL prcout
256     $        ('Current extrapolation in FSCINT is clind =', clind, 1)
257          ENDIF
258      ENDIF
259C
260C* set up grid descriptors for fscint interpolator
261C
262      IF (clflg .eq. 'FSCINT') THEN
263          IF (cltyp .EQ. 'Z' .OR. cltyp .EQ. 'Y') THEN
264C
265C* here ig* descriptors are arbitrary (date of louis XVI's death)
266C
267              ig1 = 21
268              ig2 = 0
269              ig3 = 1
270              ig4 = 1793
271              zdllg = 1.0
272              zdllt = 1.0
273              zlgin = 0.0
274              zltin = 0.0
275              clref = 'L'
276              CALL cxgaig (clref, ig1z, ig2z, ig3z, ig4z,
277     $                     zltin, zlgin, zdllt, zdllg)
278              DO 110 ji = 1, kslon
279                plonz(ji) = pslon(ji,1) + 1.0
280 110          CONTINUE
281              DO 120 jj = 1, kslat
282                platz(jj) = pslat(1,jj) + 1.0
283 120          CONTINUE
284            ELSE IF (cltyp .EQ. 'G'.or. cltyp .EQ. 'A'
285     $            .OR. cltyp .EQ. 'B') THEN
286              ig1 = 0
287              ig2 = 0
288              ig3 = 0
289              ig4 = 0
290              llsym = .TRUE.
291            ELSE IF (cltyp .EQ. 'L') THEN
292              zdllt = pslat(1,2) - pslat(1,1)
293              zdllg = pslon(2,1) - pslon(1,1)
294              zlgin = pslon(1,1)
295              zltin = pslat(1,1)
296              CALL cxgaig (cltyp, ig1, ig2, ig3, ig4,
297     $            zltin, zlgin, zdllt, zdllg)
298              llsym = .TRUE.
299            ELSE
300              WRITE (UNIT = nulou,FMT = *) '        ***WARNING***'
301              WRITE (UNIT = nulou,FMT = *)
302     $               ' ===>>> : grid type not implemented yet'
303              WRITE (UNIT = nulou,FMT = *)
304     $               ' ======   ====          ===========    '
305              WRITE (UNIT = nulou,FMT = *)
306     $            '                --->>>  cltyp = ',
307     $                        cltyp
308              WRITE (UNIT = nulou,FMT = *) ' '
309              WRITE (UNIT = nulou,FMT = *)
310     $             ' We STOP    !!! Check source grid type'
311              WRITE (UNIT = nulou,FMT = *) ' '
312              CALL HALTE ('STOP in fiasco')
313          ENDIF
314        ELSEIF (clflg .eq. 'ANAISM') THEN
315          IF (llinit) THEN
316C
317C* Mask values for both models
318C
319              ismsq = 1
320              itmsq = 1
321C
322C* If no intersection, give value imesh to nmesh array element
323C
324              imesh = 0
325              iwlun = nulcc
326C
327C* Get pointers for ANAISM interpolator parameters
328C
329              ipdeb = (naismfl(kfield)-1)*ig_maxwoa*ig_maxgrd+1
330              isdeb = (naismfl(kfield)-1)*ig_maxgrd+1
331C
332C* Set up surfmesh interpolation
333C
334              CALL namset (pslon, pslat, ksmsk, ismsq, kslon, kslat,
335     $                     cdsper, ksper,
336     $                     ptlon, ptlat, ktmsk, itmsq, ktlon, ktlat,
337     $                     cdtper, ktper, 
338     $                     cltyp,
339C
340C* Specific ANAISM parameters
341C
342     $                     amint(ipdeb), 
343     $                     nmint(ipdeb),
344     $                     naismvoi(kfield), psgrb, psgra,
345     $                     niwtm(kfield), iwlun, imesh,
346     $                     nmesh(isdeb), 
347     $                     naismfl(kfield))
348C
349C* Switch initialization flag
350C
351              linit(kfield) = .FALSE. 
352          ENDIF
353        ELSEIF (clflg .eq. 'ANAISG') THEN
354          IF (llinit) THEN
355              ismsq = 1
356              itmsq = 1
357              iwlun = nulgg
358C
359C* Get pointers for Anaisg interpolator parameters
360C
361              ipdeb = (naisgfl(kfield)-1)*ig_maxnoa*ig_maxgrd+1
362              CALL nagset (pslon, pslat, pssurf, 
363     $                     ksmsk, ismsq, kslon, kslat,
364     $                     ptlon, ptlat, ptsurf, 
365     $                     ktmsk, itmsq, ktlon, ktlat,
366     $                     cltyp,
367C
368C* Specific Anaisg parameters
369C
370     $                     agint(ipdeb),
371     $                     ngint(ipdeb),
372     $                     naisgvoi(kfield), psfrb, psfra,
373     $                     varmul(kfield), niwtg(kfield), iwlun, 
374     $                     naisgfl(kfield))
375C
376C* Switch off initialization flag
377C
378              linit(kfield) = .FALSE. 
379          ENDIF
380        ELSE
381          WRITE (UNIT = nulou,FMT = *) '        ***WARNING***'
382          WRITE (UNIT = nulou,FMT = *) 
383     $           ' ===>>> : unknown interpolation package'
384          WRITE (UNIT = nulou,FMT = *) 
385     $           ' ======   =======               ======='
386          WRITE (UNIT = nulou,FMT = *) 
387     $        '                    --->>>  clflg = ',
388     $                        clflg
389          WRITE (UNIT = nulou,FMT = *) ' '
390          WRITE (UNIT = nulou,FMT = *) 
391     $           ' We STOP        !!! Check interpolation package'
392          WRITE (UNIT = nulou,FMT = *) ' '
393          CALL HALTE ('STOP in fiasco')
394      ENDIF
395C
396C
397C*    2. Interpolation
398C        -------------
399C
400      IF (clflg .eq. 'FSCINT') THEN
401          IF (cltyp .eq. 'Z' .OR. cltyp .EQ. 'Y') THEN
402              CALL igscint (poutp, ktlon, ktlat, ptlat, ptlon,
403     $                      pinpt, kslon, kslat, cltyp, clref,
404     $                      ig1z, ig2z, ig3z, ig4z, .true.,
405     $                      plonz, platz, cldim)
406          ELSEIF (cltyp .eq. 'G'.or. cltyp .eq. 'A'
407     $            .OR. cltyp .eq. 'B'.or. cltyp .eq. 'L') THEN
408              CALL rgscint (poutp, ktlon, ktlat, ptlat, ptlon,
409     $                      pinpt, kslon, kslat, cltyp,
410     $                      ig1, ig2, ig3, ig4, llsym, cldim)
411          ELSE
412              WRITE (UNIT = nulou,FMT = *) '        ***WARNING***'
413              WRITE (UNIT = nulou,FMT = *) 
414     $               ' ===>>> grid type not implemented yet'
415              WRITE (UNIT = nulou,FMT = *) 
416     $               ' ====== ====          ===========    '
417              WRITE (UNIT = nulou,FMT = *) 
418     $            '                --->>>  cltyp = ',
419     $                        cltyp
420              WRITE (UNIT = nulou,FMT = *) ' '
421              WRITE (UNIT = nulou,FMT = *) 
422     $             ' WE STOP    !!! check source grid type'
423              WRITE (UNIT = nulou,FMT = *) ' '
424              CALL HALTE ('STOP in fiasco')         
425          ENDIF
426        ELSEIF (clflg .eq. 'ANAISM') THEN
427          itmsq = 1
428          ipdeb = (naismfl(kfield)-1)*ig_maxwoa*ig_maxgrd+1
429          CALL namsst (poutp, ktmsk, itmsq, ktlon, ktlat,
430     $                 amint(ipdeb), nmint(ipdeb), naismvoi(kfield),
431     $                 pinpt, kslon, kslat)
432        ELSEIF (clflg .eq. 'ANAISG') THEN
433          itmsq = 1
434          ipdeb = (naisgfl(kfield)-1)*ig_maxnoa*ig_maxgrd+1
435          CALL nagsst (poutp, ktmsk, itmsq, ktlon, ktlat,
436     $                 agint(ipdeb), ngint(ipdeb), naisgvoi(kfield),
437     $                 pinpt, kslon, kslat)
438        ELSE
439          WRITE (UNIT = nulou,FMT = *) '        ***WARNING***'
440          WRITE (UNIT = nulou,FMT = *) 
441     $           ' ===>>> : unknown interpolation package'
442          WRITE (UNIT = nulou,FMT = *) 
443     $           ' ======   =======               ======='
444          WRITE (UNIT = nulou,FMT = *) 
445     $           '                      --->>>  clflg = ',
446     $                        clflg
447          WRITE (UNIT = nulou,FMT = *) ' '
448          WRITE (UNIT = nulou,FMT = *) 
449     $           ' We STOP        !!! Check interpolation package'
450          WRITE (UNIT = nulou,FMT = *) ' '
451          CALL HALTE ('STOP in fiasco') 
452      ENDIF
453C
454C
455C*    3. End of routine
456C        --------------
457C
458      IF (nlogprt .GE. 2) THEN
459          WRITE (UNIT = nulou,FMT = *) ' '
460          WRITE (UNIT = nulou,FMT = *) 
461     $    '          --------- End of routine fiasco ---------'
462          CALL FLUSH (nulou)
463      ENDIF
464      RETURN
465      END
Note: See TracBrowser for help on using the repository browser.