Ignore:
Timestamp:
Apr 5, 2016, 10:51:51 AM (9 years ago)
Author:
emillour
Message:

Generic GCM: Towards a cleaner separation between physics and dynamics

  • Got rid of references to "dimensions.h" from physics packages: use nbp_lon (=iim), nbp_lat (=jjp1) and nbp_lev from module mod_grid_phy_lmdz (in phy_common) instead.
  • Removed module "comhdiff_mod.F90", as it is only used by module surf_heat_transp_mod.F90, moved module variables there.
  • Addedin "surf_heat_transp_mod" local versions of some arrays and routines (from dyn3d) required to compute gradient, divergence, etc. on the global dynamics grid. As before, the slab ocean only works in serial.

EM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.GENERIC/libf/phystd/writediagfi.F

    r1525 r1529  
    4040!=================================================================
    4141      use surfdat_h, only: phisfi
     42      use comgeomphy, only: airephy
    4243      use time_phylmdz_mod, only: ecritphy, day_step, iphysiq, day_ini
    4344      USE mod_phys_lmdz_para, only : is_parallel, is_mpi_root,
    4445     &                               is_master, gather
    45       USE mod_grid_phy_lmdz, only : klon_glo, Grid1Dto2D_glo
     46      USE mod_grid_phy_lmdz, only : klon_glo, Grid1Dto2D_glo,
     47     &                              nbp_lon, nbp_lat, nbp_lev
    4648      implicit none
    4749
    4850! Commons
    49       include "dimensions.h"
    50       include "paramet.h"
    51       include "comgeom.h"
    5251      include "netcdf.inc"
    5352
     
    5655      character (len=*),intent(in) :: nom,titre,unite
    5756      integer,intent(in) :: dim
    58       real,intent(in) :: px(ngrid,llm)
     57      real,intent(in) :: px(ngrid,nbp_lev)
    5958
    6059! Local variables:
    6160
    62       real*4 dx3(iip1,jjp1,llm) ! to store a 3D data set
    63       real*4 dx2(iip1,jjp1)     ! to store a 2D (surface) data set
    64       real*4 dx1(llm)           ! to store a 1D (column) data set
     61      real*4 dx3(nbp_lon+1,nbp_lat,nbp_lev) ! to store a 3D data set
     62      real*4 dx2(nbp_lon+1,nbp_lat)     ! to store a 2D (surface) data set
     63      real*4 dx1(nbp_lev)           ! to store a 1D (column) data set
    6564      real*4 dx0
    6665
     
    6867!$OMP THREADPRIVATE(date)
    6968
    70       REAL phis(ip1jmp1)
     69      REAL phis((nbp_lon+1),nbp_lat)
     70      REAL area((nbp_lon+1),nbp_lat)
    7171
    7272      integer irythme
    7373      integer ierr,ierr2
    74       integer iq
    75       integer i,j,l,zmax , ig0
     74      integer i,j,l, ig0
    7675
    7776      integer,save :: zitau=0
     
    102101#ifdef CPP_PARA
    103102! Added to work in parallel mode
    104       real dx3_glop(klon_glo,llm)
    105       real dx3_glo(iim,jjp1,llm) ! to store a global 3D data set
     103      real dx3_glop(klon_glo,nbp_lev)
     104      real dx3_glo(nbp_lon,nbp_lat,nbp_lev) ! to store a global 3D data set
    106105      real dx2_glop(klon_glo)
    107       real dx2_glo(iim,jjp1)     ! to store a global 2D (surface) data set
     106      real dx2_glo(nbp_lon,nbp_lat)     ! to store a global 2D (surface) data set
    108107      real px2(ngrid)
    109 !      real dx1_glo(llm)          ! to store a 1D (column) data set
     108!      real dx1_glo(nbp_lev)          ! to store a 1D (column) data set
    110109!      real dx0_glo
    111110      real phisfi_glo(klon_glo) ! surface geopotential on global physics grid
     111      real areafi_glo(klon_glo) ! mesh area on global physics grid
    112112#else
    113113      real phisfi_glo(ngrid) ! surface geopotential on global physics grid
     114      real areafi_glo(ngrid) ! mesh area on global physics grid
    114115#endif
    115116
     
    117118!Sortie des variables au rythme voulu
    118119
    119       irythme = ecritphy ! sortie au rythme de ecritphy
     120      irythme = int(ecritphy) ! sortie au rythme de ecritphy
    120121!     irythme = iconser  ! sortie au rythme des variables de controle
    121122!     irythme = iphysiq  ! sortie a tous les pas physique
     
    188189          ! Gather phisfi() geopotential on physics grid
    189190          call Gather(phisfi,phisfi_glo)
     191          ! Gather airephy() mesh area on physics grid
     192          call Gather(airephy,areafi_glo)
    190193#else
    191194         phisfi_glo(:)=phisfi(:)
     195         areafi_glo(:)=airephy(:)
    192196#endif
    193197
     
    216220         ierr = NF_ENDDEF(nid)
    217221
     222         ! Build phis() and area()
     223         do i=1,nbp_lon+1 ! poles
     224           phis(i,1)=phisfi_glo(1)
     225           phis(i,nbp_lat)=phisfi_glo(klon_glo)
     226           ! for area, divide at the poles by nbp_lon
     227           area(i,1)=areafi_glo(1)/nbp_lon
     228           area(i,nbp_lat)=areafi_glo(klon_glo)/nbp_lon
     229         enddo
     230         do j=2,nbp_lat-1
     231           ig0= 1+(j-2)*nbp_lon
     232           do i=1,nbp_lon
     233              phis(i,j)=phisfi_glo(ig0+i)
     234              area(i,j)=areafi_glo(ig0+i)
     235           enddo
     236           ! handle redundant point in longitude
     237           phis(nbp_lon+1,j)=phis(1,j)
     238           area(nbp_lon+1,j)=area(1,j)
     239         enddo
     240         
    218241         ! write "header" of file (longitudes, latitudes, geopotential, ...)
    219          call gr_fi_dyn(1,size(phisfi_glo),iip1,jjp1,phisfi_glo,phis)
    220          call iniwrite(nid,day_ini,phis)
     242         call iniwrite(nid,day_ini,phis,area)
    221243
    222244         endif ! of if (is_master)
     
    234256
    235257      if (ngrid.eq.1) then
    236         ! in testphys1d, for the 1d version of the GCM, iphysiq
    237         ! should be most likely 1 (because no dyn!)
     258        ! in testphys1d, for the 1d version of the GCM, iphysiq and irythme
     259        ! are undefined; so set them to 1
    238260        iphysiq=1
     261        irythme=1
    239262        ! NB:
    240263      endif
     
    296319            call Grid1Dto2D_glo(dx3_glop,dx3_glo)
    297320            ! copy dx3_glo() to dx3(:) and add redundant longitude
    298             dx3(1:iim,:,:)=dx3_glo(1:iim,:,:)
    299             dx3(iip1,:,:)=dx3(1,:,:)
     321            dx3(1:nbp_lon,:,:)=dx3_glo(1:nbp_lon,:,:)
     322            dx3(nbp_lon+1,:,:)=dx3(1,:,:)
    300323          endif
    301324!$OMP END MASTER
     
    304327!         Passage variable physique -->  variable dynamique
    305328!         recast (copy) variable from physics grid to dynamics grid
    306            DO l=1,llm
    307              DO i=1,iip1
     329           DO l=1,nbp_lev
     330             DO i=1,nbp_lon+1
    308331                dx3(i,1,l)=px(1,l)
    309                 dx3(i,jjp1,l)=px(ngrid,l)
     332                dx3(i,nbp_lat,l)=px(ngrid,l)
    310333             ENDDO
    311              DO j=2,jjm
    312                 ig0= 1+(j-2)*iim
    313                 DO i=1,iim
     334             DO j=2,nbp_lat-1
     335                ig0= 1+(j-2)*nbp_lon
     336                DO i=1,nbp_lon
    314337                   dx3(i,j,l)=px(ig0+i,l)
    315338                ENDDO
    316                 dx3(iip1,j,l)=dx3(1,j,l)
     339                dx3(nbp_lon+1,j,l)=dx3(1,j,l)
    317340             ENDDO
    318341           ENDDO
     
    344367           corner(4)=ntime
    345368
    346            edges(1)=iip1
    347            edges(2)=jjp1
    348            edges(3)=llm
     369           edges(1)=nbp_lon+1
     370           edges(2)=nbp_lat
     371           edges(3)=nbp_lev
    349372           edges(4)=1
    350373!#ifdef NC_DOUBLE
     
    380403            call Grid1Dto2D_glo(dx2_glop,dx2_glo)
    381404            ! copy dx2_glo() to dx2(:) and add redundant longitude
    382             dx2(1:iim,:)=dx2_glo(1:iim,:)
    383             dx2(iip1,:)=dx2(1,:)
     405            dx2(1:nbp_lon,:)=dx2_glo(1:nbp_lon,:)
     406            dx2(nbp_lon+1,:)=dx2(1,:)
    384407          endif
    385408!$OMP END MASTER
     
    390413!         recast (copy) variable from physics grid to dynamics grid
    391414
    392              DO i=1,iip1
     415             DO i=1,nbp_lon+1
    393416                dx2(i,1)=px(1,1)
    394                 dx2(i,jjp1)=px(ngrid,1)
     417                dx2(i,nbp_lat)=px(ngrid,1)
    395418             ENDDO
    396              DO j=2,jjm
    397                 ig0= 1+(j-2)*iim
    398                 DO i=1,iim
     419             DO j=2,nbp_lat-1
     420                ig0= 1+(j-2)*nbp_lon
     421                DO i=1,nbp_lon
    399422                   dx2(i,j)=px(ig0+i,1)
    400423                ENDDO
    401                 dx2(iip1,j)=dx2(1,j)
     424                dx2(nbp_lon+1,j)=dx2(1,j)
    402425             ENDDO
    403426#endif
     
    426449           corner(2)=1
    427450           corner(3)=ntime
    428            edges(1)=iip1
    429            edges(2)=jjp1
     451           edges(1)=nbp_lon+1
     452           edges(2)=nbp_lat
    430453           edges(3)=1
    431454
     
    457480!         Passage variable physique -->  physique dynamique
    458481!         recast (copy) variable from physics grid to dynamics grid
    459           do l=1,llm
     482          do l=1,nbp_lev
    460483            dx1(l)=px(1,l)
    461484          enddo
     
    479502           corner(2)=ntime
    480503           
    481            edges(1)=llm
     504           edges(1)=nbp_lev
    482505           edges(2)=1
    483506!#ifdef NC_DOUBLE
     
    543566
    544567#endif
     568! of #ifndef MESOSCALE
    545569      end
Note: See TracChangeset for help on using the changeset viewer.