Ignore:
Timestamp:
Apr 22, 2016, 9:02:11 AM (9 years ago)
Author:
emillour
Message:

All models: Further adaptations to keep up with changes in LMDZ5 concerning
physics/dynamics separation:

  • dyn3d:
  • adapted gcm.F so that all physics initializations are now done in iniphysiq.
  • dyn3dpar:
  • adapted gcm.F so that all physics initializations are now done in iniphysiq.
  • updated calfis_p.F to follow up with changes.
  • copied over updated "bands.F90" from LMDZ5.
  • dynphy_lonlat:
  • calfis_p.F90, mod_interface_dyn_phys.F90, follow up of changes in phy_common/mod_* routines
  • phy_common:
  • added "geometry_mod.F90" to store information about the grid (replaces phy*/comgeomphy.F90) and give variables friendlier names: rlond => longitude , rlatd => latitude, airephy => cell_area, cuphy => dx , cvphy => dy
  • added "physics_distribution_mod.F90"
  • updated "mod_grid_phy_lmdz.F90", "mod_phys_lmdz_mpi_data.F90", "mod_phys_lmdz_para.F90", "mod_phys_lmdz_mpi_transfert.F90", "mod_grid_phy_lmdz.F90", "mod_phys_lmdz_omp_data.F90", "mod_phys_lmdz_omp_transfert.F90", "write_field_phy.F90" and "ioipsl_getin_p_mod.F90" to LMDZ5 versions.
  • phy[venus/titan/mars/std]:
  • removed "init_phys_lmdz.F90", "comgeomphy.F90"; adapted routines to use geometry_mod (longitude, latitude, cell_area, etc.)

