Changeset 2594 for LMDZ5/branches/testing/libf/dynphy_lonlat/phydev
- Timestamp:
- Jul 18, 2016, 9:41:10 PM (8 years ago)
- Location:
- LMDZ5/branches/testing
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/branches/testing
- Property svn:mergeinfo changed
/LMDZ5/trunk merged: 2547-2567,2569,2571-2574,2576-2589
- Property svn:mergeinfo changed
-
LMDZ5/branches/testing/libf/dynphy_lonlat/phydev/iniphysiq_mod.F90
r2435 r2594 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 15 USE mod_phys_lmdz_para, ONLY: klon_omp ! number of columns (on local omp grid) 21 16 USE infotrac, ONLY: nqtot, type_trac 22 17 USE infotrac_phy, ONLY: init_infotrac_phy 23 ! USE comcstphy, ONLY: rradius, & ! planet radius (m)24 ! rr, & ! recuced gas constant: R/molar mass of atm25 ! rg, & ! gravity26 ! rcpp ! specific heat of the atmosphere27 18 USE inifis_mod, ONLY: inifis 28 19 USE phyaqua_mod, ONLY: iniaqua 29 USE physics_distribution_mod, ONLY : init_physics_distribution30 USE regular_lonlat_mod, ONLY : init_regular_lonlat, &31 east, west, north, south, &32 north_east, north_west, &33 south_west, south_east34 USE mod_interface_dyn_phys, ONLY : init_interface_dyn_phys35 20 USE nrtype, ONLY: pi 36 21 IMPLICIT NONE … … 69 54 CHARACTER (LEN=20) :: modname='iniphysiq' 70 55 CHARACTER (LEN=80) :: abort_message 71 REAL :: total_area_phy, total_area_dyn72 56 73 ! boundaries, on global grid74 REAL,ALLOCATABLE :: boundslon_reg(:,:)75 REAL,ALLOCATABLE :: boundslat_reg(:,:)76 57 77 ! global array, on full physics grid: 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(:,:) 58 ! --> initialize physics distribution, global fields and geometry 59 ! (i.e. things in phy_common or dynphy_lonlat) 60 CALL inigeomphy(iim,jjm,nlayer, & 61 nbp, communicator, & 62 rlatu,rlatv, & 63 rlonu,rlonv, & 64 aire,cu,cv) 85 65 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 100 101 ! init regular global longitude-latitude grid points and boundaries 102 ALLOCATE(boundslon_reg(iim,2)) 103 ALLOCATE(boundslat_reg(jjm+1,2)) 104 105 DO i=1,iim 106 boundslon_reg(i,east)=rlonu(i) 107 boundslon_reg(i,west)=rlonu(i+1) 108 ENDDO 109 110 boundslat_reg(1,north)= PI/2 111 boundslat_reg(1,south)= rlatv(1) 112 DO j=2,jjm 113 boundslat_reg(j,north)=rlatv(j-1) 114 boundslat_reg(j,south)=rlatv(j) 115 ENDDO 116 boundslat_reg(jjm+1,north)= rlatv(jjm) 117 boundslat_reg(jjm+1,south)= -PI/2 118 119 ! Write values in module regular_lonlat_mod 120 CALL init_regular_lonlat(iim,jjm+1, rlonv(1:iim), rlatu, & 121 boundslon_reg, boundslat_reg) 122 123 ! Generate global arrays on full physics grid 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)) 129 130 ! North pole 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) 143 DO j=2,jjm 144 DO i=1,iim 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) 158 ENDDO 159 ENDDO 160 ! South pole 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 173 174 ! build airefi(), mesh area on physics grid 175 CALL gr_dyn_fi(1,iim+1,jjm+1,klon_glo,aire,airefi_glo) 176 ! Poles are single points on physics grid 177 airefi_glo(1)=sum(aire(1:iim,1)) 178 airefi_glo(klon_glo)=sum(aire(1:iim,jjm+1)) 179 180 ! Sanity check: do total planet area match between physics and dynamics? 181 total_area_dyn=sum(aire(1:iim,1:jjm+1)) 182 total_area_phy=sum(airefi_glo(1:klon_glo)) 183 IF (total_area_dyn/=total_area_phy) THEN 184 WRITE (lunout, *) 'iniphysiq: planet total surface discrepancy !!!' 185 WRITE (lunout, *) ' in the dynamics total_area_dyn=', total_area_dyn 186 WRITE (lunout, *) ' but in the physics total_area_phy=', total_area_phy 187 IF (abs(total_area_dyn-total_area_phy)>0.00001*total_area_dyn) THEN 188 ! 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 ENDIF 192 ENDIF 66 ! --> now initialize things specific to the phydev physics package 193 67 194 68 !$OMP PARALLEL 195 ! Now generate local lon/lat/cu/cv/area/bounds arrays196 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 - 1203 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 latitudes212 CALL init_geometry(klon_omp,lonfi,latfi,boundslonfi,boundslatfi, &213 airefi,cufi,cvfi)214 69 215 70 ! Initialize physical constants in physics:
Note: See TracChangeset
for help on using the changeset viewer.