Changeset 2588 for LMDZ5/trunk/libf/dynphy_lonlat/phymar
- Timestamp:
- Jul 13, 2016, 8:54:39 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/dynphy_lonlat/phymar/iniphysiq_mod.F90
r2396 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 USE mod_phys_lmdz_para, ONLY: klon_omp, & ! number of columns (on local omp grid) 17 klon_omp_begin, & ! start index of local omp subgrid 18 klon_omp_end, & ! end index of local omp subgrid 19 klon_mpi_begin ! start indes of columns (on local mpi grid) 20 USE geometry_mod, ONLY : init_geometry 14 USE inigeomphy_mod, ONLY: inigeomphy 21 15 USE infotrac, ONLY: nqtot 22 16 USE comcstphy, ONLY: rradius, & ! planet radius (m) … … 24 18 rg, & ! gravity 25 19 rcpp ! specific heat of the atmosphere 26 ! USE phyaqua_mod, ONLY: iniaqua27 USE physics_distribution_mod, ONLY : init_physics_distribution28 USE regular_lonlat_mod, ONLY : init_regular_lonlat, &29 east, west, north, south, &30 north_east, north_west, &31 south_west, south_east32 USE mod_interface_dyn_phys, ONLY : init_interface_dyn_phys33 20 USE infotrac_phy, ONLY: init_infotrac_phy 34 21 USE nrtype, ONLY: pi … … 68 55 CHARACTER (LEN=20) :: modname='iniphysiq' 69 56 CHARACTER (LEN=80) :: abort_message 70 REAL :: total_area_phy, total_area_dyn71 72 ! boundaries, on global grid73 REAL,ALLOCATABLE :: boundslon_reg(:,:)74 REAL,ALLOCATABLE :: boundslat_reg(:,:)75 76 ! global array, on full physics grid:77 REAL,ALLOCATABLE :: latfi_glo(:)78 REAL,ALLOCATABLE :: lonfi_glo(:)79 REAL,ALLOCATABLE :: cufi_glo(:)80 REAL,ALLOCATABLE :: cvfi_glo(:)81 REAL,ALLOCATABLE :: airefi_glo(:)82 REAL,ALLOCATABLE :: boundslonfi_glo(:,:)83 REAL,ALLOCATABLE :: boundslatfi_glo(:,:)84 85 ! local arrays, on given MPI/OpenMP domain:86 REAL,ALLOCATABLE,SAVE :: latfi(:)87 REAL,ALLOCATABLE,SAVE :: lonfi(:)88 REAL,ALLOCATABLE,SAVE :: cufi(:)89 REAL,ALLOCATABLE,SAVE :: cvfi(:)90 REAL,ALLOCATABLE,SAVE :: airefi(:)91 REAL,ALLOCATABLE,SAVE :: boundslonfi(:,:)92 REAL,ALLOCATABLE,SAVE :: boundslatfi(:,:)93 !$OMP THREADPRIVATE (latfi,lonfi,cufi,cvfi,airefi,boundslonfi,boundslatfi)94 95 ! Initialize Physics distibution and parameters and interface with dynamics96 CALL init_physics_distribution(regular_lonlat,4, &97 nbp,ii,jj+1,nlayer,communicator)98 CALL init_interface_dyn_phys99 100 ! init regular global longitude-latitude grid points and boundaries101 ALLOCATE(boundslon_reg(ii,2))102 ALLOCATE(boundslat_reg(jj+1,2))103 104 DO i=1,ii105 boundslon_reg(i,east)=rlonu(i)106 boundslon_reg(i,west)=rlonu(i+1)107 ENDDO108 109 boundslat_reg(1,north)= PI/2110 boundslat_reg(1,south)= rlatv(1)111 DO j=2,jj112 boundslat_reg(j,north)=rlatv(j-1)113 boundslat_reg(j,south)=rlatv(j)114 ENDDO115 boundslat_reg(jj+1,north)= rlatv(jj)116 boundslat_reg(jj+1,south)= -PI/2117 118 ! Write values in module regular_lonlat_mod119 CALL init_regular_lonlat(ii,jj+1, rlonv(1:ii), rlatu, &120 boundslon_reg, boundslat_reg)121 122 ! Generate global arrays on full physics grid123 ALLOCATE(latfi_glo(klon_glo),lonfi_glo(klon_glo))124 ALLOCATE(cufi_glo(klon_glo),cvfi_glo(klon_glo))125 ALLOCATE(airefi_glo(klon_glo))126 ALLOCATE(boundslonfi_glo(klon_glo,4))127 ALLOCATE(boundslatfi_glo(klon_glo,4))128 129 IF (klon_glo>1) THEN ! general case130 ! North pole131 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)=0136 boundslatfi_glo(1,north_east)=PI/2137 boundslonfi_glo(1,north_west)=2*PI138 boundslatfi_glo(1,north_west)=PI/2139 boundslonfi_glo(1,south_west)=2*PI140 boundslatfi_glo(1,south_west)=rlatv(1)141 boundslonfi_glo(1,south_east)=0142 boundslatfi_glo(1,south_east)=rlatv(1)143 DO j=2,jj144 DO i=1,ii145 k=(j-2)*ii+1+i146 latfi_glo((j-2)*ii+1+i)= rlatu(j)147 lonfi_glo((j-2)*ii+1+i)= rlonv(i)148 cufi_glo((j-2)*ii+1+i) = cu((j-1)*(ii+1)+i)149 cvfi_glo((j-2)*ii+1+i) = cv((j-1)*(ii+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)158 ENDDO159 ENDDO160 ! South pole161 latfi_glo(klon_glo)= rlatu(jj+1)162 lonfi_glo(klon_glo)= 0.163 cufi_glo(klon_glo) = cu((ii+1)*jj+1)164 cvfi_glo(klon_glo) = cv((ii+1)*jj-ii)165 boundslonfi_glo(klon_glo,north_east)= 0166 boundslatfi_glo(klon_glo,north_east)= rlatv(jj)167 boundslonfi_glo(klon_glo,north_west)= 2*PI168 boundslatfi_glo(klon_glo,north_west)= rlatv(jj)169 boundslonfi_glo(klon_glo,south_west)= 2*PI170 boundslatfi_glo(klon_glo,south_west)= -PI/2171 boundslonfi_glo(klon_glo,south_east)= 0172 boundslatfi_glo(klon_glo,south_east)= -Pi/2173 174 ! build airefi(), mesh area on physics grid175 CALL gr_dyn_fi(1,ii+1,jj+1,klon_glo,aire,airefi_glo)176 ! Poles are single points on physics grid177 airefi_glo(1)=sum(aire(1:ii,1))178 airefi_glo(klon_glo)=sum(aire(1:ii,jj+1))179 180 ! Sanity check: do total planet area match between physics and dynamics?181 total_area_dyn=sum(aire(1:ii,1:jj+1))182 total_area_phy=sum(airefi_glo(1:klon_glo))183 IF (total_area_dyn/=total_area_phy) THEN184 WRITE (lunout, *) 'iniphysiq: planet total surface discrepancy !!!'185 WRITE (lunout, *) ' in the dynamics total_area_dyn=', total_area_dyn186 WRITE (lunout, *) ' but in the physics total_area_phy=', total_area_phy187 IF (abs(total_area_dyn-total_area_phy)>0.00001*total_area_dyn) THEN188 ! stop here if the relative difference is more than 0.001%189 abort_message = 'planet total surface discrepancy'190 CALL abort_gcm(modname, abort_message, 1)191 ENDIF192 ENDIF193 ELSE ! klon_glo==1, running the 1D model194 ! just copy over input values195 latfi_glo(1)=rlatu(1)196 lonfi_glo(1)=rlonv(1)197 cufi_glo(1)=cu(1)198 cvfi_glo(1)=cv(1)199 airefi_glo(1)=aire(1,1)200 boundslonfi_glo(1,north_east)=rlonu(1)201 boundslatfi_glo(1,north_east)=PI/2202 boundslonfi_glo(1,north_west)=rlonu(2)203 boundslatfi_glo(1,north_west)=PI/2204 boundslonfi_glo(1,south_west)=rlonu(2)205 boundslatfi_glo(1,south_west)=rlatv(1)206 boundslonfi_glo(1,south_east)=rlonu(1)207 boundslatfi_glo(1,south_east)=rlatv(1)208 ENDIF ! of IF (klon_glo>1)209 210 !$OMP PARALLEL211 ! Now generate local lon/lat/cu/cv/area/bounds arrays212 ALLOCATE(latfi(klon_omp),lonfi(klon_omp),cufi(klon_omp),cvfi(klon_omp))213 ALLOCATE(airefi(klon_omp))214 ALLOCATE(boundslonfi(klon_omp,4))215 ALLOCATE(boundslatfi(klon_omp,4))216 57 217 58 218 offset = klon_mpi_begin - 1 219 airefi(1:klon_omp) = airefi_glo(offset+klon_omp_begin:offset+klon_omp_end) 220 cufi(1:klon_omp) = cufi_glo(offset+klon_omp_begin:offset+klon_omp_end) 221 cvfi(1:klon_omp) = cvfi_glo(offset+klon_omp_begin:offset+klon_omp_end) 222 lonfi(1:klon_omp) = lonfi_glo(offset+klon_omp_begin:offset+klon_omp_end) 223 latfi(1:klon_omp) = latfi_glo(offset+klon_omp_begin:offset+klon_omp_end) 224 boundslonfi(1:klon_omp,:) = boundslonfi_glo(offset+klon_omp_begin:offset+klon_omp_end,:) 225 boundslatfi(1:klon_omp,:) = boundslatfi_glo(offset+klon_omp_begin:offset+klon_omp_end,:) 59 ! --> initialize physics distribution, global fields and geometry 60 ! (i.e. things in phy_common or dynphy_lonlat) 61 CALL inigeomphy(ii,jj,nlayer, & 62 nbp, communicator, & 63 rlatu,rlatv, & 64 rlonu,rlonv, & 65 aire,cu,cv) 226 66 227 ! copy over local grid longitudes and latitudes 228 CALL init_geometry(klon_omp,lonfi,latfi,boundslonfi,boundslatfi, & 229 airefi,cufi,cvfi) 230 67 ! --> now initialize things specific to the phymar physics package 68 69 !$OMP PARALLEL 231 70 232 71 ! Initialize tracer names, numbers, etc. for physics
Note: See TracChangeset
for help on using the changeset viewer.