Oasis3 4.0.2
chkfld.f
Go to the documentation of this file.
00001       SUBROUTINE chkfld (cdname, cdlab, pfild, kmask, psurf, 
00002      $    ksize, klon, kflag)
00003 C****
00004 C               *****************************
00005 C               * OASIS ROUTINE  -  LEVEL 0 *
00006 C               * -------------     ------- *
00007 C               *****************************
00008 C
00009 C**** *chkfld*  - Perform basic checks on a given field array
00010 C
00011 C     Purpose:
00012 C     -------
00013 C     Calculate mean and extremum values of a real array
00014 C
00015 C**   Interface:
00016 C     ---------
00017 C       *CALL*  *chkfld (cdname, cdlab, pfild, kmask, psurf, ksize, klon,
00018 C                        kflag)*
00019 C
00020 C     Input:
00021 C     -----
00022 C                cdname : symbolic name of the field to be checked
00023 C                cdlab  : definition of the field to be checked
00024 C                pfild  : field array (real 1D)
00025 C                kmask  : associated mask array (integer 1D)
00026 C                psurf  : surface array (real 1D)
00027 C                ksize  : field array dimension
00028 C                klon   : number of longitudes
00029 C                kflag  : flag to compute integral of field
00030 C     
00031 C     Output:
00032 C     ------
00033 C     None
00034 C
00035 C     Workspace:
00036 C     ---------
00037 C     None
00038 C
00039 C     Externals:
00040 C     ---------
00041 C     ssumr, rmaxim, rminim
00042 C
00043 C     Reference:
00044 C     ---------
00045 C     See OASIS manual (1995) 
00046 C
00047 C     History:
00048 C     -------
00049 C       Version   Programmer     Date      Description
00050 C       -------   ----------     ----      -----------  
00051 C       2.1       L. Terray      96/09/25  created
00052 C       2.3       S. Valcke      99/04/30  added: printing levels
00053 C
00054 C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00055 C
00056 C* ---------------------------- Include files ---------------------------
00057 C
00058       USE mod_unit
00059       USE mod_printing
00060 C
00061 C* ---------------------------- Argument declarations -------------------
00062 C
00063       IMPLICIT NONE
00064       EXTERNAL ssumr, rminim, rmaxim
00065       INTEGER (kind=ip_intwp_p) ksize 
00066       REAL (kind=ip_realwp_p) pfild(ksize), psurf(ksize)
00067       REAL (kind=ip_realwp_p) zmean, zglomax, zglomin, zmer, zmermax
00068       REAL (kind=ip_realwp_p) zmermin, zterre, zsolmax, zsolmin
00069       REAL (kind=ip_realwp_p) ztmp, zglo, zsea, zland
00070       REAL (kind=ip_realwp_p) ssumr, rminim, rmaxim
00071       INTEGER (kind=ip_intwp_p) iiglomax, ijglomax, iiglomin 
00072       INTEGER (kind=ip_intwp_p) ijglomin, imer, iimermax, ijmermax
00073       INTEGER (kind=ip_intwp_p) iimermin, ijmermin, iterre, iisolmax 
00074       INTEGER (kind=ip_intwp_p) ijsolmax, iisolmin, ijsolmin
00075       INTEGER (kind=ip_intwp_p) klon, jn, iflag, isolmin, isolmax
00076       INTEGER (kind=ip_intwp_p) imermin, imermax, ji, kflag
00077       INTEGER (kind=ip_intwp_p) iglomin, iglomax   
00078       INTEGER (kind=ip_intwp_p) kmask(ksize)
00079       CHARACTER*8 cdname
00080       CHARACTER*32 cdlab
00081 C
00082 C* ---------------------------- Poema verses ----------------------------
00083 C
00084 C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00085 C
00086 C*    1. Initializations
00087 C        ---------------
00088 C
00089       IF (nlogprt .GE. 2) THEN
00090           WRITE (UNIT = nulou,FMT = *) ' '
00091           WRITE (UNIT = nulou,FMT = *) ' '
00092           WRITE (UNIT = nulou,FMT = *) 
00093      $    '           ROUTINE chkfld  -  Level 0'
00094           WRITE (UNIT = nulou,FMT = *) 
00095      $    '           **************     *******'
00096           WRITE (UNIT = nulou,FMT = *) ' '
00097           WRITE (UNIT = nulou,FMT = 1010) cdname, cdlab
00098           WRITE (UNIT = nulou,FMT = *) ' '
00099           WRITE (UNIT = nulou,FMT = *) ' '
00100           CALL FLUSH(nulou)
00101       ENDIF
00102 C
00103 C* Initialization of counters and sums
00104 C
00105       iterre = 0
00106       imer = 0
00107       zmean = 0.0
00108       zterre = 0.0
00109       zmer = 0.0
00110 C
00111 C* Formats
00112 C
00113  1010 FORMAT(5X,' Field alias name is = ',A8,
00114      $     /,5X,' Its definition is   = ',A32)
00115 C
00116 C
00117 C*    2. Basic checks
00118 C        ------------
00119 C
00120 C* Calculate the mean; first the global one
00121 C
00122       IF (ksize .GT. 0) THEN 
00123           zmean = ssumr (pfild, ksize) / float(ksize)
00124         ELSE
00125           WRITE(UNIT = nulou,FMT = 2010)
00126           CALL HALTE('STOP in chkfld')
00127       ENDIF 
00128 C
00129 C* The other ones
00130 C
00131       DO 210 jn = 1, ksize
00132         IF (kmask(jn) .EQ. 0) THEN
00133             imer = imer + 1
00134             zmer = zmer + pfild(jn)
00135         ELSE IF (kmask(jn) .EQ. 1) THEN
00136             iterre = iterre + 1
00137             zterre = zterre + pfild(jn)
00138         ENDIF 
00139  210  CONTINUE 
00140       IF (imer .GT. 0) THEN 
00141           zmer = zmer / float(imer)
00142       ELSE
00143          WRITE(UNIT = nulou,FMT = 2020)
00144          CALL HALTE('STOP in chkfld')
00145       ENDIF 
00146       IF (iterre .GT. 0) THEN 
00147           zterre = zterre / float(iterre)
00148       ELSE
00149          WRITE(UNIT = nulou,FMT = 2030)
00150       ENDIF 
00151 C
00152 C* Calculate extrema
00153 C
00154       iflag = 0
00155       zglomin = rminim (pfild, kmask, ksize, iglomin, iflag)
00156       zglomax = rmaxim (pfild, kmask, ksize, iglomax, iflag)
00157 C* Indexes for minimum
00158       IF (mod(iglomin,klon) .EQ. 0) THEN
00159           ijglomin = iglomin / klon
00160           iiglomin = klon
00161         ELSE 
00162           ztmp = float(iglomin/klon)
00163           ijglomin = int(ztmp) + 1
00164           iiglomin = iglomin - (ijglomin -1) * klon
00165       ENDIF
00166 C* Indexes for maximum
00167       IF (mod(iglomax,klon) .EQ. 0) THEN
00168           ijglomax = iglomax / klon
00169           iiglomax = klon
00170         ELSE 
00171           ztmp = float(iglomax/klon)
00172           ijglomax = int(ztmp) + 1
00173           iiglomax = iglomax - (ijglomax -1) * klon
00174       ENDIF
00175 C
00176 C* Land
00177 C
00178       iflag = 1
00179       zsolmin = rminim (pfild, kmask, ksize, isolmin, iflag)
00180       zsolmax = rmaxim (pfild, kmask, ksize, isolmax, iflag)
00181 C* Indexes for minimum
00182       IF (mod(isolmin,klon) .EQ. 0) THEN
00183           ijsolmin = isolmin / klon
00184           iisolmin = klon
00185         ELSE 
00186           ztmp = float(isolmin/klon)
00187           ijsolmin = int(ztmp) + 1
00188           iisolmin = isolmin - (ijsolmin -1) * klon
00189       ENDIF
00190 C* Indexes for maximum
00191       IF (mod(isolmax,klon) .EQ. 0) THEN
00192           ijsolmax = isolmax / klon
00193           iisolmax = klon
00194         ELSE 
00195           ztmp = float(isolmax/klon)
00196           ijsolmax = int(ztmp) + 1
00197           iisolmax = isolmax - (ijsolmax -1) * klon
00198       ENDIF
00199 C
00200 C* Sea
00201 C
00202       iflag = 2
00203       zmermin = rminim (pfild, kmask, ksize, imermin, iflag)
00204       zmermax = rmaxim (pfild, kmask, ksize, imermax, iflag)
00205 C* Indexes for minimum
00206       IF (mod(imermin,klon) .EQ. 0) THEN
00207           ijmermin = imermin / klon
00208           iimermin = klon
00209         ELSE 
00210           ztmp = float(imermin/klon)
00211           ijmermin = int(ztmp) + 1
00212           iimermin = imermin - (ijmermin -1) * klon
00213       ENDIF
00214 C* Indexes for maximum
00215       IF (mod(imermax,klon) .EQ. 0) THEN
00216           ijmermax = imermax / klon
00217           iimermax = klon
00218         ELSE 
00219           ztmp = float(imermax/klon)
00220           ijmermax = int(ztmp) + 1
00221           iimermax = imermax - (ijmermax -1) * klon
00222       ENDIF
00223 C
00224 C* Print results
00225 C
00226       WRITE(UNIT = nulou,FMT = 2040) cdname
00227       WRITE(UNIT = nulou,FMT = 2050)
00228       WRITE(UNIT = nulou,FMT = 2060) zmean, 
00229      $    zglomax, iiglomax, ijglomax,
00230      $    zglomin, iiglomin, ijglomin,
00231      $    imer, zmer, 
00232      $    zmermax, iimermax, ijmermax,
00233      $    zmermin, iimermin, ijmermin,
00234      $    iterre, zterre, 
00235      $    zsolmax, iisolmax, ijsolmax,
00236      $    zsolmin, iisolmin, ijsolmin
00237 C
00238 C* Formats
00239 C
00240  2010 FORMAT(' WARNING: total number of points .LE. 0 ')
00241  2020 FORMAT(' WARNING: number of non-masked points .LE. 0 ')
00242  2030 FORMAT(' WARNING: number of masked points .LE. 0 ')
00243  2040 FORMAT(/,15X,'  Field checks: ',A8)
00244  2050 FORMAT(15X,'  ************  ',/)
00245  2060 FORMAT(/,10X,'  Global average     = ',E22.7,
00246      $       /,10X,'  Global maximum     = ',E22.7,
00247      $    '  Pt i-j = ',I3,2X,I3,
00248      $       /,10X,'  Global minimum     = ',E22.7,
00249      $    '  Pt i-j = ',I3,2X,I3,
00250      $       /,10X,'  Ocean grid points  = ',I6,
00251      $       /,10X,'  Ocean  average     = ',E22.7,
00252      $       /,10X,'  Ocean  maximum     = ',E22.7,
00253      $    '  Pt i-j = ',I3,2X,I3,
00254      $       /,10X,'  Ocean  minimum     = ',E22.7,
00255      $    '  Pt i-j = ',I3,2X,I3,
00256      $       /,10X,'  Land grid points   = ',I6,
00257      $       /,10X,'  Land  average      = ',E22.7,
00258      $       /,10X,'  Land  maximum      = ',E22.7,
00259      $    '  Pt i-j = ',I3,2X,I3,
00260      $       /,10X,'  Land  minimum      = ',E22.7,
00261      $    '  Pt i-j = '
00262      $    ,I3,2X,I3,/)
00263 C
00264 C
00265 C*    3. Calculate integral of current field if needed
00266 C        ------------------------------------------------------
00267 C
00268       IF (kflag .EQ. 1) THEN
00269           zglo = 0.0
00270           zsea = 0.0
00271           zland = 0.0
00272 C
00273 C* The integral is performed on all and unmasked points
00274 C
00275           DO 310 ji = 1, ksize
00276             zsea = zsea + pfild(ji) * psurf(ji) * float(1 - kmask(ji))
00277             zland = zland + pfild(ji) * psurf(ji) * float(kmask(ji))
00278             zglo = zglo + pfild(ji) * psurf(ji)
00279  310      CONTINUE 
00280           WRITE(UNIT = nulou,FMT = 3010)  zglo, zsea, zland       
00281       ENDIF
00282 C
00283 C* Formats
00284 C 
00285  3010 FORMAT(/,10X,'  Earth integral       = ',E22.7,
00286      $       /,10X,'  Ocean integral       = ',E22.7,
00287      $       /,10X,'  Land  integral       = ',E22.7)
00288 C
00289 C
00290 C*    4. End of routine
00291 C        --------------
00292 C
00293       IF (nlogprt .GE. 2) THEN
00294           WRITE (UNIT = nulou,FMT = *) ' '
00295           WRITE (UNIT = nulou,FMT = *) 
00296      $    '          ---------- End of ROUTINE chkfld --------'
00297           CALL FLUSH (nulou)
00298       ENDIF
00299       RETURN
00300       END
00301 
00302 
 All Data Structures Namespaces Files Functions Variables Defines