EM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.COMMON/libf/dynphy_lonlat/phyvenus/iniphysiq_mod.F90

    r1524 r1543  
    66CONTAINS
    77
    8 SUBROUTINE iniphysiq(iim,jjm,nlayer,punjours, pdayref,ptimestep,         &
    9                      rlatu,rlatv,rlonu,rlonv,aire,cu,cv,                 &
     8SUBROUTINE iniphysiq(iim,jjm,nlayer, &
     9                     nbp, communicator, &
     10                     punjours, pdayref,ptimestep, &
     11                     rlatu,rlatv,rlonu,rlonv,aire,cu,cv, &
    1012                     prad,pg,pr,pcpp,iflag_phys)
    11   USE dimphy, ONLY: klev ! number of atmospheric levels
    12   USE mod_grid_phy_lmdz, ONLY: klon_glo ! number of atmospheric columns
    13                                         ! (on full grid)
     13  USE dimphy, ONLY: init_dimphy
     14  USE mod_grid_phy_lmdz, ONLY: klon_glo,  & ! number of atmospheric columns (on full grid)
     15                               regular_lonlat, &  ! regular longitude-latitude grid type
     16                               nbp_lon, nbp_lat, nbp_lev
    1417  USE mod_phys_lmdz_para, ONLY: klon_omp, & ! number of columns (on local omp grid)
    1518                                klon_omp_begin, & ! start index of local omp subgrid
    1619                                klon_omp_end, & ! end index of local omp subgrid
    1720                                klon_mpi_begin ! start indes of columns (on local mpi grid)
    18   USE comgeomphy, ONLY: initcomgeomphy, &
    19                         airephy, & ! physics grid area (m2)
    20                         cuphy, & ! cu coeff. (u_covariant = cu * u)
    21                         cvphy, & ! cv coeff. (v_covariant = cv * v)
    22                         rlond, & ! longitudes
    23                         rlatd ! latitudes
     21  USE geometry_mod, ONLY : init_geometry
     22!  USE comgeomphy, ONLY: initcomgeomphy, &
     23!                        airephy, & ! physics grid area (m2)
     24!                        cuphy, & ! cu coeff. (u_covariant = cu * u)
     25!                        cvphy, & ! cv coeff. (v_covariant = cv * v)
     26!                        rlond, & ! longitudes
     27!                        rlatd ! latitudes
    2428  USE temps_mod, ONLY: annee_ref, day_ref, day_ini, day_end
    2529  USE time_phylmdz_mod, ONLY: init_time
     30  USE physics_distribution_mod, ONLY : init_physics_distribution
    2631  USE regular_lonlat_mod, ONLY : init_regular_lonlat, &
    2732                                 east, west, north, south, &
    2833                                 north_east, north_west, &
    2934                                 south_west, south_east
     35  USE mod_interface_dyn_phys, ONLY :  init_interface_dyn_phys
    3036  USE nrtype, ONLY: pi
    3137  IMPLICIT NONE
     
    4753  INTEGER, INTENT (IN) :: iim ! number of atmospheric columns along longitudes
    4854  INTEGER, INTENT (IN) :: jjm ! number of atompsheric columns along latitudes
     55  INTEGER, INTENT(IN) :: nbp ! number of physics columns for this MPI process
     56  INTEGER, INTENT(IN) :: communicator ! MPI communicator
    4957  REAL, INTENT (IN) :: rlatu(jjm+1) ! latitudes of the physics grid
    5058  REAL, INTENT (IN) :: rlatv(jjm) ! latitude boundaries of the physics grid
     
    5967
    6068  INTEGER :: ibegin, iend, offset
    61   INTEGER :: i,j
     69  INTEGER :: i,j,k
    6270  CHARACTER (LEN=20) :: modname = 'iniphysiq'
    6371  CHARACTER (LEN=80) :: abort_message
     
    6977
    7078  ! global array, on full physics grid:
    71   REAL,ALLOCATABLE :: latfi(:)
    72   REAL,ALLOCATABLE :: lonfi(:)
    73   REAL,ALLOCATABLE :: cufi(:)
    74   REAL,ALLOCATABLE :: cvfi(:)
    75   REAL,ALLOCATABLE :: airefi(:)
    76 
    77   IF (nlayer/=klev) THEN
    78     WRITE (lunout, *) 'STOP in ', trim(modname)
    79     WRITE (lunout, *) 'Problem with dimensions :'
    80     WRITE (lunout, *) 'nlayer     = ', nlayer
    81     WRITE (lunout, *) 'klev   = ', klev
    82     abort_message = ''
    83     CALL abort_gcm(modname, 'Problem with dimensions', 1)
    84   END IF
    85 
    86   !call init_phys_lmdz(iim,jjm+1,llm,1,(/(jjm-1)*iim+2/))
     79  REAL,ALLOCATABLE :: latfi_glo(:)
     80  REAL,ALLOCATABLE :: lonfi_glo(:)
     81  REAL,ALLOCATABLE :: cufi_glo(:)
     82  REAL,ALLOCATABLE :: cvfi_glo(:)
     83  REAL,ALLOCATABLE :: airefi_glo(:)
     84  REAL,ALLOCATABLE :: boundslonfi_glo(:,:)
     85  REAL,ALLOCATABLE :: boundslatfi_glo(:,:)
     86
     87  ! local arrays, on given MPI/OpenMP domain:
     88  REAL,ALLOCATABLE,SAVE :: latfi(:)
     89  REAL,ALLOCATABLE,SAVE :: lonfi(:)
     90  REAL,ALLOCATABLE,SAVE :: cufi(:)
     91  REAL,ALLOCATABLE,SAVE :: cvfi(:)
     92  REAL,ALLOCATABLE,SAVE :: airefi(:)
     93  REAL,ALLOCATABLE,SAVE :: boundslonfi(:,:)
     94  REAL,ALLOCATABLE,SAVE :: boundslatfi(:,:)
     95!$OMP THREADPRIVATE (latfi,lonfi,cufi,cvfi,airefi,boundslonfi,boundslatfi)
     96
     97  ! Initialize Physics distibution and parameters and interface with dynamics
     98  IF (iim*jjm>1) THEN ! general 3D case
     99    CALL init_physics_distribution(regular_lonlat,4, &
     100                                 nbp,iim,jjm+1,nlayer,communicator)
     101  ELSE ! For 1D model
     102    CALL init_physics_distribution(regular_lonlat,4, &
     103                                 1,1,1,nlayer,communicator)
     104  ENDIF
     105  CALL init_interface_dyn_phys
    87106 
    88107  ! init regular global longitude-latitude grid points and boundaries
     
    109128
    110129  ! Generate global arrays on full physics grid
    111   ALLOCATE(latfi(klon_glo),lonfi(klon_glo),cufi(klon_glo),cvfi(klon_glo))
    112   ALLOCATE(airefi(klon_glo))
     130  ALLOCATE(latfi_glo(klon_glo),lonfi_glo(klon_glo))
     131  ALLOCATE(cufi_glo(klon_glo),cvfi_glo(klon_glo))
     132  ALLOCATE(airefi_glo(klon_glo))
     133  ALLOCATE(boundslonfi_glo(klon_glo,4))
     134  ALLOCATE(boundslatfi_glo(klon_glo,4))
    113135
    114136  IF (klon_glo>1) THEN ! general case
    115137    ! North pole
    116     latfi(1)=rlatu(1)
    117     lonfi(1)=0.
    118     cufi(1) = cu(1)
    119     cvfi(1) = cv(1)
     138    latfi_glo(1)=rlatu(1)
     139    lonfi_glo(1)=0.
     140    cufi_glo(1) = cu(1)
     141    cvfi_glo(1) = cv(1)
     142    boundslonfi_glo(1,north_east)=0
     143    boundslatfi_glo(1,north_east)=PI/2
     144    boundslonfi_glo(1,north_west)=2*PI
     145    boundslatfi_glo(1,north_west)=PI/2
     146    boundslonfi_glo(1,south_west)=2*PI
     147    boundslatfi_glo(1,south_west)=rlatv(1)
     148    boundslonfi_glo(1,south_east)=0
     149    boundslatfi_glo(1,south_east)=rlatv(1)
    120150    DO j=2,jjm
    121151      DO i=1,iim
    122         latfi((j-2)*iim+1+i)= rlatu(j)
    123         lonfi((j-2)*iim+1+i)= rlonv(i)
    124         cufi((j-2)*iim+1+i) = cu((j-1)*(iim+1)+i)
    125         cvfi((j-2)*iim+1+i) = cv((j-1)*(iim+1)+i)
     152        k=(j-2)*iim+1+i
     153        latfi_glo(k)= rlatu(j)
     154        lonfi_glo(k)= rlonv(i)
     155        cufi_glo(k) = cu((j-1)*(iim+1)+i)
     156        cvfi_glo(k) = cv((j-1)*(iim+1)+i)
     157        boundslonfi_glo(k,north_east)=rlonu(i)
     158        boundslatfi_glo(k,north_east)=rlatv(j-1)
     159        boundslonfi_glo(k,north_west)=rlonu(i+1)
     160        boundslatfi_glo(k,north_west)=rlatv(j-1)
     161        boundslonfi_glo(k,south_west)=rlonu(i+1)
     162        boundslatfi_glo(k,south_west)=rlatv(j)
     163        boundslonfi_glo(k,south_east)=rlonu(i)
     164        boundslatfi_glo(k,south_east)=rlatv(j)
    126165      ENDDO
    127166    ENDDO
    128167    ! South pole
    129     latfi(klon_glo)= rlatu(jjm+1)
    130     lonfi(klon_glo)= 0.
    131     cufi(klon_glo) = cu((iim+1)*jjm+1)
    132     cvfi(klon_glo) = cv((iim+1)*jjm-iim)
     168    latfi_glo(klon_glo)= rlatu(jjm+1)
     169    lonfi_glo(klon_glo)= 0.
     170    cufi_glo(klon_glo) = cu((iim+1)*jjm+1)
     171    cvfi_glo(klon_glo) = cv((iim+1)*jjm-iim)
     172    boundslonfi_glo(klon_glo,north_east)= 0
     173    boundslatfi_glo(klon_glo,north_east)= rlatv(jjm)
     174    boundslonfi_glo(klon_glo,north_west)= 2*PI
     175    boundslatfi_glo(klon_glo,north_west)= rlatv(jjm)
     176    boundslonfi_glo(klon_glo,south_west)= 2*PI
     177    boundslatfi_glo(klon_glo,south_west)= -PI/2
     178    boundslonfi_glo(klon_glo,south_east)= 0
     179    boundslatfi_glo(klon_glo,south_east)= -Pi/2
    133180
    134181    ! build airefi(), mesh area on physics grid
    135     CALL gr_dyn_fi(1,iim+1,jjm+1,klon_glo,aire,airefi)
     182    CALL gr_dyn_fi(1,iim+1,jjm+1,klon_glo,aire,airefi_glo)
    136183    ! Poles are single points on physics grid
    137     airefi(1)=sum(aire(1:iim,1))
    138     airefi(klon_glo)=sum(aire(1:iim,jjm+1))
     184    airefi_glo(1)=sum(aire(1:iim,1))
     185    airefi_glo(klon_glo)=sum(aire(1:iim,jjm+1))
    139186
    140187    ! Sanity check: do total planet area match between physics and dynamics?
    141188    total_area_dyn=sum(aire(1:iim,1:jjm+1))
    142     total_area_phy=sum(airefi(1:klon_glo))
     189    total_area_phy=sum(airefi_glo(1:klon_glo))
    143190    IF (total_area_dyn/=total_area_phy) THEN
    144191      WRITE (lunout, *) 'iniphysiq: planet total surface discrepancy !!!'
     
    153200  ELSE ! klon_glo==1, running the 1D model
    154201    ! just copy over input values
    155     latfi(1)=rlatu(1)
    156     lonfi(1)=rlonv(1)
    157     cufi(1)=cu(1)
    158     cvfi(1)=cv(1)
    159     airefi(1)=aire(1,1)
     202    latfi_glo(1)=rlatu(1)
     203    lonfi_glo(1)=rlonv(1)
     204    cufi_glo(1)=cu(1)
     205    cvfi_glo(1)=cv(1)
     206    airefi_glo(1)=aire(1,1)
     207    boundslonfi_glo(1,north_east)=rlonu(1)
     208    boundslatfi_glo(1,north_east)=PI/2
     209    boundslonfi_glo(1,north_west)=rlonu(2)
     210    boundslatfi_glo(1,north_west)=PI/2
     211    boundslonfi_glo(1,south_west)=rlonu(2)
     212    boundslatfi_glo(1,south_west)=rlatv(1)
     213    boundslonfi_glo(1,south_east)=rlonu(1)
     214    boundslatfi_glo(1,south_east)=rlatv(1)
    160215  ENDIF ! of IF (klon_glo>1)
    161216
    162217!$OMP PARALLEL
    163   ! Now generate local lon/lat/cu/cv/area arrays
    164   CALL initcomgeomphy
     218  ! Now generate local lon/lat/cu/cv/area/bounds arrays
     219  ALLOCATE(latfi(klon_omp),lonfi(klon_omp),cufi(klon_omp),cvfi(klon_omp))
     220  ALLOCATE(airefi(klon_omp))
     221  ALLOCATE(boundslonfi(klon_omp,4))
     222  ALLOCATE(boundslatfi(klon_omp,4))
     223!  CALL initcomgeomphy
    165224
    166225  offset = klon_mpi_begin - 1
    167   airephy(1:klon_omp) = airefi(offset+klon_omp_begin:offset+klon_omp_end)
    168   cuphy(1:klon_omp) = cufi(offset+klon_omp_begin:offset+klon_omp_end)
    169   cvphy(1:klon_omp) = cvfi(offset+klon_omp_begin:offset+klon_omp_end)
    170   rlond(1:klon_omp) = lonfi(offset+klon_omp_begin:offset+klon_omp_end)
    171   rlatd(1:klon_omp) = latfi(offset+klon_omp_begin:offset+klon_omp_end)
     226  airefi(1:klon_omp) = airefi_glo(offset+klon_omp_begin:offset+klon_omp_end)
     227  cufi(1:klon_omp) = cufi_glo(offset+klon_omp_begin:offset+klon_omp_end)
     228  cvfi(1:klon_omp) = cvfi_glo(offset+klon_omp_begin:offset+klon_omp_end)
     229  lonfi(1:klon_omp) = lonfi_glo(offset+klon_omp_begin:offset+klon_omp_end)
     230  latfi(1:klon_omp) = latfi_glo(offset+klon_omp_begin:offset+klon_omp_end)
     231  boundslonfi(1:klon_omp,:) = boundslonfi_glo(offset+klon_omp_begin:offset+klon_omp_end,:)
     232  boundslatfi(1:klon_omp,:) = boundslatfi_glo(offset+klon_omp_begin:offset+klon_omp_end,:)
     233
     234  ! copy over local grid longitudes and latitudes
     235  CALL init_geometry(klon_omp,lonfi,latfi,boundslonfi,boundslatfi, &
     236                     airefi,cufi,cvfi)
    172237
    173238  ! Initialize some physical constants
     
    176241  ! Initialize some "temporal and calendar" related variables
    177242  CALL init_time(annee_ref,day_ref,day_ini,day_end,ptimestep)
     243
     244  ! Initialize dimphy module
     245  CALL Init_dimphy(klon_omp,nlayer)
    178246
    179247!$OMP END PARALLEL
Note: See TracChangeset for help on using the changeset viewer.