Ignore:
Timestamp:
Jul 24, 2024, 2:54:37 PM (4 months ago)
Author:
abarral
Message:

rename modules properly lmdz_*
move ismin, ismax, minmax into new lmdz_libmath.f90
(lint) uppercase fortran keywords

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/Amaury_dev/libf/dyn3d_common/inter_barxy_m.F90

    r5113 r5116  
    1 
    21! $Id$
    32
     
    1514  SUBROUTINE inter_barxy(dlonid, dlatid, champ, rlonimod, rlatimod, champint)
    1615
    17     use lmdz_assert_eq, only: assert_eq
    18     use lmdz_assert, only: assert
     16    use lmdz_assert_eq, ONLY: assert_eq
     17    use lmdz_assert, ONLY: assert
    1918
    2019    include "dimensions.h"
     
    2726    ! (for "aire", "apoln", "apols")
    2827
    29     REAL, intent(in):: dlonid(:)
     28    REAL, intent(in) :: dlonid(:)
    3029    ! (longitude from input file, in rad, from -pi to pi)
    3130
    32     REAL, intent(in):: dlatid(:), champ(:, :), rlonimod(:)
    33 
    34     REAL, intent(in):: rlatimod(:)
     31    REAL, intent(in) :: dlatid(:), champ(:, :), rlonimod(:)
     32
     33    REAL, intent(in) :: rlatimod(:)
    3534    ! (latitude angle, in degrees or rad, in strictly decreasing order)
    3635
    37     real, intent(out):: champint(:, :)
     36    real, intent(out) :: champint(:, :)
    3837    ! Si taille de la seconde dim = jjm + 1, on veut interpoler sur les
    3938    ! jjm+1 latitudes rlatu du modele (latitudes des scalaires et de U)
     
    5554
    5655    jnterfd = assert_eq(size(champ, 2) - 1, size(dlatid), &
    57          "inter_barxy jnterfd")
     56            "inter_barxy jnterfd")
    5857    jmods = size(champint, 2)
    5958    CALL assert(size(champ, 1) == size(dlonid), "inter_barxy size(champ, 1)")
    6059    CALL assert((/size(rlonimod), size(champint, 1)/) == iim, &
    61          "inter_barxy iim")
     60            "inter_barxy iim")
    6261    CALL assert(any(jmods == (/jjm, jjm + 1/)), 'inter_barxy jmods')
    6362    CALL assert(size(rlatimod) == jjm, "inter_barxy size(rlatimod)")
     
    6564    ! Check decreasing order for "rlatimod":
    6665    DO i = 2, jjm
    67        IF (rlatimod(i) >= rlatimod(i-1)) stop &
    68             '"inter_barxy": "rlatimod" should be strictly decreasing'
     66      IF (rlatimod(i) >= rlatimod(i - 1)) stop &
     67              '"inter_barxy": "rlatimod" should be strictly decreasing'
    6968    ENDDO
    7069
    7170    yjmod(:jjm) = ord_coordm(rlatimod)
    7271    IF (jmods == jjm + 1) THEN
    73        IF (90. - yjmod(jjm) < 0.01) stop &
    74             '"inter_barxy": with jmods = jjm + 1, yjmod(jjm) should be < 90.'
     72      IF (90. - yjmod(jjm) < 0.01) stop &
     73              '"inter_barxy": with jmods = jjm + 1, yjmod(jjm) should be < 90.'
    7574    ELSE
    76        ! jmods = jjm
    77        IF (ABS(yjmod(jjm) - 90.) > 0.01) stop &
    78             '"inter_barxy": with jmods = jjm, yjmod(jjm) should be 90.'
     75      ! jmods = jjm
     76      IF (ABS(yjmod(jjm) - 90.) > 0.01) stop &
     77              '"inter_barxy": with jmods = jjm, yjmod(jjm) should be 90.'
    7978    ENDIF
    8079
     
    8281
    8382    DO j = 1, jnterfd + 1
    84        champy(:, j) = inter_barx(dlonid, champ(:, j), rlonimod)
    85     ENDDO
    86 
    87     CALL ord_coord(dlatid, yjdat, decrois) 
     83      champy(:, j) = inter_barx(dlonid, champ(:, j), rlonimod)
     84    ENDDO
     85
     86    CALL ord_coord(dlatid, yjdat, decrois)
    8887    IF (decrois) champy(:, :) = champy(:, jnterfd + 1:1:-1)
    8988    DO i = 1, iim
    90        champint(i, :) = inter_bary(yjdat, champy(i, :), yjmod)
     89      champint(i, :) = inter_bary(yjdat, champy(i, :), yjmod)
    9190    ENDDO
    9291    champint(:, :) = champint(:, jmods:1:-1)
    9392
    9493    IF (jmods == jjm + 1) THEN
    95        ! Valeurs uniques aux poles
    96        champint(:, 1) = SUM(aire(:iim, 1) * champint(:, 1)) / apoln
    97        champint(:, jjm + 1) = SUM(aire(:iim, jjm + 1) &
    98             * champint(:, jjm + 1)) / apols
     94      ! Valeurs uniques aux poles
     95      champint(:, 1) = SUM(aire(:iim, 1) * champint(:, 1)) / apoln
     96      champint(:, jjm + 1) = SUM(aire(:iim, jjm + 1) &
     97              * champint(:, jjm + 1)) / apols
    9998    ENDIF
    10099
     
    103102  !******************************
    104103
    105   function inter_barx(dlonid, fdat, rlonimod) 
     104  function inter_barx(dlonid, fdat, rlonimod)
    106105
    107106    !        INTERPOLATION BARYCENTRIQUE BASEE SUR LES AIRES
     
    117116    !      ( Les abscisses sont exprimees en degres)
    118117
    119     use lmdz_assert_eq, only: assert_eq
     118    USE lmdz_assert_eq, ONLY: assert_eq
     119    USE lmdz_libmath, ONLY: minmax
    120120
    121121    IMPLICIT NONE
    122122
    123     REAL, intent(in):: dlonid(:)
    124     real, intent(in):: fdat(:)
    125     real, intent(in):: rlonimod(:)
     123    REAL, intent(in) :: dlonid(:)
     124    real, intent(in) :: fdat(:)
     125    real, intent(in) :: rlonimod(:)
    126126
    127127    real inter_barx(size(rlonimod))
     
    130130
    131131    INTEGER idatmax, imodmax
    132     REAL xxid(size(dlonid)+1), xxd(size(dlonid)+1), fdd(size(dlonid)+1)
    133     REAL  fxd(size(dlonid)+1), xchan(size(dlonid)+1), fdchan(size(dlonid)+1)
     132    REAL xxid(size(dlonid) + 1), xxd(size(dlonid) + 1), fdd(size(dlonid) + 1)
     133    REAL  fxd(size(dlonid) + 1), xchan(size(dlonid) + 1), fdchan(size(dlonid) + 1)
    134134    REAL  xxim(size(rlonimod))
    135135
     
    149149    !    A L'INTERFACE OUEST DE LA PREMIERE MAILLE DU MODELE 
    150150    DO imod = 1, imodmax
    151        xxim(imod) = rlonimod(imod)
    152     ENDDO
    153 
    154     CALL minmax( imodmax, xxim, chmin, chmax)
    155     IF( chmax<6.50 )   THEN
    156        DO imod = 1, imodmax
    157           xxim(imod) = xxim(imod) * 180./pi
    158        ENDDO
     151      xxim(imod) = rlonimod(imod)
     152    ENDDO
     153
     154    CALL minmax(imodmax, xxim, chmin, chmax)
     155    IF(chmax<6.50)   THEN
     156      DO imod = 1, imodmax
     157        xxim(imod) = xxim(imod) * 180. / pi
     158      ENDDO
    159159    ENDIF
    160160
     
    162162
    163163    DO imod = 1, imodmax
    164        xxim(imod) = xxim(imod) - xim0
    165     ENDDO
    166 
    167     idatmax1 = idatmax +1
     164      xxim(imod) = xxim(imod) - xim0
     165    ENDDO
     166
     167    idatmax1 = idatmax + 1
    168168
    169169    DO idat = 1, idatmax
    170        xxd(idat) = dlonid(idat)
    171     ENDDO
    172 
    173     CALL minmax( idatmax, xxd, chmin, chmax)
    174     IF( chmax<6.50 )  THEN
    175        DO idat = 1, idatmax
    176           xxd(idat) = xxd(idat) * 180./pi
    177        ENDDO
     170      xxd(idat) = dlonid(idat)
     171    ENDDO
     172
     173    CALL minmax(idatmax, xxd, chmin, chmax)
     174    IF(chmax<6.50)  THEN
     175      DO idat = 1, idatmax
     176        xxd(idat) = xxd(idat) * 180. / pi
     177      ENDDO
    178178    ENDIF
    179179
    180180    DO idat = 1, idatmax
    181        xxd(idat) = MOD( xxd(idat) - xim0, 360. )
    182        fdd(idat) = fdat (idat)
     181      xxd(idat) = MOD(xxd(idat) - xim0, 360.)
     182      fdd(idat) = fdat (idat)
    183183    ENDDO
    184184
    185185    i = 2
    186     DO while (xxd(i) >= xxd(i-1) .and. i < idatmax)
    187        i = i + 1
    188     ENDDO
    189     IF (xxd(i) < xxd(i-1)) THEN
    190        ichang = i
    191        !  ***  reorganisation  des longitudes entre 0. et 360. degres ****
    192        nid = idatmax - ichang +1
    193        DO i = 1, nid
    194           xchan (i) = xxd(i+ichang -1 )
    195           fdchan(i) = fdd(i+ichang -1 )
    196        ENDDO
    197        DO i=1, ichang -1
    198           xchan (i+ nid) = xxd(i)
    199           fdchan(i+nid) = fdd(i)
    200        ENDDO
    201        DO i =1, idatmax
    202           xxd(i) = xchan(i)
    203           fdd(i) = fdchan(i)
    204        ENDDO
     186    DO while (xxd(i) >= xxd(i - 1) .and. i < idatmax)
     187      i = i + 1
     188    ENDDO
     189    IF (xxd(i) < xxd(i - 1)) THEN
     190      ichang = i
     191      !  ***  reorganisation  des longitudes entre 0. et 360. degres ****
     192      nid = idatmax - ichang + 1
     193      DO i = 1, nid
     194        xchan (i) = xxd(i + ichang - 1)
     195        fdchan(i) = fdd(i + ichang - 1)
     196      ENDDO
     197      DO i = 1, ichang - 1
     198        xchan (i + nid) = xxd(i)
     199        fdchan(i + nid) = fdd(i)
     200      ENDDO
     201      DO i = 1, idatmax
     202        xxd(i) = xchan(i)
     203        fdd(i) = fdchan(i)
     204      ENDDO
    205205    end IF
    206206
     
    213213
    214214    DO idat = 1, idatmax
    215        IF ( xxd( idatmax1- idat )<360.) exit
    216        id1 = id1 + 1
     215      IF (xxd(idatmax1 - idat)<360.) exit
     216      id1 = id1 + 1
    217217    ENDDO
    218218
    219219    DO idat = 1, idatmax
    220        IF (xxd(idat)>0.) exit
    221        id0 = id0 + 1
     220      IF (xxd(idat)>0.) exit
     221      id0 = id0 + 1
    222222    END DO
    223223
    224     IF( id1 /= 0 ) then
    225        DO idat = 1, id1
    226           xxid(idat) = xxd(idatmax - id1 + idat) - 360.
    227           fxd (idat) = fdd(idatmax - id1 + idat)     
    228        END DO
    229        DO idat = 1, idatmax - id1
    230           xxid(idat + id1) = xxd(idat)
    231           fxd (idat + id1) = fdd(idat)
    232        END DO
     224    IF(id1 /= 0) THEN
     225      DO idat = 1, id1
     226        xxid(idat) = xxd(idatmax - id1 + idat) - 360.
     227        fxd (idat) = fdd(idatmax - id1 + idat)
     228      END DO
     229      DO idat = 1, idatmax - id1
     230        xxid(idat + id1) = xxd(idat)
     231        fxd (idat + id1) = fdd(idat)
     232      END DO
    233233    end IF
    234234
    235     IF(id0 /= 0) then
    236        DO idat = 1, idatmax - id0
    237           xxid(idat) = xxd(idat + id0)
    238           fxd (idat) = fdd(idat + id0)
    239        END DO
    240 
    241        DO idat = 1, id0
    242           xxid (idatmax - id0 + idat) = xxd(idat) + 360.
    243           fxd  (idatmax - id0 + idat) =  fdd(idat)   
    244        END DO
    245     else 
    246        DO idat = 1, idatmax
    247           xxid(idat) = xxd(idat)
    248           fxd (idat) = fdd(idat)
    249        ENDDO
     235    IF(id0 /= 0) THEN
     236      DO idat = 1, idatmax - id0
     237        xxid(idat) = xxd(idat + id0)
     238        fxd (idat) = fdd(idat + id0)
     239      END DO
     240
     241      DO idat = 1, id0
     242        xxid (idatmax - id0 + idat) = xxd(idat) + 360.
     243        fxd  (idatmax - id0 + idat) = fdd(idat)
     244      END DO
     245    else
     246      DO idat = 1, idatmax
     247        xxid(idat) = xxd(idat)
     248        fxd (idat) = fdd(idat)
     249      ENDDO
    250250    end IF
    251251    xxid(idatmax1) = xxid(1) + 360.
     
    258258    ! iteration
    259259
    260     x0   = xim0
    261     dxm  = 0.
     260    x0 = xim0
     261    dxm = 0.
    262262    imod = 1
    263263    idat = 1
    264264
    265265    do while (imod <= imodmax)
    266        do while (xxim(imod)>xxid(idat))
    267           dx  = xxid(idat) - x0
    268           dxm = dxm + dx
    269           inter_barx(imod) = inter_barx(imod) + dx * fxd(idat)
    270           x0  = xxid(idat)
    271           idat = idat + 1
    272        END DO
    273        IF (xxim(imod)<xxid(idat)) THEN
    274           dx  = xxim(imod) - x0
    275           dxm = dxm + dx
    276           inter_barx(imod) = (inter_barx(imod) + dx * fxd(idat)) / dxm
    277           x0  = xxim(imod)
    278           dxm = 0.
    279           imod = imod + 1
    280        ELSE
    281           dx  = xxim(imod) - x0
    282           dxm = dxm + dx
    283           inter_barx(imod) = (inter_barx(imod) + dx * fxd(idat)) / dxm
    284           x0  = xxim(imod)
    285           dxm = 0.
    286           imod = imod + 1
    287           idat = idat + 1
    288        END IF
     266      do while (xxim(imod)>xxid(idat))
     267        dx = xxid(idat) - x0
     268        dxm = dxm + dx
     269        inter_barx(imod) = inter_barx(imod) + dx * fxd(idat)
     270        x0 = xxid(idat)
     271        idat = idat + 1
     272      END DO
     273      IF (xxim(imod)<xxid(idat)) THEN
     274        dx = xxim(imod) - x0
     275        dxm = dxm + dx
     276        inter_barx(imod) = (inter_barx(imod) + dx * fxd(idat)) / dxm
     277        x0 = xxim(imod)
     278        dxm = 0.
     279        imod = imod + 1
     280      ELSE
     281        dx = xxim(imod) - x0
     282        dxm = dxm + dx
     283        inter_barx(imod) = (inter_barx(imod) + dx * fxd(idat)) / dxm
     284        x0 = xxim(imod)
     285        dxm = 0.
     286        imod = imod + 1
     287        idat = idat + 1
     288      END IF
    289289    END DO
    290290
     
    299299    ! L'indice 1 correspond à l'interface maille 1 -- maille 2.
    300300
    301     use lmdz_assert, only: assert
     301    use lmdz_assert, ONLY: assert
    302302
    303303    IMPLICIT NONE
    304304
    305     REAL, intent(in):: yjdat(:)
     305    REAL, intent(in) :: yjdat(:)
    306306    ! (angles, ordonnées des interfaces des mailles des données, in
    307307    ! degrees, in increasing order)
    308308
    309     REAL, intent(in):: fdat(:) ! champ de données
    310 
    311     REAL, intent(in):: yjmod(:)
     309    REAL, intent(in) :: fdat(:) ! champ de données
     310
     311    REAL, intent(in) :: yjmod(:)
    312312    ! (ordonnées des interfaces des mailles du modèle)
    313313    ! (in degrees, in strictly increasing order)
     
    317317    ! Variables local to the procedure:
    318318
    319     REAL y0, dy, dym 
     319    REAL y0, dy, dym
    320320    INTEGER jdat ! indice du champ de données
    321321    integer jmod ! indice du champ du modèle
     
    327327    ! Initialisation des variables
    328328    inter_bary(:) = 0.
    329     y0    = -90.
    330     dym   = 0.
    331     jmod  = 1
    332     jdat  = 1
     329    y0 = -90.
     330    dym = 0.
     331    jmod = 1
     332    jdat = 1
    333333
    334334    do while (jmod <= size(yjmod))
    335        do while (yjmod(jmod) > yjdat(jdat))
    336           dy        = yjdat(jdat) - y0
    337           dym        = dym + dy
    338           inter_bary(jmod) = inter_bary(jmod) + dy * fdat(jdat)
    339           y0        = yjdat(jdat)
    340           jdat      = jdat + 1
    341        END DO
    342        IF (yjmod(jmod) < yjdat(jdat)) THEN
    343           dy        = yjmod(jmod) - y0
    344           dym        = dym + dy
    345           inter_bary(jmod) = (inter_bary(jmod) + dy * fdat(jdat)) / dym
    346           y0        = yjmod(jmod)
    347           dym        = 0.
    348           jmod      = jmod + 1
    349        ELSE
    350           ! {yjmod(jmod) == yjdat(jdat)}
    351           dy        = yjmod(jmod) - y0
    352           dym        = dym + dy
    353           inter_bary(jmod) = (inter_bary(jmod) + dy * fdat(jdat)) / dym
    354           y0        = yjmod(jmod)
    355           dym        = 0.
    356           jmod      = jmod + 1
    357           jdat      = jdat + 1
    358        END IF
     335      do while (yjmod(jmod) > yjdat(jdat))
     336        dy = yjdat(jdat) - y0
     337        dym = dym + dy
     338        inter_bary(jmod) = inter_bary(jmod) + dy * fdat(jdat)
     339        y0 = yjdat(jdat)
     340        jdat = jdat + 1
     341      END DO
     342      IF (yjmod(jmod) < yjdat(jdat)) THEN
     343        dy = yjmod(jmod) - y0
     344        dym = dym + dy
     345        inter_bary(jmod) = (inter_bary(jmod) + dy * fdat(jdat)) / dym
     346        y0 = yjmod(jmod)
     347        dym = 0.
     348        jmod = jmod + 1
     349      ELSE
     350        ! {yjmod(jmod) == yjdat(jdat)}
     351        dy = yjmod(jmod) - y0
     352        dym = dym + dy
     353        inter_bary(jmod) = (inter_bary(jmod) + dy * fdat(jdat)) / dym
     354        y0 = yjmod(jmod)
     355        dym = 0.
     356        jmod = jmod + 1
     357        jdat = jdat + 1
     358      END IF
    359359    END DO
    360360    ! Le test de fin suppose que l'interface 0 est commune aux deux
     
    373373    ! Finally, the procedure adds 90° as the last value of the array.
    374374
    375     use lmdz_assert_eq, only: assert_eq
    376     use comconst_mod, only: pi
     375    use lmdz_assert_eq, ONLY: assert_eq
     376    use comconst_mod, ONLY: pi
    377377
    378378    IMPLICIT NONE
    379379
    380     REAL, intent(in):: xi(:)
     380    REAL, intent(in) :: xi(:)
    381381    ! (latitude, in degrees or radians, in increasing or decreasing order)
    382382    ! ("xi" should contain latitudes from pole to pole.
     
    385385    ! So the extreme values should not be 90° and -90°.)
    386386
    387     REAL, intent(out):: xo(:) ! angles in degrees
    388     LOGICAL, intent(out):: decrois
     387    REAL, intent(out) :: xo(:) ! angles in degrees
     388    LOGICAL, intent(out) :: decrois
    389389
    390390    ! Variables  local to the procedure:
     
    398398    decrois = xi(2) < xi(1)
    399399    DO i = 3, nmax
    400        IF (decrois .neqv. xi(i) < xi(i-1)) stop &
    401             '"ord_coord":  latitudes are not monotonic'
    402     ENDDO
    403 
    404     IF (abs(xi(1)) < pi) then
    405        ! "xi" contains latitudes in radians
    406        xo(:nmax) = xi(:) * 180. / pi
     400      IF (decrois .neqv. xi(i) < xi(i - 1)) stop &
     401              '"ord_coord":  latitudes are not monotonic'
     402    ENDDO
     403
     404    IF (abs(xi(1)) < pi) THEN
     405      ! "xi" contains latitudes in radians
     406      xo(:nmax) = xi(:) * 180. / pi
    407407    else
    408        ! "xi" contains latitudes in degrees
    409        xo(:nmax) = xi(:)
     408      ! "xi" contains latitudes in degrees
     409      xo(:nmax) = xi(:)
    410410    end IF
    411411
    412412    IF (ABS(abs(xo(1)) - 90) < 0.001 .or. ABS(abs(xo(nmax)) - 90) < 0.001) THEN
    413        print *, "ord_coord"
    414        PRINT *, '"xi" should contain the latitudes of the boundaries of ' &
    415             // 'grid cells, not the centers of grid cells.'
    416        STOP
     413      print *, "ord_coord"
     414      PRINT *, '"xi" should contain the latitudes of the boundaries of ' &
     415              // 'grid cells, not the centers of grid cells.'
     416      STOP
    417417    ENDIF
    418418
     
    429429    ! order.
    430430
    431     use comconst_mod, only: pi
     431    use comconst_mod, ONLY: pi
    432432
    433433    IMPLICIT NONE
    434434
    435     REAL, intent(in):: xi(:) ! angle, in rad or degrees
     435    REAL, intent(in) :: xi(:) ! angle, in rad or degrees
    436436    REAL ord_coordm(size(xi)) ! angle, in degrees
    437437
     
    439439
    440440    IF (xi(1) < 6.5) THEN
    441        ! "xi" is in rad
    442        ord_coordm(:) = xi(size(xi):1:-1) * 180. / pi
     441      ! "xi" is in rad
     442      ord_coordm(:) = xi(size(xi):1:-1) * 180. / pi
    443443    else
    444        ! "xi" is in degrees
    445        ord_coordm(:) = xi(size(xi):1:-1)
     444      ! "xi" is in degrees
     445      ord_coordm(:) = xi(size(xi):1:-1)
    446446    ENDIF
    447447
Note: See TracChangeset for help on using the changeset viewer.