Changeset 2588 for LMDZ5/trunk/libf/dynphy_lonlat/phylmd
- Timestamp:
- Jul 13, 2016, 8:54:39 AM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/dynphy_lonlat/phylmd/iniphysiq_mod.F90
r2457 r2588 12 12 prad,pg,pr,pcpp,iflag_phys) 13 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 17 USE mod_phys_lmdz_para, ONLY: klon_omp, & ! number of columns (on local omp grid) 18 klon_omp_begin, & ! start index of local omp subgrid 19 klon_omp_end, & ! end index of local omp subgrid 20 klon_mpi_begin ! start indes of columns (on local mpi grid) 21 USE geometry_mod, ONLY : init_geometry 14 USE inigeomphy_mod, ONLY: inigeomphy 15 USE mod_grid_phy_lmdz, ONLY: klon_glo ! number of atmospheric columns (on full grid) 16 USE mod_phys_lmdz_para, ONLY: klon_omp ! number of columns (on local omp grid) 22 17 USE vertical_layers_mod, ONLY : init_vertical_layers 23 18 USE infotrac, ONLY: nqtot,nqo,nbtr,tname,ttext,type_trac,& … … 39 34 USE phystokenc_mod, ONLY: init_phystokenc 40 35 USE phyaqua_mod, ONLY: iniaqua 41 USE physics_distribution_mod, ONLY : init_physics_distribution42 USE regular_lonlat_mod, ONLY : init_regular_lonlat, &43 east, west, north, south, &44 north_east, north_west, &45 south_west, south_east46 USE mod_interface_dyn_phys, ONLY : init_interface_dyn_phys47 36 #ifdef INCA 48 37 USE indice_sol_mod, ONLY: nbsrf, is_oce, is_sic, is_ter, is_lic … … 92 81 CHARACTER (LEN=20) :: modname = 'iniphysiq' 93 82 CHARACTER (LEN=80) :: abort_message 94 REAL :: total_area_phy, total_area_dyn95 83 96 ! boundaries, on global grid97 REAL,ALLOCATABLE :: boundslon_reg(:,:)98 REAL,ALLOCATABLE :: boundslat_reg(:,:)99 100 ! global array, on full physics grid:101 REAL,ALLOCATABLE :: latfi_glo(:)102 REAL,ALLOCATABLE :: lonfi_glo(:)103 REAL,ALLOCATABLE :: cufi_glo(:)104 REAL,ALLOCATABLE :: cvfi_glo(:)105 REAL,ALLOCATABLE :: airefi_glo(:)106 REAL,ALLOCATABLE :: boundslonfi_glo(:,:)107 REAL,ALLOCATABLE :: boundslatfi_glo(:,:)108 109 ! local arrays, on given MPI/OpenMP domain:110 REAL,ALLOCATABLE,SAVE :: latfi(:)111 REAL,ALLOCATABLE,SAVE :: lonfi(:)112 REAL,ALLOCATABLE,SAVE :: cufi(:)113 REAL,ALLOCATABLE,SAVE :: cvfi(:)114 REAL,ALLOCATABLE,SAVE :: airefi(:)115 REAL,ALLOCATABLE,SAVE :: boundslonfi(:,:)116 REAL,ALLOCATABLE,SAVE :: boundslatfi(:,:)117 !$OMP THREADPRIVATE (latfi,lonfi,cufi,cvfi,airefi,boundslonfi,boundslatfi)118 84 119 85 #ifndef CPP_PARA … … 123 89 #endif 124 90 125 ! Initialize Physics distibution and parameters and interface with dynamics126 IF (ii*jj>1) THEN ! general 3D case127 CALL init_physics_distribution(regular_lonlat,4, &128 nbp,ii,jj+1,nlayer,communicator)129 ELSE ! For 1D model130 CALL init_physics_distribution(regular_lonlat,4, &131 1,1,1,nlayer,communicator)132 ENDIF 133 CALL init_interface_dyn_phys91 ! --> initialize physics distribution, global fields and geometry 92 ! (i.e. things in phy_common or dynphy_lonlat) 93 CALL inigeomphy(ii,jj,nlayer, & 94 nbp, communicator, & 95 rlatu,rlatv, & 96 rlonu,rlonv, & 97 aire,cu,cv) 98 99 ! --> now initialize things specific to the phylmd physics package 134 100 135 ! init regular global longitude-latitude grid points and boundaries136 ALLOCATE(boundslon_reg(ii,2))137 ALLOCATE(boundslat_reg(jj+1,2))138 139 DO i=1,ii140 boundslon_reg(i,east)=rlonu(i)141 boundslon_reg(i,west)=rlonu(i+1)142 ENDDO143 144 boundslat_reg(1,north)= PI/2145 boundslat_reg(1,south)= rlatv(1)146 DO j=2,jj147 boundslat_reg(j,north)=rlatv(j-1)148 boundslat_reg(j,south)=rlatv(j)149 ENDDO150 boundslat_reg(jj+1,north)= rlatv(jj)151 boundslat_reg(jj+1,south)= -PI/2152 153 ! Write values in module regular_lonlat_mod154 CALL init_regular_lonlat(ii,jj+1, rlonv(1:ii), rlatu, &155 boundslon_reg, boundslat_reg)156 157 ! Generate global arrays on full physics grid158 ALLOCATE(latfi_glo(klon_glo),lonfi_glo(klon_glo))159 ALLOCATE(cufi_glo(klon_glo),cvfi_glo(klon_glo))160 ALLOCATE(airefi_glo(klon_glo))161 ALLOCATE(boundslonfi_glo(klon_glo,4))162 ALLOCATE(boundslatfi_glo(klon_glo,4))163 164 165 IF (klon_glo>1) THEN ! general case166 ! North pole167 latfi_glo(1)=rlatu(1)168 lonfi_glo(1)=0.169 cufi_glo(1) = cu(1)170 cvfi_glo(1) = cv(1)171 boundslonfi_glo(1,north_east)=0172 boundslatfi_glo(1,north_east)=PI/2173 boundslonfi_glo(1,north_west)=2*PI174 boundslatfi_glo(1,north_west)=PI/2175 boundslonfi_glo(1,south_west)=2*PI176 boundslatfi_glo(1,south_west)=rlatv(1)177 boundslonfi_glo(1,south_east)=0178 boundslatfi_glo(1,south_east)=rlatv(1)179 DO j=2,jj180 DO i=1,ii181 k=(j-2)*ii+1+i182 latfi_glo(k)= rlatu(j)183 lonfi_glo(k)= rlonv(i)184 cufi_glo(k) = cu((j-1)*(ii+1)+i)185 cvfi_glo(k) = cv((j-1)*(ii+1)+i)186 boundslonfi_glo(k,north_east)=rlonu(i)187 boundslatfi_glo(k,north_east)=rlatv(j-1)188 boundslonfi_glo(k,north_west)=rlonu(i+1)189 boundslatfi_glo(k,north_west)=rlatv(j-1)190 boundslonfi_glo(k,south_west)=rlonu(i+1)191 boundslatfi_glo(k,south_west)=rlatv(j)192 boundslonfi_glo(k,south_east)=rlonu(i)193 boundslatfi_glo(k,south_east)=rlatv(j)194 ENDDO195 ENDDO196 ! South pole197 latfi_glo(klon_glo)= rlatu(jj+1)198 lonfi_glo(klon_glo)= 0.199 cufi_glo(klon_glo) = cu((ii+1)*jj+1)200 cvfi_glo(klon_glo) = cv((ii+1)*jj-ii)201 boundslonfi_glo(klon_glo,north_east)= 0202 boundslatfi_glo(klon_glo,north_east)= rlatv(jj)203 boundslonfi_glo(klon_glo,north_west)= 2*PI204 boundslatfi_glo(klon_glo,north_west)= rlatv(jj)205 boundslonfi_glo(klon_glo,south_west)= 2*PI206 boundslatfi_glo(klon_glo,south_west)= -PI/2207 boundslonfi_glo(klon_glo,south_east)= 0208 boundslatfi_glo(klon_glo,south_east)= -Pi/2209 210 ! build airefi_glo(), mesh area on physics grid211 CALL gr_dyn_fi(1,ii+1,jj+1,klon_glo,aire,airefi_glo)212 ! Poles are single points on physics grid213 airefi_glo(1)=sum(aire(1:ii,1))214 airefi_glo(klon_glo)=sum(aire(1:ii,jj+1))215 216 ! Sanity check: do total planet area match between physics and dynamics?217 total_area_dyn=sum(aire(1:ii,1:jj+1))218 total_area_phy=sum(airefi_glo(1:klon_glo))219 IF (total_area_dyn/=total_area_phy) THEN220 WRITE (lunout, *) 'iniphysiq: planet total surface discrepancy !!!'221 WRITE (lunout, *) ' in the dynamics total_area_dyn=', total_area_dyn222 WRITE (lunout, *) ' but in the physics total_area_phy=', total_area_phy223 IF (abs(total_area_dyn-total_area_phy)>0.00001*total_area_dyn) THEN224 ! stop here if the relative difference is more than 0.001%225 abort_message = 'planet total surface discrepancy'226 CALL abort_gcm(modname, abort_message, 1)227 ENDIF228 ENDIF229 ELSE ! klon_glo==1, running the 1D model230 ! just copy over input values231 latfi_glo(1)=rlatu(1)232 lonfi_glo(1)=rlonv(1)233 cufi_glo(1)=cu(1)234 cvfi_glo(1)=cv(1)235 airefi_glo(1)=aire(1,1)236 boundslonfi_glo(1,north_east)=rlonu(1)237 boundslatfi_glo(1,north_east)=PI/2238 boundslonfi_glo(1,north_west)=rlonu(2)239 boundslatfi_glo(1,north_west)=PI/2240 boundslonfi_glo(1,south_west)=rlonu(2)241 boundslatfi_glo(1,south_west)=rlatv(1)242 boundslonfi_glo(1,south_east)=rlonu(1)243 boundslatfi_glo(1,south_east)=rlatv(1)244 ENDIF ! of IF (klon_glo>1)245 246 101 !$OMP PARALLEL DEFAULT(SHARED) COPYIN(/temps/) 247 ! Now generate local lon/lat/cu/cv/area/bounds arrays248 ALLOCATE(latfi(klon_omp),lonfi(klon_omp),cufi(klon_omp),cvfi(klon_omp))249 ALLOCATE(airefi(klon_omp))250 ALLOCATE(boundslonfi(klon_omp,4))251 ALLOCATE(boundslatfi(klon_omp,4))252 253 254 offset = klon_mpi_begin - 1255 airefi(1:klon_omp) = airefi_glo(offset+klon_omp_begin:offset+klon_omp_end)256 cufi(1:klon_omp) = cufi_glo(offset+klon_omp_begin:offset+klon_omp_end)257 cvfi(1:klon_omp) = cvfi_glo(offset+klon_omp_begin:offset+klon_omp_end)258 lonfi(1:klon_omp) = lonfi_glo(offset+klon_omp_begin:offset+klon_omp_end)259 latfi(1:klon_omp) = latfi_glo(offset+klon_omp_begin:offset+klon_omp_end)260 boundslonfi(1:klon_omp,:) = boundslonfi_glo(offset+klon_omp_begin:offset+klon_omp_end,:)261 boundslatfi(1:klon_omp,:) = boundslatfi_glo(offset+klon_omp_begin:offset+klon_omp_end,:)262 263 ! copy over local grid longitudes and latitudes264 CALL init_geometry(klon_omp,lonfi,latfi,boundslonfi,boundslatfi, &265 airefi,cufi,cvfi)266 102 267 103 ! copy over preff , ap(), bp(), etc
Note: See TracChangeset
for help on using the changeset viewer.