Changeset 2351 for LMDZ5/trunk/libf/dynlonlat_phylonlat/phydev
- Timestamp:
- Aug 25, 2015, 5:14:59 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/dynlonlat_phylonlat/phydev/iniphysiq_mod.F90
r2347 r2351 6 6 CONTAINS 7 7 8 SUBROUTINE iniphysiq(iim,jjm,nlayer,punjours, pdayref,ptimestep, & 8 SUBROUTINE iniphysiq(iim,jjm,nlayer, & 9 nbp, communicator, & 10 punjours, pdayref,ptimestep, & 9 11 rlatu,rlatv,rlonu,rlonv,aire,cu,cv, & 10 12 prad,pg,pr,pcpp,iflag_phys) 11 USE dimphy, ONLY: klev ! number of atmospheric levels12 USE mod_grid_phy_lmdz, ONLY: klon_glo ! number of atmospheric columns13 ! (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 14 16 USE mod_phys_lmdz_para, ONLY: klon_omp, & ! number of columns (on local omp grid) 15 17 klon_omp_begin, & ! start index of local omp subgrid 16 18 klon_omp_end, & ! end index of local omp subgrid 17 19 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 20 USE geometry_mod, ONLY : init_geometry 24 21 USE infotrac, ONLY: nqtot, type_trac 25 22 USE infotrac_phy, ONLY: init_infotrac_phy … … 30 27 USE inifis_mod, ONLY: inifis 31 28 USE phyaqua_mod, ONLY: iniaqua 29 USE physics_distribution_mod, ONLY : init_physics_distribution 32 30 USE regular_lonlat_mod, ONLY : init_regular_lonlat, & 33 31 east, west, north, south, & 34 32 north_east, north_west, & 35 33 south_west, south_east 34 USE mod_interface_dyn_phys, ONLY : init_interface_dyn_phys 36 35 USE nrtype, ONLY: pi 37 36 IMPLICIT NONE … … 53 52 INTEGER, INTENT (IN) :: iim ! number of atmospheric coulumns along longitudes 54 53 INTEGER, INTENT (IN) :: jjm ! number of atompsheric columns along latitudes 54 INTEGER, INTENT(IN) :: nbp ! number of physics columns for this MPI process 55 INTEGER, INTENT(IN) :: communicator ! MPI communicator 55 56 REAL, INTENT (IN) :: rlatu(jjm+1) ! latitudes of the physics grid 56 57 REAL, INTENT (IN) :: rlatv(jjm) ! latitude boundaries of the physics grid … … 65 66 66 67 INTEGER :: ibegin,iend,offset 67 INTEGER :: i,j 68 INTEGER :: i,j,k 68 69 CHARACTER (LEN=20) :: modname='iniphysiq' 69 70 CHARACTER (LEN=80) :: abort_message … … 75 76 76 77 ! global array, on full physics grid: 77 REAL,ALLOCATABLE :: latfi(:) 78 REAL,ALLOCATABLE :: lonfi(:) 79 REAL,ALLOCATABLE :: cufi(:) 80 REAL,ALLOCATABLE :: cvfi(:) 81 REAL,ALLOCATABLE :: airefi(:) 82 83 IF (nlayer.NE.klev) THEN 84 WRITE(lunout,*) 'STOP in ',trim(modname) 85 WRITE(lunout,*) 'Problem with dimensions :' 86 WRITE(lunout,*) 'nlayer = ',nlayer 87 WRITE(lunout,*) 'klev = ',klev 88 abort_message = '' 89 CALL abort_gcm (modname,abort_message,1) 90 ENDIF 91 92 !call init_phys_lmdz(iim,jjm+1,llm,1,(/(jjm-1)*iim+2/)) 78 REAL,ALLOCATABLE :: latfi_glo(:) 79 REAL,ALLOCATABLE :: lonfi_glo(:) 80 REAL,ALLOCATABLE :: cufi_glo(:) 81 REAL,ALLOCATABLE :: cvfi_glo(:) 82 REAL,ALLOCATABLE :: airefi_glo(:) 83 REAL,ALLOCATABLE :: boundslonfi_glo(:,:) 84 REAL,ALLOCATABLE :: boundslatfi_glo(:,:) 85 86 ! local arrays, on given MPI/OpenMP domain: 87 REAL,ALLOCATABLE,SAVE :: latfi(:) 88 REAL,ALLOCATABLE,SAVE :: lonfi(:) 89 REAL,ALLOCATABLE,SAVE :: cufi(:) 90 REAL,ALLOCATABLE,SAVE :: cvfi(:) 91 REAL,ALLOCATABLE,SAVE :: airefi(:) 92 REAL,ALLOCATABLE,SAVE :: boundslonfi(:,:) 93 REAL,ALLOCATABLE,SAVE :: boundslatfi(:,:) 94 !$OMP THREADPRIVATE (latfi,lonfi,cufi,cvfi,airefi,boundslonfi,boundslatfi) 95 96 ! Initialize Physics distibution and parameters and interface with dynamics 97 CALL init_physics_distribution(regular_lonlat,4, & 98 nbp,iim,jjm+1,nlayer,communicator) 99 CALL init_interface_dyn_phys 93 100 94 101 ! init regular global longitude-latitude grid points and boundaries … … 115 122 116 123 ! Generate global arrays on full physics grid 117 ALLOCATE(latfi(klon_glo),lonfi(klon_glo),cufi(klon_glo),cvfi(klon_glo)) 118 ALLOCATE(airefi(klon_glo)) 124 ALLOCATE(latfi_glo(klon_glo),lonfi_glo(klon_glo)) 125 ALLOCATE(cufi_glo(klon_glo),cvfi_glo(klon_glo)) 126 ALLOCATE(airefi_glo(klon_glo)) 127 ALLOCATE(boundslonfi_glo(klon_glo,4)) 128 ALLOCATE(boundslatfi_glo(klon_glo,4)) 119 129 120 130 ! North pole 121 latfi(1)=rlatu(1) 122 lonfi(1)=0. 123 cufi(1) = cu(1) 124 cvfi(1) = cv(1) 131 latfi_glo(1)=rlatu(1) 132 lonfi_glo(1)=0. 133 cufi_glo(1) = cu(1) 134 cvfi_glo(1) = cv(1) 135 boundslonfi_glo(1,north_east)=0 136 boundslatfi_glo(1,north_east)=PI/2 137 boundslonfi_glo(1,north_west)=2*PI 138 boundslatfi_glo(1,north_west)=PI/2 139 boundslonfi_glo(1,south_west)=2*PI 140 boundslatfi_glo(1,south_west)=rlatv(1) 141 boundslonfi_glo(1,south_east)=0 142 boundslatfi_glo(1,south_east)=rlatv(1) 125 143 DO j=2,jjm 126 144 DO i=1,iim 127 latfi((j-2)*iim+1+i)= rlatu(j) 128 lonfi((j-2)*iim+1+i)= rlonv(i) 129 cufi((j-2)*iim+1+i) = cu((j-1)*iim+1+i) 130 cvfi((j-2)*iim+1+i) = cv((j-1)*iim+1+i) 145 k=(j-2)*iim+1+i 146 latfi_glo(k)= rlatu(j) 147 lonfi_glo(k)= rlonv(i) 148 cufi_glo(k) = cu((j-1)*iim+1+i) 149 cvfi_glo(k) = cv((j-1)*iim+1+i) 150 boundslonfi_glo(k,north_east)=rlonu(i) 151 boundslatfi_glo(k,north_east)=rlatv(j-1) 152 boundslonfi_glo(k,north_west)=rlonu(i+1) 153 boundslatfi_glo(k,north_west)=rlatv(j-1) 154 boundslonfi_glo(k,south_west)=rlonu(i+1) 155 boundslatfi_glo(k,south_west)=rlatv(j) 156 boundslonfi_glo(k,south_east)=rlonu(i) 157 boundslatfi_glo(k,south_east)=rlatv(j) 131 158 ENDDO 132 159 ENDDO 133 160 ! South pole 134 latfi(klon_glo)= rlatu(jjm+1) 135 lonfi(klon_glo)= 0. 136 cufi(klon_glo) = cu((iim+1)*jjm+1) 137 cvfi(klon_glo) = cv((iim+1)*jjm-iim) 161 latfi_glo(klon_glo)= rlatu(jjm+1) 162 lonfi_glo(klon_glo)= 0. 163 cufi_glo(klon_glo) = cu((iim+1)*jjm+1) 164 cvfi_glo(klon_glo) = cv((iim+1)*jjm-iim) 165 boundslonfi_glo(klon_glo,north_east)= 0 166 boundslatfi_glo(klon_glo,north_east)= rlatv(jjm) 167 boundslonfi_glo(klon_glo,north_west)= 2*PI 168 boundslatfi_glo(klon_glo,north_west)= rlatv(jjm) 169 boundslonfi_glo(klon_glo,south_west)= 2*PI 170 boundslatfi_glo(klon_glo,south_west)= -PI/2 171 boundslonfi_glo(klon_glo,south_east)= 0 172 boundslatfi_glo(klon_glo,south_east)= -Pi/2 138 173 139 174 ! build airefi(), mesh area on physics grid 140 CALL gr_dyn_fi(1,iim+1,jjm+1,klon_glo,aire,airefi )175 CALL gr_dyn_fi(1,iim+1,jjm+1,klon_glo,aire,airefi_glo) 141 176 ! Poles are single points on physics grid 142 airefi (1)=sum(aire(1:iim,1))143 airefi (klon_glo)=sum(aire(1:iim,jjm+1))177 airefi_glo(1)=sum(aire(1:iim,1)) 178 airefi_glo(klon_glo)=sum(aire(1:iim,jjm+1)) 144 179 145 180 ! Sanity check: do total planet area match between physics and dynamics? 146 181 total_area_dyn=sum(aire(1:iim,1:jjm+1)) 147 total_area_phy=sum(airefi (1:klon_glo))182 total_area_phy=sum(airefi_glo(1:klon_glo)) 148 183 IF (total_area_dyn/=total_area_phy) THEN 149 184 WRITE (lunout, *) 'iniphysiq: planet total surface discrepancy !!!' … … 158 193 159 194 !$OMP PARALLEL 195 ! Now generate local lon/lat/cu/cv/area/bounds arrays 196 ALLOCATE(latfi(klon_omp),lonfi(klon_omp),cufi(klon_omp),cvfi(klon_omp)) 197 ALLOCATE(airefi(klon_omp)) 198 ALLOCATE(boundslonfi(klon_omp,4)) 199 ALLOCATE(boundslatfi(klon_omp,4)) 200 201 202 offset = klon_mpi_begin - 1 203 airefi(1:klon_omp) = airefi_glo(offset+klon_omp_begin:offset+klon_omp_end) 204 cufi(1:klon_omp) = cufi_glo(offset+klon_omp_begin:offset+klon_omp_end) 205 cvfi(1:klon_omp) = cvfi_glo(offset+klon_omp_begin:offset+klon_omp_end) 206 lonfi(1:klon_omp) = lonfi_glo(offset+klon_omp_begin:offset+klon_omp_end) 207 latfi(1:klon_omp) = latfi_glo(offset+klon_omp_begin:offset+klon_omp_end) 208 boundslonfi(1:klon_omp,:) = boundslonfi_glo(offset+klon_omp_begin:offset+klon_omp_end,:) 209 boundslatfi(1:klon_omp,:) = boundslatfi_glo(offset+klon_omp_begin:offset+klon_omp_end,:) 210 211 ! copy over local grid longitudes and latitudes 212 CALL init_geometry(klon_omp,lonfi,latfi,boundslonfi,boundslatfi, & 213 airefi,cufi,cvfi) 214 160 215 ! Initialize physical constants in physics: 161 216 CALL inifis(prad,pg,pr,pcpp) … … 164 219 CALL init_infotrac_phy(nqtot,type_trac) 165 220 166 ! Now generate local lon/lat/cu/cv/area arrays167 CALL initcomgeomphy168 169 offset = klon_mpi_begin - 1170 airephy(1:klon_omp) = airefi(offset+klon_omp_begin:offset+klon_omp_end)171 cuphy(1:klon_omp) = cufi(offset+klon_omp_begin:offset+klon_omp_end)172 cvphy(1:klon_omp) = cvfi(offset+klon_omp_begin:offset+klon_omp_end)173 rlond(1:klon_omp) = lonfi(offset+klon_omp_begin:offset+klon_omp_end)174 rlatd(1:klon_omp) = latfi(offset+klon_omp_begin:offset+klon_omp_end)175 176 221 ! Additional initializations for aquaplanets 177 222 IF (iflag_phys>=100) THEN 178 CALL iniaqua(klon_omp, rlatd,rlond,iflag_phys)223 CALL iniaqua(klon_omp,iflag_phys) 179 224 ENDIF 180 225 !$OMP END PARALLEL
Note: See TracChangeset
for help on using the changeset viewer.